{
  "version": "0.1.0",
  "scanTitle": "SCAN: barcelona.cat",
  "issueNumber": 36,
  "generatedAt": "2026-04-13T23:02:52.029Z",
  "requestedUrls": [
    "https://barcelona.cat/",
    "https://barcelona.cat/en/living-in-bcn/accessibility",
    "https://barcelona.cat/en/what-to-do-in-bcn/bathing-and-beaches/accessibility",
    "https://barcelona.cat/en/what-to-do-in-bcn/montjuic-park/find-out-about-montjuic-park-council",
    "https://barcelona.cat/ca",
    "https://barcelona.cat/en",
    "https://barcelona.cat/es",
    "https://barcelona.cat/ca/canelons",
    "https://barcelona.cat/ca/coneixbcn",
    "https://barcelona.cat/ca/diada-nacional-de-catalunya-2022",
    "https://barcelona.cat/ca/implicat",
    "https://barcelona.cat/ca/pagina-imatge-promocional",
    "https://barcelona.cat/ca/prova-video",
    "https://barcelona.cat/ca/que-pots-fer-a-bcn",
    "https://barcelona.cat/ca/treball-i-empresa",
    "https://barcelona.cat/ca/viure-a-bcn",
    "https://barcelona.cat/en/catalan-national-day-2022",
    "https://barcelona.cat/en/discoverbcn",
    "https://barcelona.cat/en/getinvolved",
    "https://barcelona.cat/en/living-in-bcn",
    "https://barcelona.cat/en/pagina-exemple-mapa-sant-jordi",
    "https://barcelona.cat/en/what-to-do-in-bcn",
    "https://barcelona.cat/es/conocebcn",
    "https://barcelona.cat/es/diada-nacional-de-cataluna-2022",
    "https://barcelona.cat/es/implicate",
    "https://barcelona.cat/es/que-hacer-en-bcn",
    "https://barcelona.cat/es/trabajo-y-empresa",
    "https://barcelona.cat/es/vivir-en-bcn",
    "https://barcelona.cat/es/aviso-legal/banoasistido",
    "https://barcelona.cat/es/blogoteca/condiciones-uso",
    "https://barcelona.cat/es/conocebcn/la-ciutadella-del-conocimiento",
    "https://barcelona.cat/es/que-hacer-en-bcn/banos-y-playas/actividades-deportivas-organizadas-por-deportistas-federados",
    "https://barcelona.cat/en/what-to-do-in-bcn/montjuic-park/news",
    "https://barcelona.cat/en/what-to-do-in-bcn/parks-and-gardens/belvederes",
    "https://barcelona.cat/en/discoverbcn/pics",
    "https://barcelona.cat/es/vivir-en-bcn/vive-el-barrio",
    "https://barcelona.cat/ca/viure-a-bcn/diada/transports-publics-durant-la-diada-2024",
    "https://barcelona.cat/en/what-to-do-in-bcn/magic-fountain/history",
    "https://barcelona.cat/es/conocebcn/ciutadelladelconocimiento/biblioteca-central",
    "https://barcelona.cat/en/what-to-do-in-bcn/festes-majors",
    "https://barcelona.cat/ca/viure-a-bcn/amb-nens-i-nenes/lleure/llistat-de-ludotecas",
    "https://barcelona.cat/en/what-to-do-in-bcn/parks-and-gardens/childrens-play-areas",
    "https://barcelona.cat/ca/que-pots-fer-a-bcn/estiu/refrescat-a-les-piscines-municipals",
    "https://barcelona.cat/es/que-hacer-en-bcn/banos-y-playas/playa-de-sant-miquel",
    "https://barcelona.cat/ca/que-pots-fer-a-bcn/parcs-i-jardins/parcs-forestals",
    "https://barcelona.cat/en/what-to-do-in-bcn/summer/outdoor-films",
    "https://barcelona.cat/es/que-hacer-en-bcn/banos-y-playas/zona-de-banos-del-forum",
    "https://barcelona.cat/en/discoverbcn/ciutadella-knowledge-hub/heritage-and-science-hub",
    "https://barcelona.cat/es/que-hacer-en-bcn/cultura/teatros",
    "https://barcelona.cat/capdesetmana/ca/",
    "https://barcelona.cat/es/vivir-en-bcn/diada",
    "https://barcelona.cat/en/living-in-bcn/pets",
    "https://barcelona.cat/es/que-hacer-en-bcn/banos-y-playas/deporte-en-las-playas/pesca",
    "https://barcelona.cat/en/what-to-do-in-bcn/get-fit/sports-facilities",
    "https://barcelona.cat/ca/que-pots-fer-a-bcn/banys-i-platges/esport-les-platges",
    "https://barcelona.cat/ca/que-pots-fer-a-bcn/cultura",
    "https://barcelona.cat/es/vivir-en-bcn/con-accesibilidad",
    "https://barcelona.cat/en/what-to-do-in-bcn/montjuic-park/activities/list",
    "https://barcelona.cat/es/vivir-en-bcn/medio-ambiente-y-sostenibilidad",
    "https://barcelona.cat/en/what-to-do-in-bcn/bathing-and-beaches/dogs-area",
    "https://barcelona.cat/en/living-in-bcn/diada",
    "https://barcelona.cat/es/conocebcn/la-historia/la-barcino-romana",
    "https://barcelona.cat/en/what-to-do-in-bcn/culture/cinemas",
    "https://barcelona.cat/en/what-to-do-in-bcn/magic-fountain/choreographies-magic-fountain",
    "https://barcelona.cat/es/vivir-en-bcn/con-ninos-y-ninas",
    "https://barcelona.cat/en/discoverbcn/la-ciutadella-knowledge-hub/news",
    "https://barcelona.cat/ca/que-pots-fer-a-bcn/banys-i-platges",
    "https://barcelona.cat/ca/que-pots-fer-a-bcn/banys-i-platges/platges-sense-residus",
    "https://barcelona.cat/es/que-hacer-en-bcn/parque-montjuic/noticias",
    "https://barcelona.cat/ca/que-pots-fer-a-bcn/banys-i-platges/zona-de-banys-del-forum",
    "https://barcelona.cat/es/que-hacer-en-bcn/ponte-en-forma/clubs-asociaciones-y-penas",
    "https://barcelona.cat/en/what-to-do-in-bcn/bathing-and-beaches/sant-sebastia-beach",
    "https://barcelona.cat/en/what-to-do-in-bcn/magic-fountain/how-it-works",
    "https://barcelona.cat/ca/que-pots-fer-a-bcn/banys-i-platges/historia-de-les-platges",
    "https://barcelona.cat/es/que-hacer-en-bcn/fuente-magica/horarios-de-la-fuente-magica",
    "https://barcelona.cat/en/what-to-do-in-bcn/culture/theatres",
    "https://barcelona.cat/ca/que-pots-fer-a-bcn/cultura/auditoris",
    "https://barcelona.cat/en/what-to-do-in-bcn/bathing-and-beaches/sports-activities-organised-federated-athletes-entities",
    "https://barcelona.cat/es/conocebcn/la-ciutadella-del-conocimiento/noticias",
    "https://barcelona.cat/ca/que-pots-fer-a-bcn/estiu/oficines-de-tramitacio-del-dni-i-passaport",
    "https://barcelona.cat/es/que-hacer-en-bcn/banos-y-playas/playa-de-somorrostro",
    "https://barcelona.cat/es/que-hacer-en-bcn/ponte-en-forma/federaciones",
    "https://barcelona.cat/ca/que-pots-fer-a-bcn/banys-i-platges/activitats-esportives-organitzades-amb-anim-de-lucre",
    "https://barcelona.cat/en/discoverbcn/ciutadella-knowledge-hub/greenhouse/history",
    "https://barcelona.cat/ca/que-pots-fer-a-bcn/posat-en-forma/installacions-esportives",
    "https://barcelona.cat/ca/que-pots-fer-a-bcn/llistat",
    "https://barcelona.cat/en/what-to-do-in-bcn/summer/municipal-tax-office",
    "https://barcelona.cat/en/living-in-bcn/environment-and-sustainability/list-containers",
    "https://barcelona.cat/en/living-in-bcn/catalan-national-day-2019/public-transport-11-september-2022-catalan-national-day",
    "https://barcelona.cat/ca/que-pots-fer-a-bcn/banys-i-platges/barcelona-platja-platja",
    "https://barcelona.cat/es/que-hacer-en-bcn/banos-y-playas/historia-de-las-playas",
    "https://barcelona.cat/es/que-hacer-en-bcn/parques-y-jardines/parques-forestales",
    "https://barcelona.cat/es/vivir-en-bcn/con-personas-mayores/vivir-con-tranquilidad",
    "https://barcelona.cat/es/que-hacer-en-bcn/ponte-en-forma/clubes",
    "https://barcelona.cat/en/what-to-do-in-bcn/parks-and-gardens/history",
    "https://barcelona.cat/es/que-hacer-en-bcn/parque-montjuic/conoce-el-consejo-del-parque-de-montjuic",
    "https://barcelona.cat/ca/viure-a-bcn/amb-nens-i-nenes",
    "https://barcelona.cat/es/conocebcn/la-historia/la-barcelona-contemporanea",
    "https://barcelona.cat/en/discoverbcn/ciutadella-knowledge-hub/transformation-park",
    "https://barcelona.cat/es/conocebcn/ciutadelladelconocimiento/polo-de-biociencia-del-csic"
  ],
  "summary": {
    "okCount": 100,
    "errorCount": 0,
    "averagePerformanceScore": 0.5922999999999999,
    "averageBestPracticesScore": 0.9771,
    "totalTransferBytes": 199162148,
    "totalCo2Grams": 76.29531448284725,
    "averageTransferBytes": 1991621.48,
    "averageCo2GramsPerPage": 0.7629531448284724,
    "averageRedundancyScore": 22.47,
    "highUrgencyRedundancyCount": 5,
    "averageModularizationScore": 27.38,
    "highUrgencyModularizationCount": 36,
    "averageDeadCodeScore": 7.85,
    "highUrgencyDeadCodeCount": 8,
    "averageNonCriticalResourcesScore": 19.23,
    "highUrgencyNonCriticalResourcesCount": 87,
    "averageFormValidationScore": 62.35,
    "highUrgencyFormValidationCount": 92,
    "averageMetadataScore": 7.55,
    "highUrgencyMetadataCount": 0,
    "averageLayoutAdaptationScore": 31.52,
    "highUrgencyLayoutAdaptationCount": 0,
    "averageSecurityLightScore": 59,
    "highUrgencySecurityLightCount": 0,
    "averageDependencyMaintenanceScore": 10,
    "highUrgencyDependencyMaintenanceCount": 0,
    "averageExpectedFilesScore": 25,
    "highUrgencyExpectedFilesCount": 0,
    "averageCompressionScore": 59.85,
    "highUrgencyCompressionCount": 47,
    "averageOptimizationScore": 100,
    "highUrgencyOptimizationCount": 100,
    "averageOfflineSupportScore": 100,
    "highUrgencyOfflineSupportCount": 100,
    "averageLanguageVersionScore": 0,
    "highUrgencyLanguageVersionCount": 0,
    "averageMediaHintsScore": 35.95,
    "highUrgencyMediaHintsCount": 0,
    "distinctSiteCount": 1,
    "singleSiteScan": true,
    "greenWeb": {
      "pageHostsChecked": 100,
      "pageHostsGreen": 0,
      "pageHostsNotGreen": 100,
      "pageHostsUnknown": 0,
      "externalOriginsChecked": 18,
      "externalOriginsGreen": 8,
      "externalOriginsNotGreen": 10,
      "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": 1991621.48,
      "averageCo2GramsPerPage": 0.7629531448284724,
      "transferRating": "E",
      "co2Rating": "F"
    },
    "recommendedBudget": {
      "targetRating": "B",
      "maxTransferBytesPerPage": 999270.4,
      "maxCo2GramsPerPage": 0.145
    },
    "reductionsNeeded": {
      "transferBytesPerPage": {
        "absolute": 992351.08,
        "percent": 49.826289280631784,
        "needsReduction": true
      },
      "co2GramsPerPage": {
        "absolute": 0.6179531448284724,
        "percent": 80.99490106530736,
        "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": 66.35,
    "highUrgencyPages": 99,
    "assessedPages": 100,
    "providers": [
      {
        "hostname": "cdn.lawwwing.com",
        "pageCount": 100,
        "transferBytes": 3174589,
        "requestCount": 100,
        "status": "green",
        "hostedBy": "Hetzner Online GmbH"
      },
      {
        "hostname": "ajuntament.barcelona.cat",
        "pageCount": 100,
        "transferBytes": 1296673,
        "requestCount": 233,
        "status": "not-green",
        "hostedBy": null
      },
      {
        "hostname": "plausible.io",
        "pageCount": 100,
        "transferBytes": 286096,
        "requestCount": 116,
        "status": "not-green",
        "hostedBy": null
      },
      {
        "hostname": "cdn.matomo.cloud",
        "pageCount": 99,
        "transferBytes": 7848113,
        "requestCount": 103,
        "status": "not-green",
        "hostedBy": null
      },
      {
        "hostname": "stackpath.bootstrapcdn.com",
        "pageCount": 99,
        "transferBytes": 1540991,
        "requestCount": 99,
        "status": "green",
        "hostedBy": "Cloudflare"
      },
      {
        "hostname": "code.jquery.com",
        "pageCount": 99,
        "transferBytes": 542910,
        "requestCount": 99,
        "status": "not-green",
        "hostedBy": null
      },
      {
        "hostname": "dadesbcn.matomo.cloud",
        "pageCount": 99,
        "transferBytes": 28781,
        "requestCount": 107,
        "status": "not-green",
        "hostedBy": null
      },
      {
        "hostname": "cdnjs.cloudflare.com",
        "pageCount": 31,
        "transferBytes": 506703,
        "requestCount": 31,
        "status": "green",
        "hostedBy": "Cloudflare"
      },
      {
        "hostname": "www.youtube.com",
        "pageCount": 10,
        "transferBytes": 110707,
        "requestCount": 20,
        "status": "green",
        "hostedBy": "Google Cloud"
      },
      {
        "hostname": "maps.googleapis.com",
        "pageCount": 6,
        "transferBytes": 1968431,
        "requestCount": 46,
        "status": "green",
        "hostedBy": "Google Cloud"
      },
      {
        "hostname": "geoportal.barcelona.cat",
        "pageCount": 5,
        "transferBytes": 82080,
        "requestCount": 11,
        "status": "not-green",
        "hostedBy": null
      },
      {
        "hostname": "mobile.com-shi-va.barcelona.cat",
        "pageCount": 4,
        "transferBytes": 2907961,
        "requestCount": 16,
        "status": "not-green",
        "hostedBy": null
      }
    ]
  },
  "externalProviderRiskSummary": {
    "recurringNonGreenProviders": [
      {
        "hostname": "ajuntament.barcelona.cat",
        "status": "not-green",
        "hostedBy": null,
        "pageCount": 100,
        "requestCount": 454,
        "transferBytes": 1733953,
        "resourceTypes": [
          "script",
          "stylesheet"
        ],
        "riskScore": 100
      },
      {
        "hostname": "cdn.matomo.cloud",
        "status": "not-green",
        "hostedBy": null,
        "pageCount": 99,
        "requestCount": 103,
        "transferBytes": 7848113,
        "resourceTypes": [
          "script"
        ],
        "riskScore": 100
      },
      {
        "hostname": "code.jquery.com",
        "status": "not-green",
        "hostedBy": null,
        "pageCount": 99,
        "requestCount": 99,
        "transferBytes": 542910,
        "resourceTypes": [
          "script"
        ],
        "riskScore": 100
      },
      {
        "hostname": "mobile.com-shi-va.barcelona.cat",
        "status": "not-green",
        "hostedBy": null,
        "pageCount": 4,
        "requestCount": 20,
        "transferBytes": 3791601,
        "resourceTypes": [
          "script",
          "stylesheet"
        ],
        "riskScore": 97
      },
      {
        "hostname": "com-shi-va.barcelona.cat",
        "status": "not-green",
        "hostedBy": null,
        "pageCount": 4,
        "requestCount": 20,
        "transferBytes": 2453148,
        "resourceTypes": [
          "script",
          "stylesheet"
        ],
        "riskScore": 97
      },
      {
        "hostname": "plausible.io",
        "status": "not-green",
        "hostedBy": null,
        "pageCount": 100,
        "requestCount": 116,
        "transferBytes": 286096,
        "resourceTypes": [
          "script"
        ],
        "riskScore": 93
      },
      {
        "hostname": "releases.jquery.com",
        "status": "not-green",
        "hostedBy": null,
        "pageCount": 4,
        "requestCount": 4,
        "transferBytes": 506659,
        "resourceTypes": [
          "script"
        ],
        "riskScore": 90
      },
      {
        "hostname": "geoportal.barcelona.cat",
        "status": "not-green",
        "hostedBy": null,
        "pageCount": 5,
        "requestCount": 11,
        "transferBytes": 82080,
        "resourceTypes": [
          "script"
        ],
        "riskScore": 87
      },
      {
        "hostname": "dadesbcn.matomo.cloud",
        "status": "not-green",
        "hostedBy": null,
        "pageCount": 99,
        "requestCount": 107,
        "transferBytes": 28781,
        "resourceTypes": [
          "script"
        ],
        "riskScore": 86
      }
    ],
    "nonGreenProviders": [
      {
        "hostname": "ajuntament.barcelona.cat",
        "status": "not-green",
        "hostedBy": null,
        "pageCount": 100,
        "requestCount": 454,
        "transferBytes": 1733953,
        "resourceTypes": [
          "script",
          "stylesheet"
        ],
        "riskScore": 100
      },
      {
        "hostname": "cdn.matomo.cloud",
        "status": "not-green",
        "hostedBy": null,
        "pageCount": 99,
        "requestCount": 103,
        "transferBytes": 7848113,
        "resourceTypes": [
          "script"
        ],
        "riskScore": 100
      },
      {
        "hostname": "code.jquery.com",
        "status": "not-green",
        "hostedBy": null,
        "pageCount": 99,
        "requestCount": 99,
        "transferBytes": 542910,
        "resourceTypes": [
          "script"
        ],
        "riskScore": 100
      },
      {
        "hostname": "mobile.com-shi-va.barcelona.cat",
        "status": "not-green",
        "hostedBy": null,
        "pageCount": 4,
        "requestCount": 20,
        "transferBytes": 3791601,
        "resourceTypes": [
          "script",
          "stylesheet"
        ],
        "riskScore": 97
      },
      {
        "hostname": "com-shi-va.barcelona.cat",
        "status": "not-green",
        "hostedBy": null,
        "pageCount": 4,
        "requestCount": 20,
        "transferBytes": 2453148,
        "resourceTypes": [
          "script",
          "stylesheet"
        ],
        "riskScore": 97
      },
      {
        "hostname": "plausible.io",
        "status": "not-green",
        "hostedBy": null,
        "pageCount": 100,
        "requestCount": 116,
        "transferBytes": 286096,
        "resourceTypes": [
          "script"
        ],
        "riskScore": 93
      },
      {
        "hostname": "releases.jquery.com",
        "status": "not-green",
        "hostedBy": null,
        "pageCount": 4,
        "requestCount": 4,
        "transferBytes": 506659,
        "resourceTypes": [
          "script"
        ],
        "riskScore": 90
      },
      {
        "hostname": "geoportal.barcelona.cat",
        "status": "not-green",
        "hostedBy": null,
        "pageCount": 5,
        "requestCount": 11,
        "transferBytes": 82080,
        "resourceTypes": [
          "script"
        ],
        "riskScore": 87
      },
      {
        "hostname": "dadesbcn.matomo.cloud",
        "status": "not-green",
        "hostedBy": null,
        "pageCount": 99,
        "requestCount": 107,
        "transferBytes": 28781,
        "resourceTypes": [
          "script"
        ],
        "riskScore": 86
      },
      {
        "hostname": "www.bcn.cat",
        "status": "not-green",
        "hostedBy": null,
        "pageCount": 1,
        "requestCount": 1,
        "transferBytes": 33673,
        "resourceTypes": [
          "script"
        ],
        "riskScore": 46
      }
    ],
    "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": 14,
    "totalOccurrences": 281,
    "reusedFromCacheCount": 135,
    "recurringElements": [
      {
        "signature": "form|get|/en|input|text|query|no-autocomplete|optional|no-pattern|no-minlength",
        "role": "form",
        "controlType": "text",
        "fieldName": "query",
        "score": 60,
        "urgency": "high",
        "pageCount": 36,
        "occurrenceCount": 36
      },
      {
        "signature": "form|get|/es/|input|text|query|no-autocomplete|optional|no-pattern|no-minlength",
        "role": "form",
        "controlType": "text",
        "fieldName": "query",
        "score": 60,
        "urgency": "high",
        "pageCount": 35,
        "occurrenceCount": 35
      },
      {
        "signature": "form|get|/ca|input|text|query|no-autocomplete|optional|no-pattern|no-minlength",
        "role": "form",
        "controlType": "text",
        "fieldName": "query",
        "score": 60,
        "urgency": "high",
        "pageCount": 31,
        "occurrenceCount": 31
      },
      {
        "signature": "no-form|select|select|anonymous|no-autocomplete|optional|no-pattern|no-minlength",
        "role": "form",
        "controlType": "select",
        "fieldName": null,
        "score": 90,
        "urgency": "high",
        "pageCount": 22,
        "occurrenceCount": 22
      },
      {
        "signature": "form|get|self|input|checkbox|anonymous|no-autocomplete|optional|no-pattern|no-minlength",
        "role": "form",
        "controlType": "checkbox",
        "fieldName": null,
        "score": 50,
        "urgency": "medium",
        "pageCount": 5,
        "occurrenceCount": 5
      },
      {
        "signature": "region|get|self|select|select|actualitat-nr|no-autocomplete|optional|no-pattern|no-minlength",
        "role": "form",
        "controlType": "select",
        "fieldName": "actualitat-nr",
        "score": 50,
        "urgency": "medium",
        "pageCount": 4,
        "occurrenceCount": 4
      },
      {
        "signature": "region|get|self|input|date|datefrom|off|optional|no-pattern|no-minlength",
        "role": "form",
        "controlType": "date",
        "fieldName": "datefrom",
        "score": 20,
        "urgency": "low",
        "pageCount": 4,
        "occurrenceCount": 4
      },
      {
        "signature": "region|get|self|input|date|dateto|off|optional|no-pattern|no-minlength",
        "role": "form",
        "controlType": "date",
        "fieldName": "dateto",
        "score": 20,
        "urgency": "low",
        "pageCount": 4,
        "occurrenceCount": 4
      },
      {
        "signature": "no-form|input|search|ajuntament-maps-cercador-mapa|no-autocomplete|optional|no-pattern|no-minlength",
        "role": "form",
        "controlType": "search",
        "fieldName": "ajuntament-maps-cercador-mapa",
        "score": 60,
        "urgency": "high",
        "pageCount": 2,
        "occurrenceCount": 2
      },
      {
        "signature": "form|get|self|input|checkbox|districte|no-autocomplete|optional|no-pattern|no-minlength",
        "role": "form",
        "controlType": "checkbox",
        "fieldName": "districte",
        "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": 100,
    "averageScore": 7.55,
    "highUrgencyPages": 0,
    "missing": {
      "missingLang": 0,
      "missingDescription": 30,
      "missingCanonical": 0,
      "missingOpenGraphCore": 30,
      "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": 100,
    "averageScore": 31.52,
    "highUrgencyPages": 0,
    "mobileOverflowPages": 0,
    "tabletOverflowPages": 0,
    "totalMobileSmallTapTargets": 4868,
    "totalTabletSmallTapTargets": 4557,
    "totalFixedWidthOffenders": 73
  },
  "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": 100,
    "averageScore": 59,
    "highUrgencyPages": 0,
    "pagesWithoutCsp": 100,
    "pagesWithoutHsts": 100,
    "pagesWithVulnerableLibraries": 0,
    "totalExternalScriptsWithoutIntegrity": 746
  },
  "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": 100,
    "averageScore": 10,
    "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": 100,
    "averageScore": 25,
    "highUrgencyPages": 0,
    "missing": {
      "robotsTxt": 0,
      "sitemapXml": 0,
      "securityTxt": 100,
      "webManifest": 100,
      "favicon": 0
    }
  },
  "compressionSummary": {
    "wsgReference": {
      "title": "Reduce data transfer with compression",
      "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
    },
    "assessedPages": 100,
    "averageScore": 59.85,
    "highUrgencyPages": 47,
    "pagesMissingTextCompression": 15,
    "totalEstimatedSavingsBytes": 139930623.59999993,
    "recurringOpportunities": [
      {
        "id": "modern-image-formats",
        "title": "Use modern image compression formats",
        "urgency": "high",
        "pageCount": 100,
        "totalEstimatedSavingsBytes": 82547754.59999993
      },
      {
        "id": "uses-optimized-images",
        "title": "Improve image encoding quality/size",
        "urgency": "high",
        "pageCount": 100,
        "totalEstimatedSavingsBytes": 56535750
      },
      {
        "id": "uses-text-compression",
        "title": "Enable Brotli/gzip for text assets",
        "urgency": "medium",
        "pageCount": 15,
        "totalEstimatedSavingsBytes": 459096
      },
      {
        "id": "unminified-javascript",
        "title": "Minify JavaScript before transfer",
        "urgency": "high",
        "pageCount": 8,
        "totalEstimatedSavingsBytes": 373352
      },
      {
        "id": "unminified-css",
        "title": "Minify CSS before transfer",
        "urgency": "low",
        "pageCount": 4,
        "totalEstimatedSavingsBytes": 14671
      }
    ]
  },
  "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": 100,
    "averageScore": 100,
    "highUrgencyPages": 100,
    "totalEstimatedSavingsBytes": 184080987.6,
    "totalEstimatedBlockingMs": 150288,
    "recurringOpportunities": [
      {
        "id": "modern-image-formats",
        "title": "Serve images in next-gen formats",
        "pageCount": 100,
        "totalEstimatedSavingsBytes": 82547754.59999993,
        "totalEstimatedBlockingMs": 0
      },
      {
        "id": "uses-optimized-images",
        "title": "Compress oversized image assets",
        "pageCount": 100,
        "totalEstimatedSavingsBytes": 56535750,
        "totalEstimatedBlockingMs": 0
      },
      {
        "id": "offscreen-images",
        "title": "Lazy-load offscreen images",
        "pageCount": 100,
        "totalEstimatedSavingsBytes": 14763726,
        "totalEstimatedBlockingMs": 0
      },
      {
        "id": "unused-javascript",
        "title": "Remove unused JavaScript",
        "pageCount": 100,
        "totalEstimatedSavingsBytes": 13506657,
        "totalEstimatedBlockingMs": 0
      },
      {
        "id": "unused-css-rules",
        "title": "Remove unused CSS",
        "pageCount": 100,
        "totalEstimatedSavingsBytes": 9519046,
        "totalEstimatedBlockingMs": 0
      },
      {
        "id": "render-blocking-resources",
        "title": "Eliminate render-blocking resources",
        "pageCount": 100,
        "totalEstimatedSavingsBytes": 0,
        "totalEstimatedBlockingMs": 150288
      },
      {
        "id": "uses-responsive-images",
        "title": "Right-size images for viewport",
        "pageCount": 32,
        "totalEstimatedSavingsBytes": 6360935,
        "totalEstimatedBlockingMs": 0
      },
      {
        "id": "uses-text-compression",
        "title": "Enable text compression",
        "pageCount": 15,
        "totalEstimatedSavingsBytes": 459096,
        "totalEstimatedBlockingMs": 0
      },
      {
        "id": "unminified-javascript",
        "title": "Minify JavaScript",
        "pageCount": 8,
        "totalEstimatedSavingsBytes": 373352,
        "totalEstimatedBlockingMs": 0
      },
      {
        "id": "unminified-css",
        "title": "Minify CSS",
        "pageCount": 4,
        "totalEstimatedSavingsBytes": 14671,
        "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": 100,
    "averageScore": 100,
    "highUrgencyPages": 100,
    "pagesWithoutServiceWorker": 100,
    "pagesWithoutOfflineSupport": 100,
    "pagesWithWeakCacheTtl": 100,
    "recurringOpportunities": [
      {
        "id": "service-worker",
        "title": "Add service worker support",
        "urgency": "high",
        "pageCount": 100
      },
      {
        "id": "works-offline",
        "title": "Ensure critical routes work offline",
        "urgency": "high",
        "pageCount": 100
      },
      {
        "id": "installable-manifest",
        "title": "Improve web app manifest support",
        "urgency": "medium",
        "pageCount": 100
      },
      {
        "id": "uses-long-cache-ttl",
        "title": "Strengthen static asset cache TTL",
        "urgency": "medium",
        "pageCount": 100
      },
      {
        "id": "offline-start-url",
        "title": "Support offline start URL behavior",
        "urgency": "medium",
        "pageCount": 100
      }
    ]
  },
  "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": 100,
    "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": 100,
    "averageScore": 35.95,
    "highUrgencyPages": 0,
    "pagesWithAutoplay": 0,
    "pagesWithUnmutedAutoplay": 0,
    "pagesWithoutDarkMode": 100,
    "pagesWithLazyLoadingGap": 72
  },
  "wsgHighlightsSummary": {
    "assessedPages": 100,
    "averageScore": 85,
    "highlights": [
      {
        "guideline": "11.3",
        "title": "Incomplete media lazy loading",
        "urgency": "medium",
        "detail": "Only 29/56 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": 100,
        "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": "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": 100,
        "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": 100,
        "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": 100,
        "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": 100,
        "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": 100,
        "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": 100,
        "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": 100,
        "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": 100,
        "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": 100,
        "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": 100,
        "pages": {},
        "criteria": null
      }
    ]
  },
  "siteGuidance": {
    "siteCount": 1,
    "singleSiteScan": true,
    "sites": [
      {
        "origin": "https://www.barcelona.cat",
        "pageCount": 100,
        "sharedRecommendations": [
          {
            "area": "expected-files",
            "urgency": "low",
            "title": "Publish .well-known/security.txt",
            "detail": ".well-known/security.txt is missing for all sampled pages on https://www.barcelona.cat."
          },
          {
            "area": "security-headers",
            "urgency": "high",
            "title": "Apply Content-Security-Policy site-wide",
            "detail": "CSP is absent across all sampled pages on https://www.barcelona.cat."
          },
          {
            "area": "security-headers",
            "urgency": "medium",
            "title": "Enable Strict-Transport-Security site-wide",
            "detail": "HSTS is missing across all sampled HTTPS pages on https://www.barcelona.cat."
          },
          {
            "area": "offline-support",
            "urgency": "high",
            "title": "Introduce service worker support",
            "detail": "No sampled pages on https://www.barcelona.cat 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://www.barcelona.cat."
          },
          {
            "area": "optimization",
            "urgency": "medium",
            "title": "Fix recurring optimization bloat at shared layer",
            "detail": "Serve images in next-gen formats recurs across 100 pages on https://www.barcelona.cat (est. 78.72 MB aggregate savings)."
          },
          {
            "area": "compression",
            "urgency": "high",
            "title": "Prioritize recurring compression fixes",
            "detail": "Use modern image compression formats recurs across 100 pages on https://www.barcelona.cat (est. 78.72 MB aggregate savings)."
          },
          {
            "area": "offline-support",
            "urgency": "high",
            "title": "Prioritize recurring offline/caching improvements",
            "detail": "Add service worker support is needed across 100 pages on https://www.barcelona.cat."
          }
        ],
        "recurringCompression": [
          {
            "id": "modern-image-formats",
            "title": "Use modern image compression formats",
            "urgency": "high",
            "pageCount": 100,
            "totalEstimatedSavingsBytes": 82547754.59999993
          },
          {
            "id": "uses-optimized-images",
            "title": "Improve image encoding quality/size",
            "urgency": "high",
            "pageCount": 100,
            "totalEstimatedSavingsBytes": 56535750
          },
          {
            "id": "uses-text-compression",
            "title": "Enable Brotli/gzip for text assets",
            "urgency": "medium",
            "pageCount": 15,
            "totalEstimatedSavingsBytes": 459096
          },
          {
            "id": "unminified-javascript",
            "title": "Minify JavaScript before transfer",
            "urgency": "high",
            "pageCount": 8,
            "totalEstimatedSavingsBytes": 373352
          },
          {
            "id": "unminified-css",
            "title": "Minify CSS before transfer",
            "urgency": "low",
            "pageCount": 4,
            "totalEstimatedSavingsBytes": 14671
          }
        ],
        "recurringOptimization": [
          {
            "id": "modern-image-formats",
            "title": "Serve images in next-gen formats",
            "pageCount": 100,
            "totalEstimatedSavingsBytes": 82547754.59999993,
            "totalEstimatedBlockingMs": 0
          },
          {
            "id": "uses-optimized-images",
            "title": "Compress oversized image assets",
            "pageCount": 100,
            "totalEstimatedSavingsBytes": 56535750,
            "totalEstimatedBlockingMs": 0
          },
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "pageCount": 100,
            "totalEstimatedSavingsBytes": 14763726,
            "totalEstimatedBlockingMs": 0
          },
          {
            "id": "unused-javascript",
            "title": "Remove unused JavaScript",
            "pageCount": 100,
            "totalEstimatedSavingsBytes": 13506657,
            "totalEstimatedBlockingMs": 0
          },
          {
            "id": "unused-css-rules",
            "title": "Remove unused CSS",
            "pageCount": 100,
            "totalEstimatedSavingsBytes": 9519046,
            "totalEstimatedBlockingMs": 0
          },
          {
            "id": "render-blocking-resources",
            "title": "Eliminate render-blocking resources",
            "pageCount": 100,
            "totalEstimatedSavingsBytes": 0,
            "totalEstimatedBlockingMs": 150288
          },
          {
            "id": "uses-responsive-images",
            "title": "Right-size images for viewport",
            "pageCount": 32,
            "totalEstimatedSavingsBytes": 6360935,
            "totalEstimatedBlockingMs": 0
          },
          {
            "id": "uses-text-compression",
            "title": "Enable text compression",
            "pageCount": 15,
            "totalEstimatedSavingsBytes": 459096,
            "totalEstimatedBlockingMs": 0
          },
          {
            "id": "unminified-javascript",
            "title": "Minify JavaScript",
            "pageCount": 8,
            "totalEstimatedSavingsBytes": 373352,
            "totalEstimatedBlockingMs": 0
          },
          {
            "id": "unminified-css",
            "title": "Minify CSS",
            "pageCount": 4,
            "totalEstimatedSavingsBytes": 14671,
            "totalEstimatedBlockingMs": 0
          }
        ],
        "recurringOfflineOpportunities": [
          {
            "id": "service-worker",
            "title": "Add service worker support",
            "urgency": "high",
            "pageCount": 100
          },
          {
            "id": "works-offline",
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "pageCount": 100
          },
          {
            "id": "installable-manifest",
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "pageCount": 100
          },
          {
            "id": "uses-long-cache-ttl",
            "title": "Strengthen static asset cache TTL",
            "urgency": "medium",
            "pageCount": 100
          },
          {
            "id": "offline-start-url",
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "pageCount": 100
          }
        ],
        "recurringDependencies": [],
        "recurringRuntimeSignals": [],
        "pageSpecific": [
          {
            "url": "https://barcelona.cat/ca/que-pots-fer-a-bcn/banys-i-platges/historia-de-les-platges",
            "securityScore": 59,
            "dependencyScore": 10,
            "expectedFilesScore": 25,
            "compressionScore": 100,
            "optimizationScore": 100,
            "offlineScore": 100,
            "languageScore": 0,
            "mediaHintsScore": 29,
            "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.17 MB."
              },
              {
                "title": "Improve image encoding quality/size",
                "urgency": "high",
                "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 1016.77 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: 1.17 MB."
              },
              {
                "title": "Compress oversized image assets",
                "urgency": "high",
                "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 1016.77 KB."
              }
            ]
          },
          {
            "url": "https://barcelona.cat/es/que-hacer-en-bcn/banos-y-playas/historia-de-las-playas",
            "securityScore": 59,
            "dependencyScore": 10,
            "expectedFilesScore": 25,
            "compressionScore": 100,
            "optimizationScore": 100,
            "offlineScore": 100,
            "languageScore": 0,
            "mediaHintsScore": 29,
            "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.17 MB."
              },
              {
                "title": "Improve image encoding quality/size",
                "urgency": "high",
                "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 1017.30 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: 1.17 MB."
              },
              {
                "title": "Compress oversized image assets",
                "urgency": "high",
                "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 1017.30 KB."
              }
            ]
          },
          {
            "url": "https://barcelona.cat/es/vivir-en-bcn/vive-el-barrio",
            "securityScore": 59,
            "dependencyScore": 10,
            "expectedFilesScore": 25,
            "compressionScore": 77,
            "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.42 MB."
              },
              {
                "title": "Improve image encoding quality/size",
                "urgency": "high",
                "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 747.77 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: 1.42 MB."
              },
              {
                "title": "Compress oversized image assets",
                "urgency": "high",
                "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 747.77 KB."
              }
            ]
          },
          {
            "url": "https://barcelona.cat/en/what-to-do-in-bcn/parks-and-gardens/history",
            "securityScore": 59,
            "dependencyScore": 10,
            "expectedFilesScore": 25,
            "compressionScore": 100,
            "optimizationScore": 100,
            "offlineScore": 100,
            "languageScore": 0,
            "mediaHintsScore": 25,
            "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.45 MB."
              },
              {
                "title": "Improve image encoding quality/size",
                "urgency": "high",
                "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 1.23 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.45 MB."
              },
              {
                "title": "Compress oversized image assets",
                "urgency": "high",
                "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 1.23 MB."
              }
            ]
          },
          {
            "url": "https://barcelona.cat/en/discoverbcn",
            "securityScore": 59,
            "dependencyScore": 10,
            "expectedFilesScore": 25,
            "compressionScore": 97,
            "optimizationScore": 100,
            "offlineScore": 100,
            "languageScore": 0,
            "mediaHintsScore": 27,
            "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: 1013.03 KB."
              },
              {
                "title": "Improve image encoding quality/size",
                "urgency": "high",
                "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 832.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: 1013.03 KB."
              },
              {
                "title": "Compress oversized image assets",
                "urgency": "high",
                "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 832.52 KB."
              }
            ]
          },
          {
            "url": "https://barcelona.cat/ca/coneixbcn",
            "securityScore": 59,
            "dependencyScore": 10,
            "expectedFilesScore": 25,
            "compressionScore": 96,
            "optimizationScore": 100,
            "offlineScore": 100,
            "languageScore": 0,
            "mediaHintsScore": 27,
            "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: 1013.03 KB."
              },
              {
                "title": "Improve image encoding quality/size",
                "urgency": "high",
                "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 832.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: 1013.03 KB."
              },
              {
                "title": "Compress oversized image assets",
                "urgency": "high",
                "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 832.52 KB."
              }
            ]
          },
          {
            "url": "https://barcelona.cat/es/conocebcn",
            "securityScore": 59,
            "dependencyScore": 10,
            "expectedFilesScore": 25,
            "compressionScore": 96,
            "optimizationScore": 100,
            "offlineScore": 100,
            "languageScore": 0,
            "mediaHintsScore": 27,
            "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: 1013.03 KB."
              },
              {
                "title": "Improve image encoding quality/size",
                "urgency": "high",
                "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 832.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: 1013.03 KB."
              },
              {
                "title": "Compress oversized image assets",
                "urgency": "high",
                "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 832.52 KB."
              }
            ]
          },
          {
            "url": "https://barcelona.cat/es/que-hacer-en-bcn/banos-y-playas/playa-de-sant-miquel",
            "securityScore": 59,
            "dependencyScore": 10,
            "expectedFilesScore": 25,
            "compressionScore": 83,
            "optimizationScore": 100,
            "offlineScore": 100,
            "languageScore": 0,
            "mediaHintsScore": 39,
            "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: 702.57 KB."
              },
              {
                "title": "Improve image encoding quality/size",
                "urgency": "high",
                "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 603.45 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: 702.57 KB."
              },
              {
                "title": "Compress oversized image assets",
                "urgency": "high",
                "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 603.45 KB."
              }
            ]
          },
          {
            "url": "https://barcelona.cat/en/what-to-do-in-bcn/bathing-and-beaches/sant-sebastia-beach",
            "securityScore": 59,
            "dependencyScore": 10,
            "expectedFilesScore": 25,
            "compressionScore": 83,
            "optimizationScore": 100,
            "offlineScore": 100,
            "languageScore": 0,
            "mediaHintsScore": 39,
            "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: 680.80 KB."
              },
              {
                "title": "Improve image encoding quality/size",
                "urgency": "high",
                "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 587.22 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: 680.80 KB."
              },
              {
                "title": "Compress oversized image assets",
                "urgency": "high",
                "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 587.22 KB."
              }
            ]
          },
          {
            "url": "https://barcelona.cat/es/que-hacer-en-bcn/banos-y-playas/playa-de-somorrostro",
            "securityScore": 59,
            "dependencyScore": 10,
            "expectedFilesScore": 25,
            "compressionScore": 83,
            "optimizationScore": 100,
            "offlineScore": 100,
            "languageScore": 0,
            "mediaHintsScore": 39,
            "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: 720.24 KB."
              },
              {
                "title": "Improve image encoding quality/size",
                "urgency": "high",
                "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 618.58 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: 720.24 KB."
              },
              {
                "title": "Compress oversized image assets",
                "urgency": "high",
                "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 618.58 KB."
              }
            ]
          },
          {
            "url": "https://barcelona.cat/ca/que-pots-fer-a-bcn/banys-i-platges/barcelona-platja-platja",
            "securityScore": 59,
            "dependencyScore": 10,
            "expectedFilesScore": 25,
            "compressionScore": 100,
            "optimizationScore": 100,
            "offlineScore": 100,
            "languageScore": 0,
            "mediaHintsScore": 21,
            "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.16 MB."
              },
              {
                "title": "Improve image encoding quality/size",
                "urgency": "high",
                "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 983.25 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: 1.16 MB."
              },
              {
                "title": "Compress oversized image assets",
                "urgency": "high",
                "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 983.25 KB."
              }
            ]
          },
          {
            "url": "https://barcelona.cat/en/living-in-bcn/accessibility",
            "securityScore": 59,
            "dependencyScore": 10,
            "expectedFilesScore": 25,
            "compressionScore": 100,
            "optimizationScore": 100,
            "offlineScore": 100,
            "languageScore": 0,
            "mediaHintsScore": 20,
            "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.08 MB."
              },
              {
                "title": "Improve image encoding quality/size",
                "urgency": "high",
                "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 916.72 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: 1.08 MB."
              },
              {
                "title": "Compress oversized image assets",
                "urgency": "high",
                "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 916.72 KB."
              }
            ]
          },
          {
            "url": "https://barcelona.cat/ca/que-pots-fer-a-bcn",
            "securityScore": 59,
            "dependencyScore": 10,
            "expectedFilesScore": 25,
            "compressionScore": 100,
            "optimizationScore": 100,
            "offlineScore": 100,
            "languageScore": 0,
            "mediaHintsScore": 20,
            "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.32 MB."
              },
              {
                "title": "Improve image encoding quality/size",
                "urgency": "high",
                "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 1.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: 1.32 MB."
              },
              {
                "title": "Compress oversized image assets",
                "urgency": "high",
                "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 1.10 MB."
              }
            ]
          },
          {
            "url": "https://barcelona.cat/ca/treball-i-empresa",
            "securityScore": 59,
            "dependencyScore": 10,
            "expectedFilesScore": 25,
            "compressionScore": 100,
            "optimizationScore": 100,
            "offlineScore": 100,
            "languageScore": 0,
            "mediaHintsScore": 20,
            "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.05 MB."
              },
              {
                "title": "Improve image encoding quality/size",
                "urgency": "high",
                "detail": "Re-encode oversized images and tune compression quality for significant byte savings. 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: 2.05 MB."
              },
              {
                "title": "Compress oversized image assets",
                "urgency": "high",
                "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 1.73 MB."
              }
            ]
          },
          {
            "url": "https://barcelona.cat/ca/viure-a-bcn",
            "securityScore": 59,
            "dependencyScore": 10,
            "expectedFilesScore": 25,
            "compressionScore": 100,
            "optimizationScore": 100,
            "offlineScore": 100,
            "languageScore": 0,
            "mediaHintsScore": 20,
            "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.28 MB."
              },
              {
                "title": "Improve image encoding quality/size",
                "urgency": "high",
                "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 1.00 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.28 MB."
              },
              {
                "title": "Compress oversized image assets",
                "urgency": "high",
                "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 1.00 MB."
              }
            ]
          },
          {
            "url": "https://barcelona.cat/en/living-in-bcn",
            "securityScore": 59,
            "dependencyScore": 10,
            "expectedFilesScore": 25,
            "compressionScore": 100,
            "optimizationScore": 100,
            "offlineScore": 100,
            "languageScore": 0,
            "mediaHintsScore": 20,
            "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.28 MB."
              },
              {
                "title": "Improve image encoding quality/size",
                "urgency": "high",
                "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 1.00 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.28 MB."
              },
              {
                "title": "Compress oversized image assets",
                "urgency": "high",
                "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 1.00 MB."
              }
            ]
          },
          {
            "url": "https://barcelona.cat/en/what-to-do-in-bcn",
            "securityScore": 59,
            "dependencyScore": 10,
            "expectedFilesScore": 25,
            "compressionScore": 100,
            "optimizationScore": 100,
            "offlineScore": 100,
            "languageScore": 0,
            "mediaHintsScore": 20,
            "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.38 MB."
              },
              {
                "title": "Improve image encoding quality/size",
                "urgency": "high",
                "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 1.15 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.38 MB."
              },
              {
                "title": "Compress oversized image assets",
                "urgency": "high",
                "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 1.15 MB."
              }
            ]
          },
          {
            "url": "https://barcelona.cat/es/que-hacer-en-bcn",
            "securityScore": 59,
            "dependencyScore": 10,
            "expectedFilesScore": 25,
            "compressionScore": 100,
            "optimizationScore": 100,
            "offlineScore": 100,
            "languageScore": 0,
            "mediaHintsScore": 20,
            "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.32 MB."
              },
              {
                "title": "Improve image encoding quality/size",
                "urgency": "high",
                "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 1.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: 1.32 MB."
              },
              {
                "title": "Compress oversized image assets",
                "urgency": "high",
                "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 1.10 MB."
              }
            ]
          },
          {
            "url": "https://barcelona.cat/es/trabajo-y-empresa",
            "securityScore": 59,
            "dependencyScore": 10,
            "expectedFilesScore": 25,
            "compressionScore": 100,
            "optimizationScore": 100,
            "offlineScore": 100,
            "languageScore": 0,
            "mediaHintsScore": 20,
            "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.05 MB."
              },
              {
                "title": "Improve image encoding quality/size",
                "urgency": "high",
                "detail": "Re-encode oversized images and tune compression quality for significant byte savings. 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: 2.05 MB."
              },
              {
                "title": "Compress oversized image assets",
                "urgency": "high",
                "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 1.73 MB."
              }
            ]
          },
          {
            "url": "https://barcelona.cat/es/vivir-en-bcn",
            "securityScore": 59,
            "dependencyScore": 10,
            "expectedFilesScore": 25,
            "compressionScore": 100,
            "optimizationScore": 100,
            "offlineScore": 100,
            "languageScore": 0,
            "mediaHintsScore": 20,
            "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.29 MB."
              },
              {
                "title": "Improve image encoding quality/size",
                "urgency": "high",
                "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 1.00 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.29 MB."
              },
              {
                "title": "Compress oversized image assets",
                "urgency": "high",
                "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 1.00 MB."
              }
            ]
          },
          {
            "url": "https://barcelona.cat/en/discoverbcn/ciutadella-knowledge-hub/heritage-and-science-hub",
            "securityScore": 59,
            "dependencyScore": 10,
            "expectedFilesScore": 25,
            "compressionScore": 100,
            "optimizationScore": 100,
            "offlineScore": 100,
            "languageScore": 0,
            "mediaHintsScore": 20,
            "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.86 MB."
              },
              {
                "title": "Improve image encoding quality/size",
                "urgency": "high",
                "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 1.55 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.86 MB."
              },
              {
                "title": "Compress oversized image assets",
                "urgency": "high",
                "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 1.55 MB."
              }
            ]
          },
          {
            "url": "https://barcelona.cat/es/vivir-en-bcn/con-accesibilidad",
            "securityScore": 59,
            "dependencyScore": 10,
            "expectedFilesScore": 25,
            "compressionScore": 100,
            "optimizationScore": 100,
            "offlineScore": 100,
            "languageScore": 0,
            "mediaHintsScore": 20,
            "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.08 MB."
              },
              {
                "title": "Improve image encoding quality/size",
                "urgency": "high",
                "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 916.28 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: 1.08 MB."
              },
              {
                "title": "Compress oversized image assets",
                "urgency": "high",
                "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 916.28 KB."
              }
            ]
          },
          {
            "url": "https://barcelona.cat/es/vivir-en-bcn/medio-ambiente-y-sostenibilidad",
            "securityScore": 59,
            "dependencyScore": 10,
            "expectedFilesScore": 25,
            "compressionScore": 100,
            "optimizationScore": 100,
            "offlineScore": 100,
            "languageScore": 0,
            "mediaHintsScore": 20,
            "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.25 MB."
              },
              {
                "title": "Improve image encoding quality/size",
                "urgency": "high",
                "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 1.02 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.25 MB."
              },
              {
                "title": "Compress oversized image assets",
                "urgency": "high",
                "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 1.02 MB."
              }
            ]
          },
          {
            "url": "https://barcelona.cat/en/what-to-do-in-bcn/bathing-and-beaches/dogs-area",
            "securityScore": 59,
            "dependencyScore": 10,
            "expectedFilesScore": 25,
            "compressionScore": 100,
            "optimizationScore": 100,
            "offlineScore": 100,
            "languageScore": 0,
            "mediaHintsScore": 20,
            "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.70 MB."
              },
              {
                "title": "Improve image encoding quality/size",
                "urgency": "high",
                "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated 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: 1.70 MB."
              },
              {
                "title": "Compress oversized image assets",
                "urgency": "high",
                "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 1.25 MB."
              }
            ]
          },
          {
            "url": "https://barcelona.cat/es/vivir-en-bcn/con-ninos-y-ninas",
            "securityScore": 59,
            "dependencyScore": 10,
            "expectedFilesScore": 25,
            "compressionScore": 100,
            "optimizationScore": 100,
            "offlineScore": 100,
            "languageScore": 0,
            "mediaHintsScore": 20,
            "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.87 MB."
              },
              {
                "title": "Improve image encoding quality/size",
                "urgency": "high",
                "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 1.43 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.87 MB."
              },
              {
                "title": "Compress oversized image assets",
                "urgency": "high",
                "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 1.43 MB."
              }
            ]
          },
          {
            "url": "https://barcelona.cat/en/discoverbcn/ciutadella-knowledge-hub/greenhouse/history",
            "securityScore": 59,
            "dependencyScore": 10,
            "expectedFilesScore": 25,
            "compressionScore": 100,
            "optimizationScore": 100,
            "offlineScore": 100,
            "languageScore": 0,
            "mediaHintsScore": 20,
            "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.88 MB."
              },
              {
                "title": "Improve image encoding quality/size",
                "urgency": "high",
                "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 1.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: 1.88 MB."
              },
              {
                "title": "Compress oversized image assets",
                "urgency": "high",
                "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 1.51 MB."
              }
            ]
          },
          {
            "url": "https://barcelona.cat/ca/viure-a-bcn/amb-nens-i-nenes",
            "securityScore": 59,
            "dependencyScore": 10,
            "expectedFilesScore": 25,
            "compressionScore": 100,
            "optimizationScore": 100,
            "offlineScore": 100,
            "languageScore": 0,
            "mediaHintsScore": 20,
            "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.87 MB."
              },
              {
                "title": "Improve image encoding quality/size",
                "urgency": "high",
                "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 1.43 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.87 MB."
              },
              {
                "title": "Compress oversized image assets",
                "urgency": "high",
                "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 1.43 MB."
              }
            ]
          },
          {
            "url": "https://barcelona.cat/en/what-to-do-in-bcn/montjuic-park/find-out-about-montjuic-park-council",
            "securityScore": 59,
            "dependencyScore": 10,
            "expectedFilesScore": 25,
            "compressionScore": 69,
            "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: 434.22 KB."
              },
              {
                "title": "Improve image encoding quality/size",
                "urgency": "high",
                "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 368.13 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: 434.22 KB."
              },
              {
                "title": "Compress oversized image assets",
                "urgency": "high",
                "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 368.13 KB."
              }
            ]
          },
          {
            "url": "https://barcelona.cat/en/what-to-do-in-bcn/magic-fountain/history",
            "securityScore": 59,
            "dependencyScore": 10,
            "expectedFilesScore": 25,
            "compressionScore": 94,
            "optimizationScore": 100,
            "offlineScore": 100,
            "languageScore": 0,
            "mediaHintsScore": 20,
            "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.09 MB."
              },
              {
                "title": "Improve image encoding quality/size",
                "urgency": "high",
                "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 853.31 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: 1.09 MB."
              },
              {
                "title": "Compress oversized image assets",
                "urgency": "high",
                "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 853.31 KB."
              }
            ]
          },
          {
            "url": "https://barcelona.cat/en/discoverbcn/ciutadella-knowledge-hub/transformation-park",
            "securityScore": 59,
            "dependencyScore": 10,
            "expectedFilesScore": 25,
            "compressionScore": 93,
            "optimizationScore": 100,
            "offlineScore": 100,
            "languageScore": 0,
            "mediaHintsScore": 20,
            "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: 985.67 KB."
              },
              {
                "title": "Improve image encoding quality/size",
                "urgency": "high",
                "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 826.38 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: 985.67 KB."
              },
              {
                "title": "Compress oversized image assets",
                "urgency": "high",
                "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 826.38 KB."
              }
            ]
          },
          {
            "url": "https://barcelona.cat/en/getinvolved",
            "securityScore": 59,
            "dependencyScore": 10,
            "expectedFilesScore": 25,
            "compressionScore": 92,
            "optimizationScore": 100,
            "offlineScore": 100,
            "languageScore": 0,
            "mediaHintsScore": 20,
            "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: 860.02 KB."
              },
              {
                "title": "Improve image encoding quality/size",
                "urgency": "high",
                "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 710.92 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: 860.02 KB."
              },
              {
                "title": "Compress oversized image assets",
                "urgency": "high",
                "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 710.92 KB."
              }
            ]
          },
          {
            "url": "https://barcelona.cat/en/living-in-bcn/diada",
            "securityScore": 59,
            "dependencyScore": 10,
            "expectedFilesScore": 25,
            "compressionScore": 89,
            "optimizationScore": 100,
            "offlineScore": 100,
            "languageScore": 0,
            "mediaHintsScore": 23,
            "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: 888.45 KB."
              },
              {
                "title": "Improve image encoding quality/size",
                "urgency": "high",
                "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 713.76 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: 888.45 KB."
              },
              {
                "title": "Compress oversized image assets",
                "urgency": "high",
                "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 713.76 KB."
              }
            ]
          },
          {
            "url": "https://barcelona.cat/en/what-to-do-in-bcn/bathing-and-beaches/accessibility",
            "securityScore": 59,
            "dependencyScore": 10,
            "expectedFilesScore": 25,
            "compressionScore": 66,
            "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: 419.54 KB."
              },
              {
                "title": "Improve image encoding quality/size",
                "urgency": "high",
                "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 353.70 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: 419.54 KB."
              },
              {
                "title": "Compress oversized image assets",
                "urgency": "high",
                "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 353.70 KB."
              }
            ]
          },
          {
            "url": "https://barcelona.cat/ca/implicat",
            "securityScore": 59,
            "dependencyScore": 10,
            "expectedFilesScore": 25,
            "compressionScore": 91,
            "optimizationScore": 100,
            "offlineScore": 100,
            "languageScore": 0,
            "mediaHintsScore": 20,
            "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: 860.41 KB."
              },
              {
                "title": "Improve image encoding quality/size",
                "urgency": "high",
                "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 711.26 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: 860.41 KB."
              },
              {
                "title": "Compress oversized image assets",
                "urgency": "high",
                "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 711.26 KB."
              }
            ]
          },
          {
            "url": "https://barcelona.cat/es/vivir-en-bcn/diada",
            "securityScore": 59,
            "dependencyScore": 10,
            "expectedFilesScore": 25,
            "compressionScore": 88,
            "optimizationScore": 100,
            "offlineScore": 100,
            "languageScore": 0,
            "mediaHintsScore": 23,
            "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: 888.45 KB."
              },
              {
                "title": "Improve image encoding quality/size",
                "urgency": "high",
                "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 713.76 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: 888.45 KB."
              },
              {
                "title": "Compress oversized image assets",
                "urgency": "high",
                "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 713.76 KB."
              }
            ]
          },
          {
            "url": "https://barcelona.cat/es/implicate",
            "securityScore": 59,
            "dependencyScore": 10,
            "expectedFilesScore": 25,
            "compressionScore": 88,
            "optimizationScore": 100,
            "offlineScore": 100,
            "languageScore": 0,
            "mediaHintsScore": 20,
            "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: 808.69 KB."
              },
              {
                "title": "Improve image encoding quality/size",
                "urgency": "high",
                "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 666.90 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: 808.69 KB."
              },
              {
                "title": "Compress oversized image assets",
                "urgency": "high",
                "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 666.90 KB."
              }
            ]
          },
          {
            "url": "https://barcelona.cat/es/que-hacer-en-bcn/banos-y-playas/zona-de-banos-del-forum",
            "securityScore": 59,
            "dependencyScore": 10,
            "expectedFilesScore": 25,
            "compressionScore": 63,
            "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: 433.65 KB."
              },
              {
                "title": "Improve image encoding quality/size",
                "urgency": "high",
                "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 371.77 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: 433.65 KB."
              },
              {
                "title": "Compress oversized image assets",
                "urgency": "high",
                "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 371.77 KB."
              }
            ]
          },
          {
            "url": "https://barcelona.cat/es/conocebcn/la-historia/la-barcino-romana",
            "securityScore": 59,
            "dependencyScore": 10,
            "expectedFilesScore": 25,
            "compressionScore": 82,
            "optimizationScore": 100,
            "offlineScore": 100,
            "languageScore": 0,
            "mediaHintsScore": 23,
            "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: 711.35 KB."
              },
              {
                "title": "Improve image encoding quality/size",
                "urgency": "high",
                "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 569.39 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: 711.35 KB."
              },
              {
                "title": "Compress oversized image assets",
                "urgency": "high",
                "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 569.39 KB."
              }
            ]
          },
          {
            "url": "https://barcelona.cat/es/que-hacer-en-bcn/parque-montjuic/noticias",
            "securityScore": 59,
            "dependencyScore": 10,
            "expectedFilesScore": 25,
            "compressionScore": 55,
            "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.05 MB."
              },
              {
                "title": "Improve image encoding quality/size",
                "urgency": "medium",
                "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 89.47 KB."
              },
              {
                "title": "Right-size images for viewport",
                "urgency": "high",
                "detail": "Avoid sending larger images than the rendered size needs. Estimated byte savings: 1.06 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.05 MB."
              }
            ]
          },
          {
            "url": "https://barcelona.cat/ca/que-pots-fer-a-bcn/banys-i-platges/zona-de-banys-del-forum",
            "securityScore": 59,
            "dependencyScore": 10,
            "expectedFilesScore": 25,
            "compressionScore": 63,
            "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: 433.65 KB."
              },
              {
                "title": "Improve image encoding quality/size",
                "urgency": "high",
                "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 371.77 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: 433.65 KB."
              },
              {
                "title": "Compress oversized image assets",
                "urgency": "high",
                "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 371.77 KB."
              }
            ]
          },
          {
            "url": "https://barcelona.cat/es/vivir-en-bcn/con-personas-mayores/vivir-con-tranquilidad",
            "securityScore": 59,
            "dependencyScore": 10,
            "expectedFilesScore": 25,
            "compressionScore": 79,
            "optimizationScore": 100,
            "offlineScore": 100,
            "languageScore": 0,
            "mediaHintsScore": 25,
            "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: 611.21 KB."
              },
              {
                "title": "Improve image encoding quality/size",
                "urgency": "high",
                "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 503.09 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: 611.21 KB."
              },
              {
                "title": "Compress oversized image assets",
                "urgency": "high",
                "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 503.09 KB."
              }
            ]
          },
          {
            "url": "https://barcelona.cat/en/discoverbcn/la-ciutadella-knowledge-hub/news",
            "securityScore": 59,
            "dependencyScore": 10,
            "expectedFilesScore": 25,
            "compressionScore": 53,
            "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: 884.01 KB."
              },
              {
                "title": "Improve image encoding quality/size",
                "urgency": "medium",
                "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 87.35 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: 884.01 KB."
              },
              {
                "title": "Right-size images for viewport",
                "urgency": "high",
                "detail": "Avoid sending larger images than the rendered size needs. Estimated byte savings: 826.77 KB."
              }
            ]
          },
          {
            "url": "https://barcelona.cat/es/conocebcn/la-ciutadella-del-conocimiento/noticias",
            "securityScore": 59,
            "dependencyScore": 10,
            "expectedFilesScore": 25,
            "compressionScore": 52,
            "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: 884.01 KB."
              },
              {
                "title": "Improve image encoding quality/size",
                "urgency": "medium",
                "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 87.35 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: 884.01 KB."
              },
              {
                "title": "Right-size images for viewport",
                "urgency": "high",
                "detail": "Avoid sending larger images than the rendered size needs. Estimated byte savings: 814.66 KB."
              }
            ]
          },
          {
            "url": "https://barcelona.cat/ca/viure-a-bcn/amb-nens-i-nenes/lleure/llistat-de-ludotecas",
            "securityScore": 59,
            "dependencyScore": 10,
            "expectedFilesScore": 25,
            "compressionScore": 51,
            "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: 348.81 KB."
              },
              {
                "title": "Improve image encoding quality/size",
                "urgency": "high",
                "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 247.81 KB."
              },
              {
                "title": "Enable Brotli/gzip for text assets",
                "urgency": "low",
                "detail": "Compress HTML, CSS, JS, JSON, SVG, and XML responses with Brotli or gzip. Estimated savings: 21.90 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: 348.81 KB."
              }
            ]
          },
          {
            "url": "https://barcelona.cat/ca/que-pots-fer-a-bcn/cultura",
            "securityScore": 59,
            "dependencyScore": 10,
            "expectedFilesScore": 25,
            "compressionScore": 53,
            "optimizationScore": 100,
            "offlineScore": 100,
            "languageScore": 0,
            "mediaHintsScore": 48,
            "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: 500.10 KB."
              },
              {
                "title": "Improve image encoding quality/size",
                "urgency": "high",
                "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 275.98 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: 500.10 KB."
              },
              {
                "title": "Compress oversized image assets",
                "urgency": "high",
                "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 275.98 KB."
              }
            ]
          },
          {
            "url": "https://barcelona.cat/es/conocebcn/la-historia/la-barcelona-contemporanea",
            "securityScore": 59,
            "dependencyScore": 10,
            "expectedFilesScore": 25,
            "compressionScore": 78,
            "optimizationScore": 100,
            "offlineScore": 100,
            "languageScore": 0,
            "mediaHintsScore": 23,
            "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: 632.60 KB."
              },
              {
                "title": "Improve image encoding quality/size",
                "urgency": "high",
                "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 506.63 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: 632.60 KB."
              },
              {
                "title": "Compress oversized image assets",
                "urgency": "high",
                "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 506.63 KB."
              }
            ]
          },
          {
            "url": "https://barcelona.cat/en/what-to-do-in-bcn/montjuic-park/news",
            "securityScore": 59,
            "dependencyScore": 10,
            "expectedFilesScore": 25,
            "compressionScore": 50,
            "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: 867.69 KB."
              },
              {
                "title": "Improve image encoding quality/size",
                "urgency": "medium",
                "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 89.47 KB."
              },
              {
                "title": "Right-size images for viewport",
                "urgency": "high",
                "detail": "Avoid sending larger images than the rendered size needs. Estimated byte savings: 911.83 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: 867.69 KB."
              }
            ]
          },
          {
            "url": "https://barcelona.cat/en/living-in-bcn/pets",
            "securityScore": 59,
            "dependencyScore": 10,
            "expectedFilesScore": 25,
            "compressionScore": 70,
            "optimizationScore": 100,
            "offlineScore": 100,
            "languageScore": 0,
            "mediaHintsScore": 30,
            "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.15 MB."
              },
              {
                "title": "Improve image encoding quality/size",
                "urgency": "high",
                "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 609.05 KB."
              },
              {
                "title": "Minify JavaScript before transfer",
                "urgency": "low",
                "detail": "Minify JS bundles so transport compression produces better results with fewer bytes. Estimated savings: 5.93 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: 1.15 MB."
              }
            ]
          },
          {
            "url": "https://barcelona.cat/ca/que-pots-fer-a-bcn/banys-i-platges/esport-les-platges",
            "securityScore": 59,
            "dependencyScore": 10,
            "expectedFilesScore": 25,
            "compressionScore": 66,
            "optimizationScore": 100,
            "offlineScore": 100,
            "languageScore": 0,
            "mediaHintsScore": 34,
            "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: 447.24 KB."
              },
              {
                "title": "Improve image encoding quality/size",
                "urgency": "high",
                "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 365.76 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: 447.24 KB."
              },
              {
                "title": "Compress oversized image assets",
                "urgency": "high",
                "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 365.76 KB."
              }
            ]
          },
          {
            "url": "https://barcelona.cat/ca/que-pots-fer-a-bcn/banys-i-platges/activitats-esportives-organitzades-amb-anim-de-lucre",
            "securityScore": 59,
            "dependencyScore": 10,
            "expectedFilesScore": 25,
            "compressionScore": 55,
            "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: 327.55 KB."
              },
              {
                "title": "Improve image encoding quality/size",
                "urgency": "high",
                "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 259.02 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: 327.55 KB."
              },
              {
                "title": "Compress oversized image assets",
                "urgency": "high",
                "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 259.02 KB."
              }
            ]
          },
          {
            "url": "https://barcelona.cat/ca/canelons",
            "securityScore": 59,
            "dependencyScore": 10,
            "expectedFilesScore": 25,
            "compressionScore": 54,
            "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: 289.31 KB."
              },
              {
                "title": "Improve image encoding quality/size",
                "urgency": "high",
                "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 247.26 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: 289.31 KB."
              },
              {
                "title": "Compress oversized image assets",
                "urgency": "high",
                "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 247.26 KB."
              }
            ]
          },
          {
            "url": "https://barcelona.cat/ca/pagina-imatge-promocional",
            "securityScore": 59,
            "dependencyScore": 10,
            "expectedFilesScore": 25,
            "compressionScore": 53,
            "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: 306.57 KB."
              },
              {
                "title": "Improve image encoding quality/size",
                "urgency": "high",
                "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 243.00 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: 306.57 KB."
              },
              {
                "title": "Compress oversized image assets",
                "urgency": "high",
                "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 243.00 KB."
              }
            ]
          },
          {
            "url": "https://barcelona.cat/es/que-hacer-en-bcn/banos-y-playas/deporte-en-las-playas/pesca",
            "securityScore": 59,
            "dependencyScore": 10,
            "expectedFilesScore": 25,
            "compressionScore": 53,
            "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: 305.74 KB."
              },
              {
                "title": "Improve image encoding quality/size",
                "urgency": "high",
                "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 243.80 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: 305.74 KB."
              },
              {
                "title": "Compress oversized image assets",
                "urgency": "high",
                "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 243.80 KB."
              }
            ]
          },
          {
            "url": "https://barcelona.cat/ca/que-pots-fer-a-bcn/banys-i-platges/platges-sense-residus",
            "securityScore": 59,
            "dependencyScore": 10,
            "expectedFilesScore": 25,
            "compressionScore": 64,
            "optimizationScore": 100,
            "offlineScore": 100,
            "languageScore": 0,
            "mediaHintsScore": 34,
            "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: 430.14 KB."
              },
              {
                "title": "Improve image encoding quality/size",
                "urgency": "high",
                "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 361.06 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: 430.14 KB."
              },
              {
                "title": "Compress oversized image assets",
                "urgency": "high",
                "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 361.06 KB."
              }
            ]
          },
          {
            "url": "https://barcelona.cat/es/conocebcn/la-ciutadella-del-conocimiento",
            "securityScore": 59,
            "dependencyScore": 10,
            "expectedFilesScore": 25,
            "compressionScore": 77,
            "optimizationScore": 100,
            "offlineScore": 100,
            "languageScore": 0,
            "mediaHintsScore": 20,
            "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: 878.93 KB."
              },
              {
                "title": "Improve image encoding quality/size",
                "urgency": "high",
                "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 631.72 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: 878.93 KB."
              },
              {
                "title": "Compress oversized image assets",
                "urgency": "high",
                "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 631.72 KB."
              }
            ]
          },
          {
            "url": "https://barcelona.cat/en/what-to-do-in-bcn/magic-fountain/how-it-works",
            "securityScore": 59,
            "dependencyScore": 10,
            "expectedFilesScore": 25,
            "compressionScore": 76,
            "optimizationScore": 100,
            "offlineScore": 100,
            "languageScore": 0,
            "mediaHintsScore": 21,
            "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: 620.91 KB."
              },
              {
                "title": "Improve image encoding quality/size",
                "urgency": "high",
                "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 484.34 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: 620.91 KB."
              },
              {
                "title": "Compress oversized image assets",
                "urgency": "high",
                "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 484.34 KB."
              }
            ]
          },
          {
            "url": "https://barcelona.cat/en/what-to-do-in-bcn/bathing-and-beaches/sports-activities-organised-federated-athletes-entities",
            "securityScore": 59,
            "dependencyScore": 10,
            "expectedFilesScore": 25,
            "compressionScore": 52,
            "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: 289.92 KB."
              },
              {
                "title": "Improve image encoding quality/size",
                "urgency": "high",
                "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 228.98 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: 289.92 KB."
              },
              {
                "title": "Compress oversized image assets",
                "urgency": "high",
                "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 228.98 KB."
              }
            ]
          },
          {
            "url": "https://barcelona.cat/es/que-hacer-en-bcn/banos-y-playas/actividades-deportivas-organizadas-por-deportistas-federados",
            "securityScore": 59,
            "dependencyScore": 10,
            "expectedFilesScore": 25,
            "compressionScore": 51,
            "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: 289.92 KB."
              },
              {
                "title": "Improve image encoding quality/size",
                "urgency": "high",
                "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 228.98 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: 289.92 KB."
              },
              {
                "title": "Compress oversized image assets",
                "urgency": "high",
                "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 228.98 KB."
              }
            ]
          },
          {
            "url": "https://barcelona.cat/es/que-hacer-en-bcn/parque-montjuic/conoce-el-consejo-del-parque-de-montjuic",
            "securityScore": 59,
            "dependencyScore": 10,
            "expectedFilesScore": 25,
            "compressionScore": 51,
            "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: 292.64 KB."
              },
              {
                "title": "Improve image encoding quality/size",
                "urgency": "high",
                "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 230.80 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: 292.64 KB."
              },
              {
                "title": "Compress oversized image assets",
                "urgency": "high",
                "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 230.80 KB."
              }
            ]
          },
          {
            "url": "https://barcelona.cat/ca/que-pots-fer-a-bcn/estiu/refrescat-a-les-piscines-municipals",
            "securityScore": 59,
            "dependencyScore": 10,
            "expectedFilesScore": 25,
            "compressionScore": 44,
            "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: 285.26 KB."
              },
              {
                "title": "Improve image encoding quality/size",
                "urgency": "high",
                "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 212.57 KB."
              },
              {
                "title": "Lazy-load offscreen images",
                "urgency": "high",
                "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 386.10 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: 285.26 KB."
              }
            ]
          },
          {
            "url": "https://barcelona.cat/ca/que-pots-fer-a-bcn/banys-i-platges",
            "securityScore": 59,
            "dependencyScore": 10,
            "expectedFilesScore": 25,
            "compressionScore": 68,
            "optimizationScore": 100,
            "offlineScore": 100,
            "languageScore": 0,
            "mediaHintsScore": 26,
            "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: 3.78 MB."
              },
              {
                "title": "Improve image encoding quality/size",
                "urgency": "high",
                "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 879.22 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: 3.78 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.60 MB."
              }
            ]
          },
          {
            "url": "https://barcelona.cat/capdesetmana/ca/",
            "securityScore": 59,
            "dependencyScore": 10,
            "expectedFilesScore": 25,
            "compressionScore": 43,
            "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: 596.62 KB."
              },
              {
                "title": "Improve image encoding quality/size",
                "urgency": "high",
                "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 168.83 KB."
              },
              {
                "title": "Minify JavaScript before transfer",
                "urgency": "low",
                "detail": "Minify JS bundles so transport compression produces better results with fewer bytes. Estimated savings: 7.73 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: 596.62 KB."
              }
            ]
          },
          {
            "url": "https://barcelona.cat/en/what-to-do-in-bcn/montjuic-park/activities/list",
            "securityScore": 59,
            "dependencyScore": 10,
            "expectedFilesScore": 25,
            "compressionScore": 43,
            "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: 464.89 KB."
              },
              {
                "title": "Improve image encoding quality/size",
                "urgency": "high",
                "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 163.85 KB."
              },
              {
                "title": "Lazy-load offscreen images",
                "urgency": "high",
                "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 676.10 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: 464.89 KB."
              }
            ]
          },
          {
            "url": "https://barcelona.cat/es/que-hacer-en-bcn/fuente-magica/horarios-de-la-fuente-magica",
            "securityScore": 59,
            "dependencyScore": 10,
            "expectedFilesScore": 25,
            "compressionScore": 57,
            "optimizationScore": 100,
            "offlineScore": 100,
            "languageScore": 0,
            "mediaHintsScore": 35,
            "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.36 MB."
              },
              {
                "title": "Improve image encoding quality/size",
                "urgency": "high",
                "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 479.07 KB."
              },
              {
                "title": "Enable Brotli/gzip for text assets",
                "urgency": "low",
                "detail": "Compress HTML, CSS, JS, JSON, SVG, and XML responses with Brotli or gzip. Estimated savings: 17.64 KB."
              },
              {
                "title": "Minify JavaScript before transfer",
                "urgency": "low",
                "detail": "Minify JS bundles so transport compression produces better results with fewer bytes. Estimated savings: 4.20 KB."
              }
            ]
          },
          {
            "url": "https://barcelona.cat/ca/que-pots-fer-a-bcn/llistat",
            "securityScore": 59,
            "dependencyScore": 10,
            "expectedFilesScore": 25,
            "compressionScore": 41,
            "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: 408.84 KB."
              },
              {
                "title": "Improve image encoding quality/size",
                "urgency": "medium",
                "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 145.85 KB."
              },
              {
                "title": "Lazy-load offscreen images",
                "urgency": "high",
                "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 615.33 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: 408.84 KB."
              }
            ]
          },
          {
            "url": "https://barcelona.cat/en/what-to-do-in-bcn/parks-and-gardens/belvederes",
            "securityScore": 59,
            "dependencyScore": 10,
            "expectedFilesScore": 25,
            "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: 229.64 KB."
              },
              {
                "title": "Improve image encoding quality/size",
                "urgency": "high",
                "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 168.10 KB."
              },
              {
                "title": "Enable Brotli/gzip for text assets",
                "urgency": "low",
                "detail": "Compress HTML, CSS, JS, JSON, SVG, and XML responses with Brotli or gzip. Estimated savings: 18.04 KB."
              },
              {
                "title": "Lazy-load offscreen images",
                "urgency": "high",
                "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 246.33 KB."
              }
            ]
          },
          {
            "url": "https://barcelona.cat/en/discoverbcn/pics",
            "securityScore": 59,
            "dependencyScore": 10,
            "expectedFilesScore": 25,
            "compressionScore": 52,
            "optimizationScore": 100,
            "offlineScore": 100,
            "languageScore": 0,
            "mediaHintsScore": 29,
            "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: 804.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: 295.32 KB."
              },
              {
                "title": "Minify JavaScript before transfer",
                "urgency": "low",
                "detail": "Minify JS bundles so transport compression produces better results with fewer bytes. Estimated savings: 5.93 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: 804.59 KB."
              }
            ]
          },
          {
            "url": "https://barcelona.cat/en",
            "securityScore": 59,
            "dependencyScore": 10,
            "expectedFilesScore": 25,
            "compressionScore": 58,
            "optimizationScore": 100,
            "offlineScore": 100,
            "languageScore": 0,
            "mediaHintsScore": 20,
            "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: 3.07 MB."
              },
              {
                "title": "Improve image encoding quality/size",
                "urgency": "high",
                "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 1.90 MB."
              },
              {
                "title": "Minify JavaScript before transfer",
                "urgency": "high",
                "detail": "Minify JS bundles so transport compression produces better results with fewer bytes. Estimated savings: 85.20 KB."
              },
              {
                "title": "Enable Brotli/gzip for text assets",
                "urgency": "low",
                "detail": "Compress HTML, CSS, JS, JSON, SVG, and XML responses with Brotli or gzip. Estimated savings: 4.83 KB."
              }
            ]
          },
          {
            "url": "https://barcelona.cat/en/what-to-do-in-bcn/festes-majors",
            "securityScore": 59,
            "dependencyScore": 10,
            "expectedFilesScore": 25,
            "compressionScore": 28,
            "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: 180.80 KB."
              },
              {
                "title": "Improve image encoding quality/size",
                "urgency": "medium",
                "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 79.23 KB."
              },
              {
                "title": "Enable Brotli/gzip for text assets",
                "urgency": "medium",
                "detail": "Compress HTML, CSS, JS, JSON, SVG, and XML responses with Brotli or gzip. Estimated savings: 32.97 KB."
              },
              {
                "title": "Eliminate render-blocking resources",
                "urgency": "high",
                "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering. Estimated render unblocking: 1595 ms."
              }
            ]
          },
          {
            "url": "https://barcelona.cat/en/what-to-do-in-bcn/get-fit/sports-facilities",
            "securityScore": 59,
            "dependencyScore": 10,
            "expectedFilesScore": 25,
            "compressionScore": 28,
            "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: 97.24 KB."
              },
              {
                "title": "Enable Brotli/gzip for text assets",
                "urgency": "medium",
                "detail": "Compress HTML, CSS, JS, JSON, SVG, and XML responses with Brotli or gzip. Estimated savings: 85.81 KB."
              },
              {
                "title": "Improve image encoding quality/size",
                "urgency": "medium",
                "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 77.76 KB."
              },
              {
                "title": "Eliminate render-blocking resources",
                "urgency": "high",
                "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering. Estimated render unblocking: 1958 ms."
              }
            ]
          },
          {
            "url": "https://barcelona.cat/",
            "securityScore": 59,
            "dependencyScore": 10,
            "expectedFilesScore": 25,
            "compressionScore": 57,
            "optimizationScore": 100,
            "offlineScore": 100,
            "languageScore": 0,
            "mediaHintsScore": 20,
            "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: 3.07 MB."
              },
              {
                "title": "Improve image encoding quality/size",
                "urgency": "high",
                "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 1.90 MB."
              },
              {
                "title": "Minify JavaScript before transfer",
                "urgency": "high",
                "detail": "Minify JS bundles so transport compression produces better results with fewer bytes. Estimated savings: 85.21 KB."
              },
              {
                "title": "Enable Brotli/gzip for text assets",
                "urgency": "low",
                "detail": "Compress HTML, CSS, JS, JSON, SVG, and XML responses with Brotli or gzip. Estimated savings: 4.86 KB."
              }
            ]
          },
          {
            "url": "https://barcelona.cat/ca",
            "securityScore": 59,
            "dependencyScore": 10,
            "expectedFilesScore": 25,
            "compressionScore": 57,
            "optimizationScore": 100,
            "offlineScore": 100,
            "languageScore": 0,
            "mediaHintsScore": 20,
            "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: 3.07 MB."
              },
              {
                "title": "Improve image encoding quality/size",
                "urgency": "high",
                "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 1.90 MB."
              },
              {
                "title": "Minify JavaScript before transfer",
                "urgency": "high",
                "detail": "Minify JS bundles so transport compression produces better results with fewer bytes. Estimated savings: 85.20 KB."
              },
              {
                "title": "Enable Brotli/gzip for text assets",
                "urgency": "low",
                "detail": "Compress HTML, CSS, JS, JSON, SVG, and XML responses with Brotli or gzip. Estimated savings: 4.86 KB."
              }
            ]
          },
          {
            "url": "https://barcelona.cat/es",
            "securityScore": 59,
            "dependencyScore": 10,
            "expectedFilesScore": 25,
            "compressionScore": 57,
            "optimizationScore": 100,
            "offlineScore": 100,
            "languageScore": 0,
            "mediaHintsScore": 20,
            "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: 3.07 MB."
              },
              {
                "title": "Improve image encoding quality/size",
                "urgency": "high",
                "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 1.90 MB."
              },
              {
                "title": "Minify JavaScript before transfer",
                "urgency": "high",
                "detail": "Minify JS bundles so transport compression produces better results with fewer bytes. Estimated savings: 85.20 KB."
              },
              {
                "title": "Enable Brotli/gzip for text assets",
                "urgency": "low",
                "detail": "Compress HTML, CSS, JS, JSON, SVG, and XML responses with Brotli or gzip. Estimated savings: 4.86 KB."
              }
            ]
          },
          {
            "url": "https://barcelona.cat/ca/que-pots-fer-a-bcn/posat-en-forma/installacions-esportives",
            "securityScore": 59,
            "dependencyScore": 10,
            "expectedFilesScore": 25,
            "compressionScore": 27,
            "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: 97.24 KB."
              },
              {
                "title": "Enable Brotli/gzip for text assets",
                "urgency": "medium",
                "detail": "Compress HTML, CSS, JS, JSON, SVG, and XML responses with Brotli or gzip. Estimated savings: 86.13 KB."
              },
              {
                "title": "Improve image encoding quality/size",
                "urgency": "medium",
                "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 77.76 KB."
              },
              {
                "title": "Eliminate render-blocking resources",
                "urgency": "high",
                "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering. Estimated render unblocking: 1564 ms."
              }
            ]
          },
          {
            "url": "https://barcelona.cat/es/que-hacer-en-bcn/ponte-en-forma/clubes",
            "securityScore": 59,
            "dependencyScore": 10,
            "expectedFilesScore": 25,
            "compressionScore": 23,
            "optimizationScore": 100,
            "offlineScore": 100,
            "languageScore": 0,
            "mediaHintsScore": 50,
            "urgency": "high",
            "topRecommendations": [
              {
                "title": "Enable Brotli/gzip for text assets",
                "urgency": "medium",
                "detail": "Compress HTML, CSS, JS, JSON, SVG, and XML responses with Brotli or gzip. Estimated savings: 82.46 KB."
              },
              {
                "title": "Use modern image compression formats",
                "urgency": "medium",
                "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size. Estimated savings: 70.71 KB."
              },
              {
                "title": "Improve image encoding quality/size",
                "urgency": "medium",
                "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 56.67 KB."
              },
              {
                "title": "Eliminate render-blocking resources",
                "urgency": "high",
                "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering. Estimated render unblocking: 1647 ms."
              }
            ]
          },
          {
            "url": "https://barcelona.cat/ca/que-pots-fer-a-bcn/parcs-i-jardins/parcs-forestals",
            "securityScore": 59,
            "dependencyScore": 10,
            "expectedFilesScore": 25,
            "compressionScore": 22,
            "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: 140.47 KB."
              },
              {
                "title": "Improve image encoding quality/size",
                "urgency": "medium",
                "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 69.00 KB."
              },
              {
                "title": "Lazy-load offscreen images",
                "urgency": "high",
                "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 211.18 KB."
              },
              {
                "title": "Eliminate render-blocking resources",
                "urgency": "high",
                "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering. Estimated render unblocking: 1608 ms."
              }
            ]
          },
          {
            "url": "https://barcelona.cat/es/que-hacer-en-bcn/parques-y-jardines/parques-forestales",
            "securityScore": 59,
            "dependencyScore": 10,
            "expectedFilesScore": 25,
            "compressionScore": 22,
            "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: 140.47 KB."
              },
              {
                "title": "Improve image encoding quality/size",
                "urgency": "medium",
                "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 69.00 KB."
              },
              {
                "title": "Lazy-load offscreen images",
                "urgency": "high",
                "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 211.18 KB."
              },
              {
                "title": "Eliminate render-blocking resources",
                "urgency": "high",
                "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering. Estimated render unblocking: 1592 ms."
              }
            ]
          },
          {
            "url": "https://barcelona.cat/es/que-hacer-en-bcn/cultura/teatros",
            "securityScore": 59,
            "dependencyScore": 10,
            "expectedFilesScore": 25,
            "compressionScore": 20,
            "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: 94.65 KB."
              },
              {
                "title": "Improve image encoding quality/size",
                "urgency": "medium",
                "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 73.12 KB."
              },
              {
                "title": "Eliminate render-blocking resources",
                "urgency": "high",
                "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering. Estimated render unblocking: 1032 ms."
              },
              {
                "title": "Lazy-load offscreen images",
                "urgency": "medium",
                "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 117.07 KB."
              }
            ]
          },
          {
            "url": "https://barcelona.cat/en/what-to-do-in-bcn/culture/theatres",
            "securityScore": 59,
            "dependencyScore": 10,
            "expectedFilesScore": 25,
            "compressionScore": 20,
            "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: 94.65 KB."
              },
              {
                "title": "Improve image encoding quality/size",
                "urgency": "medium",
                "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 73.12 KB."
              },
              {
                "title": "Eliminate render-blocking resources",
                "urgency": "high",
                "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering. Estimated render unblocking: 1598 ms."
              },
              {
                "title": "Lazy-load offscreen images",
                "urgency": "medium",
                "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 117.07 KB."
              }
            ]
          },
          {
            "url": "https://barcelona.cat/es/blogoteca/condiciones-uso",
            "securityScore": 59,
            "dependencyScore": 10,
            "expectedFilesScore": 25,
            "compressionScore": 18,
            "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: 70.71 KB."
              },
              {
                "title": "Improve image encoding quality/size",
                "urgency": "medium",
                "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 68.86 KB."
              },
              {
                "title": "Eliminate render-blocking resources",
                "urgency": "high",
                "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering. Estimated render unblocking: 1487 ms."
              },
              {
                "title": "Lazy-load offscreen images",
                "urgency": "medium",
                "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 85.07 KB."
              }
            ]
          },
          {
            "url": "https://barcelona.cat/en/what-to-do-in-bcn/summer/outdoor-films",
            "securityScore": 59,
            "dependencyScore": 10,
            "expectedFilesScore": 25,
            "compressionScore": 18,
            "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: 83.64 KB."
              },
              {
                "title": "Improve image encoding quality/size",
                "urgency": "medium",
                "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 56.67 KB."
              },
              {
                "title": "Enable Brotli/gzip for text assets",
                "urgency": "low",
                "detail": "Compress HTML, CSS, JS, JSON, SVG, and XML responses with Brotli or gzip. Estimated savings: 16.11 KB."
              },
              {
                "title": "Eliminate render-blocking resources",
                "urgency": "high",
                "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering. Estimated render unblocking: 1931 ms."
              }
            ]
          },
          {
            "url": "https://barcelona.cat/es/que-hacer-en-bcn/ponte-en-forma/clubs-asociaciones-y-penas",
            "securityScore": 59,
            "dependencyScore": 10,
            "expectedFilesScore": 25,
            "compressionScore": 18,
            "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: 70.71 KB."
              },
              {
                "title": "Improve image encoding quality/size",
                "urgency": "medium",
                "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 56.67 KB."
              },
              {
                "title": "Enable Brotli/gzip for text assets",
                "urgency": "low",
                "detail": "Compress HTML, CSS, JS, JSON, SVG, and XML responses with Brotli or gzip. Estimated savings: 24.83 KB."
              },
              {
                "title": "Eliminate render-blocking resources",
                "urgency": "high",
                "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering. Estimated render unblocking: 1596 ms."
              }
            ]
          },
          {
            "url": "https://barcelona.cat/es/que-hacer-en-bcn/ponte-en-forma/federaciones",
            "securityScore": 59,
            "dependencyScore": 10,
            "expectedFilesScore": 25,
            "compressionScore": 18,
            "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: 70.71 KB."
              },
              {
                "title": "Improve image encoding quality/size",
                "urgency": "medium",
                "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 56.67 KB."
              },
              {
                "title": "Enable Brotli/gzip for text assets",
                "urgency": "low",
                "detail": "Compress HTML, CSS, JS, JSON, SVG, and XML responses with Brotli or gzip. Estimated savings: 23.11 KB."
              },
              {
                "title": "Eliminate render-blocking resources",
                "urgency": "high",
                "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering. Estimated render unblocking: 1588 ms."
              }
            ]
          },
          {
            "url": "https://barcelona.cat/en/living-in-bcn/environment-and-sustainability/list-containers",
            "securityScore": 59,
            "dependencyScore": 10,
            "expectedFilesScore": 25,
            "compressionScore": 18,
            "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: 70.71 KB."
              },
              {
                "title": "Improve image encoding quality/size",
                "urgency": "medium",
                "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 56.67 KB."
              },
              {
                "title": "Enable Brotli/gzip for text assets",
                "urgency": "low",
                "detail": "Compress HTML, CSS, JS, JSON, SVG, and XML responses with Brotli or gzip. Estimated savings: 19.93 KB."
              },
              {
                "title": "Eliminate render-blocking resources",
                "urgency": "high",
                "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering. Estimated render unblocking: 1025 ms."
              }
            ]
          },
          {
            "url": "https://barcelona.cat/ca/prova-video",
            "securityScore": 59,
            "dependencyScore": 10,
            "expectedFilesScore": 25,
            "compressionScore": 17,
            "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: 70.71 KB."
              },
              {
                "title": "Improve image encoding quality/size",
                "urgency": "medium",
                "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 56.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: 85.07 KB."
              },
              {
                "title": "Remove unused CSS",
                "urgency": "medium",
                "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 79.88 KB."
              }
            ]
          },
          {
            "url": "https://barcelona.cat/en/catalan-national-day-2022",
            "securityScore": 59,
            "dependencyScore": 10,
            "expectedFilesScore": 25,
            "compressionScore": 22,
            "optimizationScore": 100,
            "offlineScore": 100,
            "languageScore": 0,
            "mediaHintsScore": 45,
            "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: 122.82 KB."
              },
              {
                "title": "Improve image encoding quality/size",
                "urgency": "medium",
                "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 56.67 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: 122.82 KB."
              },
              {
                "title": "Lazy-load offscreen images",
                "urgency": "medium",
                "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 85.07 KB."
              }
            ]
          },
          {
            "url": "https://barcelona.cat/en/pagina-exemple-mapa-sant-jordi",
            "securityScore": 59,
            "dependencyScore": 10,
            "expectedFilesScore": 25,
            "compressionScore": 17,
            "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: 70.71 KB."
              },
              {
                "title": "Improve image encoding quality/size",
                "urgency": "medium",
                "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 56.67 KB."
              },
              {
                "title": "Eliminate render-blocking resources",
                "urgency": "high",
                "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering. Estimated render unblocking: 1482 ms."
              },
              {
                "title": "Lazy-load offscreen images",
                "urgency": "medium",
                "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 85.07 KB."
              }
            ]
          },
          {
            "url": "https://barcelona.cat/es/diada-nacional-de-cataluna-2022",
            "securityScore": 59,
            "dependencyScore": 10,
            "expectedFilesScore": 25,
            "compressionScore": 22,
            "optimizationScore": 100,
            "offlineScore": 100,
            "languageScore": 0,
            "mediaHintsScore": 45,
            "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: 126.27 KB."
              },
              {
                "title": "Improve image encoding quality/size",
                "urgency": "medium",
                "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 56.67 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: 126.27 KB."
              },
              {
                "title": "Lazy-load offscreen images",
                "urgency": "medium",
                "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 81.70 KB."
              }
            ]
          },
          {
            "url": "https://barcelona.cat/es/aviso-legal/banoasistido",
            "securityScore": 59,
            "dependencyScore": 10,
            "expectedFilesScore": 25,
            "compressionScore": 17,
            "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: 70.71 KB."
              },
              {
                "title": "Improve image encoding quality/size",
                "urgency": "medium",
                "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 56.67 KB."
              },
              {
                "title": "Eliminate render-blocking resources",
                "urgency": "high",
                "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering. Estimated render unblocking: 1483 ms."
              },
              {
                "title": "Lazy-load offscreen images",
                "urgency": "medium",
                "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 85.07 KB."
              }
            ]
          },
          {
            "url": "https://barcelona.cat/en/what-to-do-in-bcn/parks-and-gardens/childrens-play-areas",
            "securityScore": 59,
            "dependencyScore": 10,
            "expectedFilesScore": 25,
            "compressionScore": 16,
            "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: 70.71 KB."
              },
              {
                "title": "Improve image encoding quality/size",
                "urgency": "medium",
                "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 56.67 KB."
              },
              {
                "title": "Eliminate render-blocking resources",
                "urgency": "high",
                "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering. Estimated render unblocking: 1649 ms."
              },
              {
                "title": "Remove unused CSS",
                "urgency": "medium",
                "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 89.87 KB."
              }
            ]
          },
          {
            "url": "https://barcelona.cat/en/what-to-do-in-bcn/culture/cinemas",
            "securityScore": 59,
            "dependencyScore": 10,
            "expectedFilesScore": 25,
            "compressionScore": 16,
            "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: 70.71 KB."
              },
              {
                "title": "Improve image encoding quality/size",
                "urgency": "medium",
                "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 56.67 KB."
              },
              {
                "title": "Eliminate render-blocking resources",
                "urgency": "high",
                "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering. Estimated render unblocking: 1642 ms."
              },
              {
                "title": "Remove unused CSS",
                "urgency": "medium",
                "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 89.76 KB."
              }
            ]
          },
          {
            "url": "https://barcelona.cat/en/what-to-do-in-bcn/summer/municipal-tax-office",
            "securityScore": 59,
            "dependencyScore": 10,
            "expectedFilesScore": 25,
            "compressionScore": 16,
            "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: 70.71 KB."
              },
              {
                "title": "Improve image encoding quality/size",
                "urgency": "medium",
                "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 56.67 KB."
              },
              {
                "title": "Eliminate render-blocking resources",
                "urgency": "high",
                "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering. Estimated render unblocking: 1624 ms."
              },
              {
                "title": "Remove unused CSS",
                "urgency": "medium",
                "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 90.01 KB."
              }
            ]
          },
          {
            "url": "https://barcelona.cat/es/conocebcn/ciutadelladelconocimiento/polo-de-biociencia-del-csic",
            "securityScore": 59,
            "dependencyScore": 10,
            "expectedFilesScore": 25,
            "compressionScore": 46,
            "optimizationScore": 100,
            "offlineScore": 100,
            "languageScore": 0,
            "mediaHintsScore": 20,
            "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: 251.85 KB."
              },
              {
                "title": "Improve image encoding quality/size",
                "urgency": "high",
                "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 213.89 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: 251.85 KB."
              },
              {
                "title": "Compress oversized image assets",
                "urgency": "high",
                "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 213.89 KB."
              }
            ]
          },
          {
            "url": "https://barcelona.cat/ca/que-pots-fer-a-bcn/cultura/auditoris",
            "securityScore": 59,
            "dependencyScore": 10,
            "expectedFilesScore": 25,
            "compressionScore": 15,
            "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: 70.71 KB."
              },
              {
                "title": "Improve image encoding quality/size",
                "urgency": "medium",
                "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 56.67 KB."
              },
              {
                "title": "Eliminate render-blocking resources",
                "urgency": "high",
                "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering. Estimated render unblocking: 2093 ms."
              },
              {
                "title": "Remove unused CSS",
                "urgency": "medium",
                "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 89.76 KB."
              }
            ]
          },
          {
            "url": "https://barcelona.cat/ca/que-pots-fer-a-bcn/estiu/oficines-de-tramitacio-del-dni-i-passaport",
            "securityScore": 59,
            "dependencyScore": 10,
            "expectedFilesScore": 25,
            "compressionScore": 15,
            "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: 70.71 KB."
              },
              {
                "title": "Improve image encoding quality/size",
                "urgency": "medium",
                "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 56.67 KB."
              },
              {
                "title": "Eliminate render-blocking resources",
                "urgency": "high",
                "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering. Estimated render unblocking: 1790 ms."
              },
              {
                "title": "Remove unused CSS",
                "urgency": "medium",
                "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 90.01 KB."
              }
            ]
          },
          {
            "url": "https://barcelona.cat/ca/diada-nacional-de-catalunya-2022",
            "securityScore": 59,
            "dependencyScore": 10,
            "expectedFilesScore": 25,
            "compressionScore": 19,
            "optimizationScore": 100,
            "offlineScore": 100,
            "languageScore": 0,
            "mediaHintsScore": 45,
            "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: 96.72 KB."
              },
              {
                "title": "Improve image encoding quality/size",
                "urgency": "medium",
                "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 56.67 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: 96.72 KB."
              },
              {
                "title": "Lazy-load offscreen images",
                "urgency": "medium",
                "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 81.70 KB."
              }
            ]
          },
          {
            "url": "https://barcelona.cat/es/conocebcn/ciutadelladelconocimiento/biblioteca-central",
            "securityScore": 59,
            "dependencyScore": 10,
            "expectedFilesScore": 25,
            "compressionScore": 38,
            "optimizationScore": 100,
            "offlineScore": 100,
            "languageScore": 0,
            "mediaHintsScore": 20,
            "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: 212.27 KB."
              },
              {
                "title": "Improve image encoding quality/size",
                "urgency": "high",
                "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 171.82 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: 212.27 KB."
              },
              {
                "title": "Eliminate render-blocking resources",
                "urgency": "high",
                "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering. Estimated render unblocking: 1637 ms."
              }
            ]
          },
          {
            "url": "https://barcelona.cat/en/living-in-bcn/catalan-national-day-2019/public-transport-11-september-2022-catalan-national-day",
            "securityScore": 59,
            "dependencyScore": 10,
            "expectedFilesScore": 25,
            "compressionScore": 6,
            "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: 70.71 KB."
              },
              {
                "title": "Improve image encoding quality/size",
                "urgency": "medium",
                "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 56.67 KB."
              },
              {
                "title": "Eliminate render-blocking resources",
                "urgency": "high",
                "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering. Estimated render unblocking: 1640 ms."
              },
              {
                "title": "Remove unused CSS",
                "urgency": "medium",
                "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 79.69 KB."
              }
            ]
          },
          {
            "url": "https://barcelona.cat/en/what-to-do-in-bcn/magic-fountain/choreographies-magic-fountain",
            "securityScore": 59,
            "dependencyScore": 10,
            "expectedFilesScore": 25,
            "compressionScore": 15,
            "optimizationScore": 100,
            "offlineScore": 100,
            "languageScore": 0,
            "mediaHintsScore": 39,
            "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: 70.71 KB."
              },
              {
                "title": "Improve image encoding quality/size",
                "urgency": "medium",
                "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 56.67 KB."
              },
              {
                "title": "Eliminate render-blocking resources",
                "urgency": "high",
                "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering. Estimated render unblocking: 1493 ms."
              },
              {
                "title": "Lazy-load offscreen images",
                "urgency": "medium",
                "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 85.07 KB."
              }
            ]
          },
          {
            "url": "https://barcelona.cat/ca/viure-a-bcn/diada/transports-publics-durant-la-diada-2024",
            "securityScore": 59,
            "dependencyScore": 10,
            "expectedFilesScore": 25,
            "compressionScore": 6,
            "optimizationScore": 100,
            "offlineScore": 100,
            "languageScore": 0,
            "mediaHintsScore": 46,
            "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: 70.71 KB."
              },
              {
                "title": "Improve image encoding quality/size",
                "urgency": "medium",
                "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 56.67 KB."
              },
              {
                "title": "Remove unused CSS",
                "urgency": "medium",
                "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 79.51 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: 70.71 KB."
              }
            ]
          }
        ]
      }
    ]
  },
  "crossPagePatterns": {
    "heavyAssetPatterns": [
      {
        "key": "font|www.barcelona.cat|/assetsdi",
        "label": "font assets from www.barcelona.cat/assetsdi",
        "resourceType": "font",
        "domain": "www.barcelona.cat",
        "pageCount": 96,
        "totalTransferBytes": 13966134,
        "exampleUrl": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk"
      },
      {
        "key": "script|cdn.matomo.cloud|/dadesbcn.matomo.cloud",
        "label": "script assets from cdn.matomo.cloud/dadesbcn.matomo.cloud",
        "resourceType": "script",
        "domain": "cdn.matomo.cloud",
        "pageCount": 95,
        "totalTransferBytes": 7260561,
        "exampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js"
      },
      {
        "key": "stylesheet|www.barcelona.cat|/sites",
        "label": "stylesheet assets from www.barcelona.cat/sites",
        "resourceType": "stylesheet",
        "domain": "www.barcelona.cat",
        "pageCount": 95,
        "totalTransferBytes": 4789392,
        "exampleUrl": "https://www.barcelona.cat/sites/default/files/css/css_qDD4BCxE8K-iT7MRORwp32v03DlJblP9-xrYwOBWlQo.css?delta=5&language=en&theme=barcelonacat_theme&include=eJyFz8GOwyAMBNAfCuXQD0ID8SasiI2wSZu_X6RKXa3EqidbM-8y-O5sOIgt4Mwq6l_HoeYloiUqwkiwICe1lldSP3R3JlJG_5-p2MidmR5_ge10kI8iptZQQ1p5Br7A6YrynHVbkYji1K6SeZuJnMThvWsm5FFmsUofWVCwhvsnUJssMXEYrMG_v0BPo8YoS0XDNkbu6tfWK8rtN7l1rj2WrDuti15qdPgIpR8d6Z1O&tcut5n"
      },
      {
        "key": "image|www.barcelona.cat|/sites",
        "label": "image assets from www.barcelona.cat/sites",
        "resourceType": "image",
        "domain": "www.barcelona.cat",
        "pageCount": 61,
        "totalTransferBytes": 59333326,
        "exampleUrl": "https://www.barcelona.cat/sites/default/files/platja_1920x540.jpg"
      },
      {
        "key": "script|www.barcelona.cat|/estatics",
        "label": "script assets from www.barcelona.cat/estatics",
        "resourceType": "script",
        "domain": "www.barcelona.cat",
        "pageCount": 8,
        "totalTransferBytes": 3281535,
        "exampleUrl": "https://www.barcelona.cat/estatics/geobcn/1.2/api-full-ca.js"
      },
      {
        "key": "script|maps.googleapis.com|/maps",
        "label": "script assets from maps.googleapis.com/maps",
        "resourceType": "script",
        "domain": "maps.googleapis.com",
        "pageCount": 6,
        "totalTransferBytes": 1107365,
        "exampleUrl": "https://maps.googleapis.com/maps/api/js?key=AIzaSyA1hYiZ1NN9YNkxQPWfVHYhI7hmS1JLlLI&libraries=places%2Cgeometry&language=ca&v=3.47&callback=vueGoogleMapsInit"
      },
      {
        "key": "script|www.barcelona.cat|/estatics-planol",
        "label": "script assets from www.barcelona.cat/estatics-planol",
        "resourceType": "script",
        "domain": "www.barcelona.cat",
        "pageCount": 5,
        "totalTransferBytes": 720313,
        "exampleUrl": "https://www.barcelona.cat/estatics-planol/v1.2/library/jquery-ui-1.10.4.js"
      },
      {
        "key": "image|media-edg.barcelona.cat|/wp-content",
        "label": "image assets from media-edg.barcelona.cat/wp-content",
        "resourceType": "image",
        "domain": "media-edg.barcelona.cat",
        "pageCount": 4,
        "totalTransferBytes": 2967475,
        "exampleUrl": "https://media-edg.barcelona.cat/wp-content/uploads/2026/03/26182455/Obres-Endesa-Miramar-Tarongers-570x321.png"
      },
      {
        "key": "xhr|api.com-shi-va.barcelona.cat|/other_bus",
        "label": "xhr assets from api.com-shi-va.barcelona.cat/other_bus",
        "resourceType": "xhr",
        "domain": "api.com-shi-va.barcelona.cat",
        "pageCount": 4,
        "totalTransferBytes": 2919443,
        "exampleUrl": "https://api.com-shi-va.barcelona.cat/other_bus/lines/?RECORRIDO=0&access_token=1UWeUzjkmvYh93M14bl7JvnNwVkJSK"
      },
      {
        "key": "script|mobile.com-shi-va.barcelona.cat|/assets",
        "label": "script assets from mobile.com-shi-va.barcelona.cat/assets",
        "resourceType": "script",
        "domain": "mobile.com-shi-va.barcelona.cat",
        "pageCount": 4,
        "totalTransferBytes": 2862616,
        "exampleUrl": "https://mobile.com-shi-va.barcelona.cat/assets/index-CiPq0rWH.js"
      }
    ],
    "recurringTargets": [
      {
        "title": "Defer non-critical UI modules until after first render",
        "urgency": "high",
        "pageCount": 100,
        "totalEstimatedSavingsBytes": 0,
        "strategy": "Keep only above-the-fold resources in the initial path; hydrate or import secondary modules later."
      },
      {
        "title": "Lazy-load offscreen images and media galleries",
        "urgency": "high",
        "pageCount": 87,
        "totalEstimatedSavingsBytes": 14684493,
        "strategy": "Load imagery only when it enters the viewport or when a user opens the relevant section."
      },
      {
        "title": "Modularize heavy image asset from www.barcelona.cat",
        "urgency": "high",
        "pageCount": 63,
        "totalEstimatedSavingsBytes": 20409176,
        "strategy": "Serve a smaller placeholder first and load this asset only when the user scrolls to or requests the component."
      },
      {
        "title": "Modularize heavy font asset from www.barcelona.cat",
        "urgency": "medium",
        "pageCount": 59,
        "totalEstimatedSavingsBytes": 5343056,
        "strategy": "Subset or defer this font so full font payloads are only fetched when needed."
      },
      {
        "title": "Split JavaScript by route or interaction",
        "urgency": "high",
        "pageCount": 52,
        "totalEstimatedSavingsBytes": 11951915,
        "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 cdn.matomo.cloud",
        "urgency": "medium",
        "pageCount": 50,
        "totalEstimatedSavingsBytes": 3821432,
        "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles."
      },
      {
        "title": "Modularize heavy xhr asset from api.com-shi-va.barcelona.cat",
        "urgency": "high",
        "pageCount": 4,
        "totalEstimatedSavingsBytes": 2919443,
        "strategy": "Move this asset behind an explicit interaction, route boundary, or lazy-loading trigger."
      },
      {
        "title": "Modularize heavy script asset from mobile.com-shi-va.barcelona.cat",
        "urgency": "high",
        "pageCount": 4,
        "totalEstimatedSavingsBytes": 2862616,
        "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles."
      },
      {
        "title": "Modularize heavy image asset from media-edg.barcelona.cat",
        "urgency": "high",
        "pageCount": 4,
        "totalEstimatedSavingsBytes": 1628663,
        "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.barcelona.cat",
        "urgency": "high",
        "pageCount": 3,
        "totalEstimatedSavingsBytes": 835665,
        "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles."
      }
    ],
    "recurringOrigins": [
      {
        "domain": "www.barcelona.cat",
        "pageCount": 100,
        "totalTransferBytes": 84931999
      },
      {
        "domain": "cdn.matomo.cloud",
        "pageCount": 99,
        "totalTransferBytes": 7566603
      },
      {
        "domain": "maps.googleapis.com",
        "pageCount": 6,
        "totalTransferBytes": 1252427
      },
      {
        "domain": "api.com-shi-va.barcelona.cat",
        "pageCount": 4,
        "totalTransferBytes": 4032357
      },
      {
        "domain": "mobile.com-shi-va.barcelona.cat",
        "pageCount": 4,
        "totalTransferBytes": 3746256
      },
      {
        "domain": "media-edg.barcelona.cat",
        "pageCount": 4,
        "totalTransferBytes": 2967475
      },
      {
        "domain": "com-shi-va.barcelona.cat",
        "pageCount": 4,
        "totalTransferBytes": 2433643
      },
      {
        "domain": "releases.jquery.com",
        "pageCount": 4,
        "totalTransferBytes": 506659
      }
    ],
    "designSystemGuidance": [
      "This same heavy image pattern appears on 63 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.barcelona.cat recur across 100 pages. Review whether that dependency should be deferred, optimized, or loaded conditionally."
    ]
  },
  "results": [
    {
      "url": "https://barcelona.cat/",
      "status": "ok",
      "finalUrl": "https://www.barcelona.cat/ca",
      "performanceScore": 0.15,
      "bestPracticesScore": 0.79,
      "transferBytes": 9310236,
      "co2Grams": 3.5665782412104,
      "greenWeb": {
        "page": {
          "hostname": "www.barcelona.cat",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-13T22:38:00.231825",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.barcelona.cat",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "mobile.com-shi-va.barcelona.cat",
            "resourceType": "script",
            "requestCount": 4,
            "transferBytes": 727161,
            "sampleUrl": "https://mobile.com-shi-va.barcelona.cat/assets/index-CiPq0rWH.js",
            "greenCheck": {
              "hostname": "mobile.com-shi-va.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:58.833590",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/mobile.com-shi-va.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "com-shi-va.barcelona.cat",
            "resourceType": "script",
            "requestCount": 4,
            "transferBytes": 553469,
            "sampleUrl": "https://com-shi-va.barcelona.cat/assets/index-97beb0ec.js",
            "greenCheck": {
              "hostname": "com-shi-va.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:58.890330",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/com-shi-va.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "maps.googleapis.com",
            "resourceType": "script",
            "requestCount": 5,
            "transferBytes": 321498,
            "sampleUrl": "https://maps.googleapis.com/maps/api/js?key=AIzaSyA1hYiZ1NN9YNkxQPWfVHYhI7hmS1JLlLI&libraries=places%2Cgeometry&language=ca&v=3.47&callback=vueGoogleMapsInit",
            "greenCheck": {
              "hostname": "maps.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:28",
              "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/maps.googleapis.com",
              "error": null
            }
          },
          {
            "hostname": "mobile.com-shi-va.barcelona.cat",
            "resourceType": "stylesheet",
            "requestCount": 1,
            "transferBytes": 220925,
            "sampleUrl": "https://mobile.com-shi-va.barcelona.cat/assets/index-DFDXDFpa.css",
            "greenCheck": {
              "hostname": "mobile.com-shi-va.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:58.833590",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/mobile.com-shi-va.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 11,
            "transferBytes": 153569,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 147061,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "releases.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 126719,
            "sampleUrl": "https://releases.jquery.com/git/ui/jquery-ui-git.js",
            "greenCheck": {
              "hostname": "releases.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:38:00.162467",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/releases.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "com-shi-va.barcelona.cat",
            "resourceType": "stylesheet",
            "requestCount": 1,
            "transferBytes": 62187,
            "sampleUrl": "https://com-shi-va.barcelona.cat/assets/index-62bfe776.css",
            "greenCheck": {
              "hostname": "com-shi-va.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:58.890330",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/com-shi-va.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31747,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "stylesheet",
            "requestCount": 1,
            "transferBytes": 24705,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "cdnjs.cloudflare.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15910,
            "sampleUrl": "https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js",
            "greenCheck": {
              "hostname": "cdnjs.cloudflare.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:34",
              "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/cdnjs.cloudflare.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15565,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "stylesheet",
            "requestCount": 8,
            "transferBytes": 11115,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/css/bcn-avisos.css",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "www.youtube.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 11066,
            "sampleUrl": "https://www.youtube.com/iframe_api",
            "greenCheck": {
              "hostname": "www.youtube.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2026-01-10T15:09:17",
              "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.youtube.com",
              "error": null
            }
          },
          {
            "hostname": "fonts.googleapis.com",
            "resourceType": "stylesheet",
            "requestCount": 10,
            "transferBytes": 8873,
            "sampleUrl": "https://fonts.googleapis.com/css?family=Source+Sans+3:200,200i,300,300i,400,400i,500,500i,600,600i,700,700i,900,900i",
            "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
            }
          },
          {
            "hostname": "geoportal.barcelona.cat",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 8380,
            "sampleUrl": "https://geoportal.barcelona.cat/PlanolBCN/webconfig.js.ashx?lang=CA",
            "greenCheck": {
              "hostname": "geoportal.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.864845",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/geoportal.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5671,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 5,
            "transferBytes": 2862,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 3,
            "transferBytes": 808,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=iMz00G&url=https%3A%2F%2Fwww.barcelona.cat%2Fca",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 19,
          "greenCount": 7,
          "notGreenCount": 13,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 60,
        "urgency": "high",
        "pageElementOccurrences": 2,
        "uniqueElementsAssessed": 1,
        "reusedFromCacheCount": 0,
        "components": [
          {
            "signature": "form|get|/ca|input|text|query|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "text",
            "fieldName": "query",
            "formContext": "form|get|/ca",
            "hasLabel": true,
            "hasValidationRule": false,
            "hasErrorMessagingHook": false,
            "toolingFriendly": false,
            "assessment": {
              "score": 60,
              "urgency": "high",
              "issues": [
                "No explicit validation rule",
                "No error messaging hook",
                "Missing autocomplete for tooling support"
              ],
              "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.",
                "Provide meaningful autocomplete values to support browsers and assistive tooling."
              ]
            },
            "reusedFromCache": false
          }
        ],
        "recommendations": [
          {
            "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."
          },
          {
            "title": "Missing autocomplete for tooling support",
            "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": "El portal web oficial de Barcelona | Ajuntament de Barcelona",
          "lang": "ca",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "Portal oficial de Barcelona. Accediu als tràmits de l'administració, actualitat de serveis municipals, mobilitat, agenda cultural i recursos per viure i treballar a la ciutat.",
          "robots": "",
          "canonical": "https://www.barcelona.cat/ca",
          "ogTitle": "Barcelona.cat",
          "ogDescription": "Connecta amb Barcelona. Troba tota la informació pràctica per al dia a dia: des de tràmits i serveis públics fins a l'agenda de cultura i oci.",
          "ogType": "Web",
          "ogUrl": "https://www.barcelona.cat/ca/home",
          "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": 42,
        "urgency": "medium",
        "checks": {
          "testedMobile": true,
          "testedTablet": true,
          "horizontalOverflowOnMobile": false,
          "horizontalOverflowOnTablet": false,
          "mobileSmallTapTargets": 64,
          "tabletSmallTapTargets": 59,
          "fixedWidthOffenders": 6,
          "oversizedMedia": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 3,
            "smallTapTargets": 64,
            "oversizedMedia": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 3,
            "smallTapTargets": 59,
            "oversizedMedia": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 64 small targets on mobile and 59 on tablet."
          },
          {
            "title": "Refactor fixed-width components",
            "urgency": "medium",
            "detail": "6 element(s) exceeded viewport width in tested layouts; use responsive component constraints."
          }
        ]
      },
      "securityLight": {
        "score": 59,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": true,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": true,
          "externalScriptCount": 10,
          "externalScriptsWithoutIntegrity": 10,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "cache-control": "max-age=300, public",
            "content-encoding": "gzip",
            "content-language": "ca",
            "content-length": "17847",
            "content-type": "text/html; charset=UTF-8",
            "date": "Mon, 13 Apr 2026 22:37:55 GMT",
            "etag": "\"1776119874-gzip\"",
            "expires": "Sun, 19 Nov 1978 05:00:00 GMT",
            "last-modified": "Mon, 13 Apr 2026 22:37:54 GMT",
            "server": "nginx",
            "vary": "Cookie,Accept-Encoding",
            "via": "1.1 575693ca51d2d9242d8177dfeb274d24.cloudfront.net (CloudFront)",
            "x-amz-cf-id": "2gQVbI8ysTW5-FC1R3NGY-NCUXV4mUOJ0Lzmg2mPTTTA6hHoJyPxyg==",
            "x-amz-cf-pop": "IAD12-P5",
            "x-cache": "Miss from cloudfront",
            "x-content-type-options": "nosniff",
            "x-frame-options": "SAMEORIGIN",
            "x-generator": "Drupal 10 (https://www.drupal.org)"
          },
          "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": "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": "10 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 25,
        "urgency": "low",
        "origin": "https://www.barcelona.cat",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://www.barcelona.cat/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/sitemap.xml",
            "found": true,
            "status": 200,
            "contentType": "application/xml; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/manifest.webmanifest",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/favicon.ico",
            "found": true,
            "status": 200,
            "contentType": "image/x-icon"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "low",
            "detail": "Missing beneficial file(s): /.well-known/security.txt, /manifest.webmanifest."
          }
        ]
      },
      "mediaHints": {
        "score": 20,
        "urgency": "low",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 52,
          "imagesWithLazy": 28,
          "imagesWithoutLazy": 24
        },
        "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."
          }
        ]
      },
      "wsgCustom": {
        "score": 85,
        "urgency": "medium",
        "data": {
          "hasPrintStyles": true,
          "hasReducedMotion": true,
          "media": {
            "totalImages": 56,
            "lazyImages": 29,
            "totalIframes": 5,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "\"Source Sans Pro\", \"Helvetica Neue\", Helvetica, Arial, sans-serif",
            "usesSystemFont": true
          },
          "tracking": {
            "count": 0,
            "scripts": []
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 29/56 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": "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"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 57,
        "urgency": "medium",
        "totalEstimatedSavingsBytes": 5313604.5,
        "checks": {
          "hasEffectiveTextCompression": false
        },
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Use modern image compression formats",
            "urgency": "high",
            "estimatedSavingsBytes": 3222951.5,
            "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": 1994763,
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings."
          },
          {
            "id": "unminified-javascript",
            "title": "Minify JavaScript before transfer",
            "urgency": "high",
            "estimatedSavingsBytes": 87250,
            "detail": "Minify JS bundles so transport compression produces better results with fewer bytes."
          },
          {
            "id": "uses-text-compression",
            "title": "Enable Brotli/gzip for text assets",
            "urgency": "low",
            "estimatedSavingsBytes": 4973,
            "detail": "Compress HTML, CSS, JS, JSON, SVG, and XML responses with Brotli or gzip."
          },
          {
            "id": "unminified-css",
            "title": "Minify CSS before transfer",
            "urgency": "low",
            "estimatedSavingsBytes": 3667,
            "detail": "Minification amplifies compression efficiency and reduces payload 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: 3.07 MB."
          },
          {
            "title": "Improve image encoding quality/size",
            "urgency": "high",
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 1.90 MB."
          },
          {
            "title": "Minify JavaScript before transfer",
            "urgency": "high",
            "detail": "Minify JS bundles so transport compression produces better results with fewer bytes. Estimated savings: 85.21 KB."
          },
          {
            "title": "Enable Brotli/gzip for text assets",
            "urgency": "low",
            "detail": "Compress HTML, CSS, JS, JSON, SVG, and XML responses with Brotli or gzip. Estimated savings: 4.86 KB."
          },
          {
            "title": "Minify CSS before transfer",
            "urgency": "low",
            "detail": "Minification amplifies compression efficiency and reduces payload size. Estimated savings: 3.58 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": 7924659.5,
        "totalEstimatedBlockingMs": 531,
        "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": 3222951.5,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 3,147 KiB",
            "urgency": "high",
            "sourceAuditId": "modern-image-formats"
          },
          {
            "id": "uses-optimized-images",
            "title": "Compress oversized image assets",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss.",
            "estimatedSavingsBytes": 1994763,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 1,948 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": 1929764,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 1,885 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": 327666,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 320 KiB",
            "urgency": "high",
            "sourceAuditId": "unused-css-rules"
          },
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 271571,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 265 KiB",
            "urgency": "high",
            "sourceAuditId": "offscreen-images"
          },
          {
            "id": "unminified-javascript",
            "title": "Minify JavaScript",
            "detail": "Use minified production JS output to reduce payload size.",
            "estimatedSavingsBytes": 87250,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 85 KiB",
            "urgency": "high",
            "sourceAuditId": "unminified-javascript"
          },
          {
            "id": "uses-responsive-images",
            "title": "Right-size images for viewport",
            "detail": "Avoid sending larger images than the rendered size needs.",
            "estimatedSavingsBytes": 82054,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 80 KiB",
            "urgency": "medium",
            "sourceAuditId": "uses-responsive-images"
          },
          {
            "id": "render-blocking-resources",
            "title": "Eliminate render-blocking resources",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering.",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 531,
            "displayValue": "Est savings of 530 ms",
            "urgency": "medium",
            "sourceAuditId": "render-blocking-resources"
          },
          {
            "id": "uses-text-compression",
            "title": "Enable text compression",
            "detail": "Serve text assets with Brotli or gzip to remove avoidable transfer bloat.",
            "estimatedSavingsBytes": 4973,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 5 KiB",
            "urgency": "low",
            "sourceAuditId": "uses-text-compression"
          },
          {
            "id": "unminified-css",
            "title": "Minify CSS",
            "detail": "Use minified production CSS output to reduce bytes in transit.",
            "estimatedSavingsBytes": 3667,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 4 KiB",
            "urgency": "low",
            "sourceAuditId": "unminified-css"
          }
        ],
        "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: 3.07 MB."
          },
          {
            "title": "Compress oversized image assets",
            "urgency": "high",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 1.90 MB."
          },
          {
            "title": "Remove unused JavaScript",
            "urgency": "high",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 1.84 MB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "high",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 319.99 KB."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "high",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 265.21 KB."
          },
          {
            "title": "Minify JavaScript",
            "urgency": "high",
            "detail": "Use minified production JS output to reduce payload size. Estimated byte savings: 85.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": 10,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 10,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "10 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": 3099457.8694250463
        },
        "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.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: 2.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": 16,
        "urgency": "high",
        "transferBytes": 9310236,
        "css": {
          "unusedBytes": 327666,
          "ratio": 0.035194166936262414,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 1929764,
          "duplicatedBytes": 0,
          "ratio": 0.20727337094355072,
          "auditIds": [
            "unused-javascript",
            "duplicated-javascript"
          ]
        },
        "html": {
          "estimatedPenalty": 0.25,
          "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": "high",
            "estimatedSavingsBytes": 327666,
            "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": 1929764,
            "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": 9310236,
        "estimatedDeferrableBytes": 2529001,
        "renderBlockingMs": 531,
        "breakdown": {
          "offscreenImageSavings": 271571,
          "unusedJavascriptSavings": 1929764,
          "unusedCssSavings": 327666
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "high",
            "estimatedSavingsBytes": 271571,
            "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": 1929764,
            "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": "high",
            "estimatedSavingsBytes": 327666,
            "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": "Eliminate render-blocking resources",
            "area": "render-path",
            "urgency": "medium",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 531,
            "strategy": "Defer scripts/styles not required for first paint and preload only truly critical assets.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-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 www.barcelona.cat",
            "area": "image",
            "urgency": "high",
            "estimatedSavingsBytes": 1071743,
            "url": "https://www.barcelona.cat/sites/default/files/platja_1920x540.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 mobile.com-shi-va.barcelona.cat",
            "area": "script",
            "urgency": "high",
            "estimatedSavingsBytes": 715819,
            "url": "https://mobile.com-shi-va.barcelona.cat/assets/index-CiPq0rWH.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 com-shi-va.barcelona.cat",
            "area": "script",
            "urgency": "high",
            "estimatedSavingsBytes": 546231,
            "url": "https://com-shi-va.barcelona.cat/assets/index-97beb0ec.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": 90,
        "urgency": "high",
        "providerCount": 14,
        "requestCount": 42,
        "transferBytes": 2121486,
        "notGreenCount": 9,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "mobile.com-shi-va.barcelona.cat",
            "resourceType": "script",
            "requestCount": 4,
            "transferBytes": 727161,
            "sampleUrl": "https://mobile.com-shi-va.barcelona.cat/assets/index-CiPq0rWH.js",
            "greenCheck": {
              "hostname": "mobile.com-shi-va.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:58.833590",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/mobile.com-shi-va.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "com-shi-va.barcelona.cat",
            "resourceType": "script",
            "requestCount": 4,
            "transferBytes": 553469,
            "sampleUrl": "https://com-shi-va.barcelona.cat/assets/index-97beb0ec.js",
            "greenCheck": {
              "hostname": "com-shi-va.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:58.890330",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/com-shi-va.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "maps.googleapis.com",
            "resourceType": "script",
            "requestCount": 5,
            "transferBytes": 321498,
            "sampleUrl": "https://maps.googleapis.com/maps/api/js?key=AIzaSyA1hYiZ1NN9YNkxQPWfVHYhI7hmS1JLlLI&libraries=places%2Cgeometry&language=ca&v=3.47&callback=vueGoogleMapsInit",
            "greenCheck": {
              "hostname": "maps.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:28",
              "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/maps.googleapis.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 11,
            "transferBytes": 153569,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 147061,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "releases.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 126719,
            "sampleUrl": "https://releases.jquery.com/git/ui/jquery-ui-git.js",
            "greenCheck": {
              "hostname": "releases.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:38:00.162467",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/releases.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31747,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "cdnjs.cloudflare.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15910,
            "sampleUrl": "https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js",
            "greenCheck": {
              "hostname": "cdnjs.cloudflare.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:34",
              "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/cdnjs.cloudflare.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15565,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "www.youtube.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 11066,
            "sampleUrl": "https://www.youtube.com/iframe_api",
            "greenCheck": {
              "hostname": "www.youtube.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2026-01-10T15:09:17",
              "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.youtube.com",
              "error": null
            }
          },
          {
            "hostname": "geoportal.barcelona.cat",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 8380,
            "sampleUrl": "https://geoportal.barcelona.cat/PlanolBCN/webconfig.js.ashx?lang=CA",
            "greenCheck": {
              "hostname": "geoportal.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.864845",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/geoportal.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5671,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 5,
            "transferBytes": 2862,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 3,
            "transferBytes": 808,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=iMz00G&url=https%3A%2F%2Fwww.barcelona.cat%2Fca",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "high",
            "detail": "Track 14 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."
          },
          {
            "title": "Prioritize greener alternatives for third-party providers",
            "urgency": "high",
            "detail": "9 third-party script origin(s) are not confirmed green in the Green Web Foundation dataset."
          }
        ]
      },
      "redundancy": {
        "score": 48,
        "urgency": "high",
        "transferBytes": 9310236,
        "estimatedRedundantBytes": 2257430,
        "redundancyRatio": 0.24246753787981315,
        "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": 1929764,
            "displayValue": "Est savings of 1,885 KiB"
          },
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 327666,
            "displayValue": "Est savings of 320 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused javascript",
            "urgency": "high",
            "estimatedSavingsBytes": 1929764,
            "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": "high",
            "estimatedSavingsBytes": 327666,
            "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": "Enable and verify text compression",
            "urgency": "medium",
            "estimatedSavingsBytes": 4973,
            "auditId": "uses-text-compression",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "2",
              "title": "Remove unnecessary or redundant information",
              "url": "https://www.w3.org/TR/web-sustainability-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": 45,
        "urgency": "high",
        "totalTransferBytes": 9310236,
        "heavyRequestCount": 25,
        "heavyBytes": 7079089,
        "heavyRatio": 0.7603554840070649,
        "heavyRequests": [
          {
            "url": "https://www.barcelona.cat/sites/default/files/platja_1920x540.jpg",
            "transferSize": 1071743,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://api.com-shi-va.barcelona.cat/other_bus/lines/?RECORRIDO=0&access_token=1UWeUzjkmvYh93M14bl7JvnNwVkJSK",
            "transferSize": 730670,
            "resourceType": "xhr",
            "mimeType": "application/json",
            "domain": "api.com-shi-va.barcelona.cat"
          },
          {
            "url": "https://mobile.com-shi-va.barcelona.cat/assets/index-CiPq0rWH.js",
            "transferSize": 715819,
            "resourceType": "script",
            "mimeType": "text/javascript",
            "domain": "mobile.com-shi-va.barcelona.cat"
          },
          {
            "url": "https://com-shi-va.barcelona.cat/assets/index-97beb0ec.js",
            "transferSize": 546231,
            "resourceType": "script",
            "mimeType": "text/javascript",
            "domain": "com-shi-va.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/gentgranmontserratolivella_1900x547_0.jpg",
            "transferSize": 498992,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/vistes_aeries_bcn_5_1900x547.jpg",
            "transferSize": 427875,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://api.com-shi-va.barcelona.cat/bus/lines/?RECORRIDO=0&access_token=1UWeUzjkmvYh93M14bl7JvnNwVkJSK",
            "transferSize": 278523,
            "resourceType": "xhr",
            "mimeType": "application/json",
            "domain": "api.com-shi-va.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/una-nena-en-banyador-es-refresca-a-la%20%281%29.jpg",
            "transferSize": 256040,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/estatics/geobcn/1.2/api-full-ca.js",
            "transferSize": 247011,
            "resourceType": "script",
            "mimeType": "text/javascript",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/estatics/geobcn/1.2/js/lib/openlayers/ol-6.15.1.js",
            "transferSize": 243725,
            "resourceType": "script",
            "mimeType": "text/javascript",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/cap_mobile/public/vistes_aeries_bcn_5_1900x547.jpg?itok=h0iRuX1p",
            "transferSize": 227521,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://mobile.com-shi-va.barcelona.cat/assets/index-DFDXDFpa.css",
            "transferSize": 220925,
            "resourceType": "stylesheet",
            "mimeType": "text/css",
            "domain": "mobile.com-shi-va.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/cap_mobile/public/platja_1024x400.jpg?itok=LXkeezfq",
            "transferSize": 209926,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/cap_mobile/public/una-nena-en-banyador-es-refresca-a-la%20%281%29.jpg?itok=Kgm8Kyg7",
            "transferSize": 202202,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://maps.googleapis.com/maps/api/js?key=AIzaSyA1hYiZ1NN9YNkxQPWfVHYhI7hmS1JLlLI&libraries=places%2Cgeometry&language=ca&v=3.47&callback=vueGoogleMapsInit",
            "transferSize": 186127,
            "resourceType": "script",
            "mimeType": "text/javascript",
            "domain": "maps.googleapis.com"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/cap_mobile/public/gentgranmontserratolivella_1900x547_0.jpg?itok=WhrMktlq",
            "transferSize": 175528,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/Banner_Municipals_252x252_CAT%20%281%29.png",
            "transferSize": 157624,
            "resourceType": "image",
            "mimeType": "image/png",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://releases.jquery.com/git/ui/jquery-ui-git.js",
            "transferSize": 126719,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "releases.jquery.com"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/ICUB_WebBarcelona_252x252px_0.png",
            "transferSize": 110522,
            "resourceType": "image",
            "mimeType": "image/png",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/estatics-planol/v1.2/library/jquery-ui-1.10.4.js",
            "transferSize": 109123,
            "resourceType": "script",
            "mimeType": "text/javascript",
            "domain": "www.barcelona.cat"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "image",
            "count": 10,
            "transferBytes": 3337973
          },
          {
            "resourceType": "script",
            "count": 8,
            "transferBytes": 2251355
          },
          {
            "resourceType": "xhr",
            "count": 2,
            "transferBytes": 1009193
          },
          {
            "resourceType": "stylesheet",
            "count": 3,
            "transferBytes": 335058
          },
          {
            "resourceType": "font",
            "count": 2,
            "transferBytes": 145510
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.barcelona.cat",
            "count": 16,
            "transferBytes": 4135288
          },
          {
            "domain": "api.com-shi-va.barcelona.cat",
            "count": 2,
            "transferBytes": 1009193
          },
          {
            "domain": "mobile.com-shi-va.barcelona.cat",
            "count": 2,
            "transferBytes": 936744
          },
          {
            "domain": "com-shi-va.barcelona.cat",
            "count": 2,
            "transferBytes": 608418
          },
          {
            "domain": "maps.googleapis.com",
            "count": 1,
            "transferBytes": 186127
          },
          {
            "domain": "releases.jquery.com",
            "count": 1,
            "transferBytes": 126719
          },
          {
            "domain": "cdn.matomo.cloud",
            "count": 1,
            "transferBytes": 76600
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Lazy-load offscreen images and media galleries",
            "urgency": "high",
            "estimatedSavingsBytes": 271571,
            "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": 1929764,
            "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": "Defer non-critical UI modules until after first render",
            "urgency": "medium",
            "estimatedSavingsBytes": 0,
            "strategy": "Keep only above-the-fold resources in the initial path; hydrate or import secondary modules later.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 www.barcelona.cat",
            "urgency": "high",
            "estimatedSavingsBytes": 1071743,
            "strategy": "Serve a smaller placeholder first and load this asset only when the user scrolls to or requests the component.",
            "url": "https://www.barcelona.cat/sites/default/files/platja_1920x540.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 api.com-shi-va.barcelona.cat",
            "urgency": "high",
            "estimatedSavingsBytes": 730670,
            "strategy": "Move this asset behind an explicit interaction, route boundary, or lazy-loading trigger.",
            "url": "https://api.com-shi-va.barcelona.cat/other_bus/lines/?RECORRIDO=0&access_token=1UWeUzjkmvYh93M14bl7JvnNwVkJSK",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 mobile.com-shi-va.barcelona.cat",
            "urgency": "high",
            "estimatedSavingsBytes": 715819,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://mobile.com-shi-va.barcelona.cat/assets/index-CiPq0rWH.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": "15.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: 15.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": "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": 0,
          "displayValue": "16.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 Speed Index\n\n- Lighthouse audit: speed-index\n- Current value: 16.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\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": 0,
          "displayValue": "Est savings of 1,885 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 1,885 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,
          "displayValue": "Est savings of 320 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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 320 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,
          "displayValue": "Est savings of 3,147 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 3,147 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 1,948 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 1,948 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,
          "displayValue": "Est savings of 265 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 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"
        },
        {
          "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": 0,
          "displayValue": "Est savings of 530 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 Eliminate render-blocking resources\n\n- Lighthouse audit: render-blocking-resources\n- Current value: Est savings of 530 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\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": "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,
          "displayValue": "1,638 elements",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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: 1,638 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"
        },
        {
          "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": 0.5,
          "displayValue": "Est savings of 5 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 Enable text compression\n\n- Lighthouse audit: uses-text-compression\n- Current value: Est savings of 5 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\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": "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 9,092 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 9,092 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://barcelona.cat/en/living-in-bcn/accessibility",
      "status": "ok",
      "finalUrl": "https://www.barcelona.cat/en/living-in-bcn/accessibility",
      "performanceScore": 0.5,
      "bestPracticesScore": 1,
      "transferBytes": 2030435,
      "co2Grams": 0.7778218824090001,
      "greenWeb": {
        "page": {
          "hostname": "www.barcelona.cat",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-13T22:38:00.231825",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.barcelona.cat",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76424,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "stylesheet",
            "requestCount": 1,
            "transferBytes": 24660,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15566,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7150,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5447,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 4118,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/css/bcn-avisos.css",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "fonts.googleapis.com",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 2441,
            "sampleUrl": "https://fonts.googleapis.com/css?family=Source+Sans+3:200,200i,300,300i,400,400i,500,500i,600,600i,700,700i,900,900i",
            "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
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=n0yJoX&url=https%3A%2F%2Fwww.barcelona.cat%2Fen%2Fliving-in-bcn%2Faccessibility",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 10,
          "greenCount": 4,
          "notGreenCount": 7,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 60,
        "urgency": "high",
        "pageElementOccurrences": 1,
        "uniqueElementsAssessed": 1,
        "reusedFromCacheCount": 0,
        "components": [
          {
            "signature": "form|get|/en|input|text|query|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "text",
            "fieldName": "query",
            "formContext": "form|get|/en",
            "hasLabel": true,
            "hasValidationRule": false,
            "hasErrorMessagingHook": false,
            "toolingFriendly": false,
            "assessment": {
              "score": 60,
              "urgency": "high",
              "issues": [
                "No explicit validation rule",
                "No error messaging hook",
                "Missing autocomplete for tooling support"
              ],
              "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.",
                "Provide meaningful autocomplete values to support browsers and assistive tooling."
              ]
            },
            "reusedFromCache": false
          }
        ],
        "recommendations": [
          {
            "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."
          },
          {
            "title": "Missing autocomplete for tooling support",
            "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": "Accessibility | Barcelona.cat | Barcelona City Council",
          "lang": "en",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "Check the transport, housing and job placement services for people with mobility challenges in Barcelona.",
          "robots": "",
          "canonical": "https://www.barcelona.cat/en/living-in-bcn/accessibility",
          "ogTitle": "Barcelona, a city that’s accessible to you",
          "ogDescription": "We are working for an accessible city. Check the adapted transport and housing resources for people with mobility challenges in Barcelona.",
          "ogType": "Web",
          "ogUrl": "https://www.barcelona.cat/en/living-in-bcn/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": 64,
          "tabletSmallTapTargets": 60,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 64,
            "oversizedMedia": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 60,
            "oversizedMedia": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 64 small targets on mobile and 60 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 59,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": true,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": true,
          "externalScriptCount": 7,
          "externalScriptsWithoutIntegrity": 7,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "cache-control": "max-age=300, public",
            "content-encoding": "gzip",
            "content-language": "en",
            "content-length": "13563",
            "content-type": "text/html; charset=UTF-8",
            "date": "Mon, 13 Apr 2026 22:38:17 GMT",
            "etag": "\"1776119891-gzip\"",
            "expires": "Sun, 19 Nov 1978 05:00:00 GMT",
            "last-modified": "Mon, 13 Apr 2026 22:38:11 GMT",
            "server": "nginx",
            "vary": "Cookie,Accept-Encoding",
            "via": "1.1 575693ca51d2d9242d8177dfeb274d24.cloudfront.net (CloudFront)",
            "x-amz-cf-id": "wMUAsVO3jOMz5hPphHdxw3AIomKj7us3dt_rkpDQkPmDejbwgNXCEw==",
            "x-amz-cf-pop": "IAD12-P5",
            "x-cache": "Miss from cloudfront",
            "x-content-type-options": "nosniff",
            "x-frame-options": "SAMEORIGIN",
            "x-generator": "Drupal 10 (https://www.drupal.org)"
          },
          "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": "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": "7 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 25,
        "urgency": "low",
        "origin": "https://www.barcelona.cat",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://www.barcelona.cat/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/sitemap.xml",
            "found": true,
            "status": 200,
            "contentType": "application/xml; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/manifest.webmanifest",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/favicon.ico",
            "found": true,
            "status": 200,
            "contentType": "image/x-icon"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "low",
            "detail": "Missing beneficial file(s): /.well-known/security.txt, /manifest.webmanifest."
          }
        ]
      },
      "mediaHints": {
        "score": 20,
        "urgency": "low",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 24,
          "imagesWithLazy": 13,
          "imagesWithoutLazy": 11
        },
        "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."
          }
        ]
      },
      "wsgCustom": {
        "score": 85,
        "urgency": "medium",
        "data": {
          "hasPrintStyles": true,
          "hasReducedMotion": true,
          "media": {
            "totalImages": 29,
            "lazyImages": 14,
            "totalIframes": 1,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "\"Source Sans Pro\", \"Helvetica Neue\", Helvetica, Arial, sans-serif",
            "usesSystemFont": true
          },
          "tracking": {
            "count": 0,
            "scripts": []
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 14/29 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": "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"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 100,
        "urgency": "high",
        "totalEstimatedSavingsBytes": 2069871.6000000003,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Use modern image compression formats",
            "urgency": "high",
            "estimatedSavingsBytes": 1131151.6000000003,
            "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": 938720,
            "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: 1.08 MB."
          },
          {
            "title": "Improve image encoding quality/size",
            "urgency": "high",
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 916.72 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": 2215132.6000000006,
        "totalEstimatedBlockingMs": 897,
        "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": 1131151.6000000003,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 1,105 KiB",
            "urgency": "high",
            "sourceAuditId": "modern-image-formats"
          },
          {
            "id": "uses-optimized-images",
            "title": "Compress oversized image assets",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss.",
            "estimatedSavingsBytes": 938720,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 917 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": 83634,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 82 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-css-rules"
          },
          {
            "id": "unused-javascript",
            "title": "Remove unused JavaScript",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code.",
            "estimatedSavingsBytes": 58179,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 57 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-javascript"
          },
          {
            "id": "render-blocking-resources",
            "title": "Eliminate render-blocking resources",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering.",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 897,
            "displayValue": "Est savings of 900 ms",
            "urgency": "medium",
            "sourceAuditId": "render-blocking-resources"
          },
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 3448,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 3 KiB",
            "urgency": "low",
            "sourceAuditId": "offscreen-images"
          }
        ],
        "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.08 MB."
          },
          {
            "title": "Compress oversized image assets",
            "urgency": "high",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 916.72 KB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "medium",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 81.67 KB."
          },
          {
            "title": "Remove unused JavaScript",
            "urgency": "medium",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 56.82 KB."
          },
          {
            "title": "Eliminate render-blocking resources",
            "urgency": "medium",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering. Estimated render unblocking: 897 ms."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "low",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 3.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": 10,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 7,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "7 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": 168044.40876396644
        },
        "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: 164.11 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: 164.11 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": "medium",
        "transferBytes": 2030435,
        "css": {
          "unusedBytes": 83634,
          "ratio": 0.04119018830940168,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 58179,
          "duplicatedBytes": 0,
          "ratio": 0.028653465882926565,
          "auditIds": [
            "unused-javascript",
            "duplicated-javascript"
          ]
        },
        "html": {
          "estimatedPenalty": 0.25,
          "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": "high",
            "estimatedSavingsBytes": 83634,
            "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": "medium",
            "estimatedSavingsBytes": 58179,
            "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": 2030435,
        "estimatedDeferrableBytes": 145261,
        "renderBlockingMs": 897,
        "breakdown": {
          "offscreenImageSavings": 3448,
          "unusedJavascriptSavings": 58179,
          "unusedCssSavings": 83634
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 3448,
            "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": "medium",
            "estimatedSavingsBytes": 58179,
            "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": "high",
            "estimatedSavingsBytes": 83634,
            "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": "Eliminate render-blocking resources",
            "area": "render-path",
            "urgency": "medium",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 897,
            "strategy": "Defer scripts/styles not required for first paint and preload only truly critical assets.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-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 www.barcelona.cat",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 144830,
            "url": "https://www.barcelona.cat/sites/default/files/styles/distribuidora_central/public/amb%20accessibilitat-lleure-platges.jpg?itok=sCf3newI",
            "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": 64,
        "urgency": "high",
        "providerCount": 7,
        "requestCount": 8,
        "transferBytes": 139463,
        "notGreenCount": 5,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76424,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15566,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7150,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5447,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=n0yJoX&url=https%3A%2F%2Fwww.barcelona.cat%2Fen%2Fliving-in-bcn%2Faccessibility",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "high",
            "detail": "Track 7 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."
          },
          {
            "title": "Prioritize greener alternatives for third-party providers",
            "urgency": "high",
            "detail": "5 third-party script origin(s) are not confirmed green in the Green Web Foundation dataset."
          }
        ]
      },
      "redundancy": {
        "score": 24,
        "urgency": "medium",
        "transferBytes": 2030435,
        "estimatedRedundantBytes": 141813,
        "redundancyRatio": 0.06984365419232824,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 83634,
            "displayValue": "Est savings of 82 KiB"
          },
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 58179,
            "displayValue": "Est savings of 57 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 83634,
            "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 unused javascript",
            "urgency": "medium",
            "estimatedSavingsBytes": 58179,
            "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 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": 27,
        "urgency": "high",
        "totalTransferBytes": 2030435,
        "heavyRequestCount": 9,
        "heavyBytes": 900968,
        "heavyRatio": 0.4437315156604373,
        "heavyRequests": [
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/distribuidora_central/public/amb%20accessibilitat-lleure-platges.jpg?itok=sCf3newI",
            "transferSize": 144830,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/destacat_gran/public/amb%20accessibilitat-educaci%C3%B3%20.jpg?itok=edC-2UKO",
            "transferSize": 137756,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/distribuidora_central/public/amb%20accessibilitat-lleure%204573.jpg?itok=WLbWFxzq",
            "transferSize": 119338,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/distribuidora_central/public/equipaments_528x228_2.jpg?itok=EWGjF_Ny",
            "transferSize": 112931,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/distribuidora_central/public/amb%20accessibilitat-lleure-esports%201590.jpg?itok=hayJ5Ue1",
            "transferSize": 112254,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "transferSize": 90561,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "transferSize": 76424,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "cdn.matomo.cloud"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament/fonts/icoajuntament.ttf?8aaig7",
            "transferSize": 54929,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/css/css_qDD4BCxE8K-iT7MRORwp32v03DlJblP9-xrYwOBWlQo.css?delta=5&language=en&theme=barcelonacat_theme&include=eJyFz8GOwyAMBNAfCuXQD0ID8SasiI2wSZu_X6RKXa3EqidbM-8y-O5sOIgt4Mwq6l_HoeYloiUqwkiwICe1lldSP3R3JlJG_5-p2MidmR5_ge10kI8iptZQQ1p5Br7A6YrynHVbkYji1K6SeZuJnMThvWsm5FFmsUofWVCwhvsnUJssMXEYrMG_v0BPo8YoS0XDNkbu6tfWK8rtN7l1rj2WrDuti15qdPgIpR8d6Z1O&tcut5n",
            "transferSize": 51945,
            "resourceType": "stylesheet",
            "mimeType": "text/css",
            "domain": "www.barcelona.cat"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "image",
            "count": 5,
            "transferBytes": 627109
          },
          {
            "resourceType": "font",
            "count": 2,
            "transferBytes": 145490
          },
          {
            "resourceType": "script",
            "count": 1,
            "transferBytes": 76424
          },
          {
            "resourceType": "stylesheet",
            "count": 1,
            "transferBytes": 51945
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.barcelona.cat",
            "count": 8,
            "transferBytes": 824544
          },
          {
            "domain": "cdn.matomo.cloud",
            "count": 1,
            "transferBytes": 76424
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Split JavaScript by route or interaction",
            "urgency": "medium",
            "estimatedSavingsBytes": 58179,
            "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": "Defer non-critical UI modules until after first render",
            "urgency": "medium",
            "estimatedSavingsBytes": 0,
            "strategy": "Keep only above-the-fold resources in the initial path; hydrate or import secondary modules later.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 www.barcelona.cat",
            "urgency": "medium",
            "estimatedSavingsBytes": 144830,
            "strategy": "Serve a smaller placeholder first and load this asset only when the user scrolls to or requests the component.",
            "url": "https://www.barcelona.cat/sites/default/files/styles/distribuidora_central/public/amb%20accessibilitat-lleure-platges.jpg?itok=sCf3newI",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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.03,
          "displayValue": "7.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: 7.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": "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": 0.06,
          "displayValue": "10.9 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 Speed Index\n\n- Lighthouse audit: speed-index\n- Current value: 10.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\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": 0,
          "displayValue": "Est savings of 57 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 57 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,
          "displayValue": "Est savings of 82 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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 82 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,
          "displayValue": "Est savings of 1,105 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,105 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 917 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 917 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": "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": 0,
          "displayValue": "Est savings of 900 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 Eliminate render-blocking resources\n\n- Lighthouse audit: render-blocking-resources\n- Current value: Est savings of 900 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\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": "server-response-time",
          "title": "Reduce initial server response time",
          "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": 0,
          "displayValue": "Root document took 5,540 ms",
          "impact": "high",
          "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 Reduce initial server response time\n\n- Lighthouse audit: server-response-time\n- Current value: Root document took 5,540 ms\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": "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,
          "displayValue": "1,123 elements",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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: 1,123 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"
        },
        {
          "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 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 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://barcelona.cat/en/what-to-do-in-bcn/bathing-and-beaches/accessibility",
      "status": "ok",
      "finalUrl": "https://www.barcelona.cat/en/what-to-do-in-bcn/bathing-and-beaches/accessibility",
      "performanceScore": 0.48,
      "bestPracticesScore": 1,
      "transferBytes": 1202255,
      "co2Grams": 0.460561528557,
      "greenWeb": {
        "page": {
          "hostname": "www.barcelona.cat",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-13T22:38:00.231825",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.barcelona.cat",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76427,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "stylesheet",
            "requestCount": 1,
            "transferBytes": 24654,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15572,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7161,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5447,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 4128,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/css/bcn-avisos.css",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "fonts.googleapis.com",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 2441,
            "sampleUrl": "https://fonts.googleapis.com/css?family=Source+Sans+3:200,200i,300,300i,400,400i,500,500i,600,600i,700,700i,900,900i",
            "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
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=FoA5z2&url=https%3A%2F%2Fwww.barcelona.cat%2Fen%2Fwhat-to-do-in-bcn%2Fbathing-and-beaches%2Faccessibility",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 10,
          "greenCount": 4,
          "notGreenCount": 7,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 60,
        "urgency": "high",
        "pageElementOccurrences": 1,
        "uniqueElementsAssessed": 1,
        "reusedFromCacheCount": 1,
        "components": [
          {
            "signature": "form|get|/en|input|text|query|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "text",
            "fieldName": "query",
            "formContext": "form|get|/en",
            "hasLabel": true,
            "hasValidationRule": false,
            "hasErrorMessagingHook": false,
            "toolingFriendly": false,
            "assessment": {
              "score": 60,
              "urgency": "high",
              "issues": [
                "No explicit validation rule",
                "No error messaging hook",
                "Missing autocomplete for tooling support"
              ],
              "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.",
                "Provide meaningful autocomplete values to support browsers and assistive tooling."
              ]
            },
            "reusedFromCache": true
          }
        ],
        "recommendations": [
          {
            "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."
          },
          {
            "title": "Missing autocomplete for tooling support",
            "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": "Accessibility at beaches | Barcelona | Barcelona City Council",
          "lang": "en",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "All Barcelona's beaches are adapted for bathers with disabilities. Check out the services and timetables that the City Council offers in these areas.",
          "robots": "",
          "canonical": "https://www.barcelona.cat/en/what-to-do-in-bcn/bathing-and-beaches/accessibility",
          "ogTitle": "Accessibility",
          "ogDescription": "Barcelona’s beaches are designed to facilitate access for people with reduced mobility. What’s more, some beaches also offer bathing assistance services. Learn more.",
          "ogType": "Web",
          "ogUrl": "https://www.barcelona.cat/en/what-to-do-in-bcn/bathing-and-beaches/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": 39,
          "tabletSmallTapTargets": 36,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 39,
            "oversizedMedia": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 36,
            "oversizedMedia": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 39 small targets on mobile and 36 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 59,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": true,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": true,
          "externalScriptCount": 7,
          "externalScriptsWithoutIntegrity": 7,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "cache-control": "max-age=300, public",
            "content-encoding": "gzip",
            "content-language": "en",
            "content-length": "13024",
            "content-type": "text/html; charset=UTF-8",
            "date": "Mon, 13 Apr 2026 22:38:31 GMT",
            "etag": "\"1776119911-gzip\"",
            "expires": "Sun, 19 Nov 1978 05:00:00 GMT",
            "last-modified": "Mon, 13 Apr 2026 22:38:31 GMT",
            "server": "nginx",
            "vary": "Cookie,Accept-Encoding",
            "via": "1.1 575693ca51d2d9242d8177dfeb274d24.cloudfront.net (CloudFront)",
            "x-amz-cf-id": "Cy-ZyBcr4NQUOxnEcm_7j17VksOjc6jdsybPL3wuJKpQv2_p1DfI2g==",
            "x-amz-cf-pop": "IAD12-P5",
            "x-cache": "Miss from cloudfront",
            "x-content-type-options": "nosniff",
            "x-frame-options": "SAMEORIGIN",
            "x-generator": "Drupal 10 (https://www.drupal.org)"
          },
          "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": "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": "7 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 25,
        "urgency": "low",
        "origin": "https://www.barcelona.cat",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://www.barcelona.cat/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/sitemap.xml",
            "found": true,
            "status": 200,
            "contentType": "application/xml; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/manifest.webmanifest",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/favicon.ico",
            "found": true,
            "status": 200,
            "contentType": "image/x-icon"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "low",
            "detail": "Missing beneficial file(s): /.well-known/security.txt, /manifest.webmanifest."
          }
        ]
      },
      "mediaHints": {
        "score": 45,
        "urgency": "medium",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 12,
          "imagesWithLazy": 1,
          "imagesWithoutLazy": 11
        },
        "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": "11 of 12 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 85,
        "urgency": "medium",
        "data": {
          "hasPrintStyles": true,
          "hasReducedMotion": true,
          "media": {
            "totalImages": 17,
            "lazyImages": 2,
            "totalIframes": 1,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "\"Source Sans Pro\", \"Helvetica Neue\", Helvetica, Arial, sans-serif",
            "usesSystemFont": true
          },
          "tracking": {
            "count": 0,
            "scripts": []
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 2/17 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": "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"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 66,
        "urgency": "high",
        "totalEstimatedSavingsBytes": 791794.1,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Use modern image compression formats",
            "urgency": "high",
            "estimatedSavingsBytes": 429607.1,
            "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": 362187,
            "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: 419.54 KB."
          },
          {
            "title": "Improve image encoding quality/size",
            "urgency": "high",
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 353.70 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": 1039049.1,
        "totalEstimatedBlockingMs": 1469,
        "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": 429607.1,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 420 KiB",
            "urgency": "high",
            "sourceAuditId": "modern-image-formats"
          },
          {
            "id": "uses-optimized-images",
            "title": "Compress oversized image assets",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss.",
            "estimatedSavingsBytes": 362187,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 354 KiB",
            "urgency": "high",
            "sourceAuditId": "uses-optimized-images"
          },
          {
            "id": "render-blocking-resources",
            "title": "Eliminate render-blocking resources",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering.",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1469,
            "displayValue": "Est savings of 1,470 ms",
            "urgency": "high",
            "sourceAuditId": "render-blocking-resources"
          },
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 87111,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 85 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": 81071,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 79 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-css-rules"
          },
          {
            "id": "uses-responsive-images",
            "title": "Right-size images for viewport",
            "detail": "Avoid sending larger images than the rendered size needs.",
            "estimatedSavingsBytes": 46592,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 46 KiB",
            "urgency": "medium",
            "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": 32481,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 32 KiB",
            "urgency": "low",
            "sourceAuditId": "unused-javascript"
          }
        ],
        "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: 419.54 KB."
          },
          {
            "title": "Compress oversized image assets",
            "urgency": "high",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 353.70 KB."
          },
          {
            "title": "Eliminate render-blocking resources",
            "urgency": "high",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering. Estimated render unblocking: 1469 ms."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "medium",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 85.07 KB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "medium",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 79.17 KB."
          },
          {
            "title": "Right-size images for viewport",
            "urgency": "medium",
            "detail": "Avoid sending larger images than the rendered size needs. Estimated byte savings: 45.50 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": 10,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 7,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "7 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": 168042.21417597766
        },
        "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: 164.10 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: 164.10 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": 6,
        "urgency": "medium",
        "transferBytes": 1202255,
        "css": {
          "unusedBytes": 81071,
          "ratio": 0.06743244985464814,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 32481,
          "duplicatedBytes": 0,
          "ratio": 0.027016731059550596,
          "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": "high",
            "estimatedSavingsBytes": 81071,
            "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": "medium",
            "estimatedSavingsBytes": 32481,
            "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": 1202255,
        "estimatedDeferrableBytes": 200663,
        "renderBlockingMs": 1469,
        "breakdown": {
          "offscreenImageSavings": 87111,
          "unusedJavascriptSavings": 32481,
          "unusedCssSavings": 81071
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 87111,
            "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": "medium",
            "estimatedSavingsBytes": 32481,
            "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": 81071,
            "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": "Eliminate render-blocking resources",
            "area": "render-path",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1469,
            "strategy": "Defer scripts/styles not required for first paint and preload only truly critical assets.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-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 www.barcelona.cat",
            "area": "image",
            "urgency": "high",
            "estimatedSavingsBytes": 412842,
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_medium/public/banyassistencia_710x379_1.jpg?itok=6FNgJCGu",
            "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 www.barcelona.cat",
            "area": "font",
            "urgency": "medium",
            "estimatedSavingsBytes": 90562,
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "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 cdn.matomo.cloud",
            "area": "script",
            "urgency": "medium",
            "estimatedSavingsBytes": 76427,
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.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": 64,
        "urgency": "high",
        "providerCount": 7,
        "requestCount": 8,
        "transferBytes": 139483,
        "notGreenCount": 5,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76427,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15572,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7161,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5447,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=FoA5z2&url=https%3A%2F%2Fwww.barcelona.cat%2Fen%2Fwhat-to-do-in-bcn%2Fbathing-and-beaches%2Faccessibility",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "high",
            "detail": "Track 7 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."
          },
          {
            "title": "Prioritize greener alternatives for third-party providers",
            "urgency": "high",
            "detail": "5 third-party script origin(s) are not confirmed green in the Green Web Foundation dataset."
          }
        ]
      },
      "redundancy": {
        "score": 15,
        "urgency": "low",
        "transferBytes": 1202255,
        "estimatedRedundantBytes": 113552,
        "redundancyRatio": 0.09444918091419874,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 81071,
            "displayValue": "Est savings of 79 KiB"
          },
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 32481,
            "displayValue": "Est savings of 32 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 81071,
            "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 unused javascript",
            "urgency": "medium",
            "estimatedSavingsBytes": 32481,
            "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 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": 30,
        "urgency": "medium",
        "totalTransferBytes": 1202255,
        "heavyRequestCount": 5,
        "heavyBytes": 683859,
        "heavyRatio": 0.5688136044349992,
        "heavyRequests": [
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_medium/public/banyassistencia_710x379_1.jpg?itok=6FNgJCGu",
            "transferSize": 412842,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "transferSize": 90562,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "transferSize": 76427,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "cdn.matomo.cloud"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament/fonts/icoajuntament.ttf?8aaig7",
            "transferSize": 54921,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/css/css_evpTRQTawGYS1Ro7RbXq3hBxwat7AU-RJm1V8ZgzeaE.css?delta=5&language=en&theme=barcelonacat_theme&include=eJyFzsGKwzAMBNAfiuvDfpAZOyJxcSQjydn272sodFnIsieJmXcY3Ac7DmJPOKuJxfcJ6HXJ0EJNGAWe5CTVupLFqUdwkTb7v0zHRuGs9P0b-E4HxSzi5oqeyspXYGuS0YL5s1XerkQtEvDZfiVMxsySgS19_Qe6ypILp8kU8fMlejgpoy0dim0u3i2uOjra7Se5De4jt2o7rYs9zemIGUYvwgyJSg&tcut5n",
            "transferSize": 49107,
            "resourceType": "stylesheet",
            "mimeType": "text/css",
            "domain": "www.barcelona.cat"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "image",
            "count": 1,
            "transferBytes": 412842
          },
          {
            "resourceType": "font",
            "count": 2,
            "transferBytes": 145483
          },
          {
            "resourceType": "script",
            "count": 1,
            "transferBytes": 76427
          },
          {
            "resourceType": "stylesheet",
            "count": 1,
            "transferBytes": 49107
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.barcelona.cat",
            "count": 4,
            "transferBytes": 607432
          },
          {
            "domain": "cdn.matomo.cloud",
            "count": 1,
            "transferBytes": 76427
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Lazy-load offscreen images and media galleries",
            "urgency": "medium",
            "estimatedSavingsBytes": 87111,
            "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": "Defer non-critical UI modules until after first render",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "strategy": "Keep only above-the-fold resources in the initial path; hydrate or import secondary modules later.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 www.barcelona.cat",
            "urgency": "high",
            "estimatedSavingsBytes": 412842,
            "strategy": "Serve a smaller placeholder first and load this asset only when the user scrolls to or requests the component.",
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_medium/public/banyassistencia_710x379_1.jpg?itok=6FNgJCGu",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 www.barcelona.cat",
            "urgency": "medium",
            "estimatedSavingsBytes": 90562,
            "strategy": "Subset or defer this font so full font payloads are only fetched when needed.",
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 cdn.matomo.cloud",
            "urgency": "medium",
            "estimatedSavingsBytes": 76427,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.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.05,
          "displayValue": "7.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: 7.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-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,
          "displayValue": "Est savings of 79 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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 79 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,
          "displayValue": "Est savings of 420 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 420 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 354 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 354 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,
          "displayValue": "Est savings of 85 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 85 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": "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": 0,
          "displayValue": "Est savings of 1,470 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 Eliminate render-blocking resources\n\n- Lighthouse audit: render-blocking-resources\n- Current value: Est savings of 1,470 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\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": "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": 0.86,
          "displayValue": "3.6 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 Speed Index\n\n- Lighthouse audit: speed-index\n- Current value: 3.6 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\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": 0.5,
          "displayValue": "Est savings of 32 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 32 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": "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": "1,048 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: 1,048 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://barcelona.cat/en/what-to-do-in-bcn/montjuic-park/find-out-about-montjuic-park-council",
      "status": "ok",
      "finalUrl": "https://www.barcelona.cat/en/what-to-do-in-bcn/montjuic-park/find-out-about-montjuic-park-council",
      "performanceScore": 0.52,
      "bestPracticesScore": 1,
      "transferBytes": 1184464,
      "co2Grams": 0.45374612736960007,
      "greenWeb": {
        "page": {
          "hostname": "www.barcelona.cat",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-13T22:38:00.231825",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.barcelona.cat",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76592,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "stylesheet",
            "requestCount": 1,
            "transferBytes": 24705,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15571,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7163,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5670,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 4127,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/css/bcn-avisos.css",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2862,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "fonts.googleapis.com",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 2441,
            "sampleUrl": "https://fonts.googleapis.com/css?family=Source+Sans+3:200,200i,300,300i,400,400i,500,500i,600,600i,700,700i,900,900i",
            "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
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=iiivcx&url=https%3A%2F%2Fwww.barcelona.cat%2Fen%2Fwhat-to-do-in-bcn%2Fmontjuic-park%2Ffind-out-about-montjuic-park-council",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 10,
          "greenCount": 4,
          "notGreenCount": 7,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 60,
        "urgency": "high",
        "pageElementOccurrences": 1,
        "uniqueElementsAssessed": 1,
        "reusedFromCacheCount": 1,
        "components": [
          {
            "signature": "form|get|/en|input|text|query|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "text",
            "fieldName": "query",
            "formContext": "form|get|/en",
            "hasLabel": true,
            "hasValidationRule": false,
            "hasErrorMessagingHook": false,
            "toolingFriendly": false,
            "assessment": {
              "score": 60,
              "urgency": "high",
              "issues": [
                "No explicit validation rule",
                "No error messaging hook",
                "Missing autocomplete for tooling support"
              ],
              "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.",
                "Provide meaningful autocomplete values to support browsers and assistive tooling."
              ]
            },
            "reusedFromCache": true
          }
        ],
        "recommendations": [
          {
            "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."
          },
          {
            "title": "Missing autocomplete for tooling support",
            "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": "Montjuïc Park Council | Barcelona City Council",
          "lang": "en",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "Montjuïc Park Council is a stable, permanent participatory body in the Sants-Montjuïc District. It was set up in 2014 to channel and coordinate the running of the park and its actions.",
          "robots": "",
          "canonical": "https://www.barcelona.cat/en/what-to-do-in-bcn/montjuic-park/find-out-about-montjuic-park-council",
          "ogTitle": "Montjuïc Park Council | Barcelona City Council",
          "ogDescription": "Montjuïc Park Council is a stable, permanent participatory body in the Sants-Montjuïc District. It was set up in 2014 to channel and coordinate the running of the park and its actions.",
          "ogType": "Web",
          "ogUrl": "https://www.barcelona.cat/en/what-to-do-in-bcn/montjuic-park/find-out-about-montjuic-park-council",
          "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": 35,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 37,
            "oversizedMedia": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 35,
            "oversizedMedia": 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 35 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 59,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": true,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": true,
          "externalScriptCount": 7,
          "externalScriptsWithoutIntegrity": 7,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "cache-control": "max-age=300, public",
            "content-encoding": "gzip",
            "content-language": "en",
            "content-length": "10890",
            "content-type": "text/html; charset=UTF-8",
            "date": "Mon, 13 Apr 2026 22:38:45 GMT",
            "etag": "\"1776119925-gzip\"",
            "expires": "Sun, 19 Nov 1978 05:00:00 GMT",
            "last-modified": "Mon, 13 Apr 2026 22:38:45 GMT",
            "server": "nginx",
            "vary": "Cookie,Accept-Encoding",
            "via": "1.1 ca2190123e61f1744d1210c24c87c840.cloudfront.net (CloudFront)",
            "x-amz-cf-id": "QYl1_iHHV9cZZ6gfnapRQg5GZNjrfg6N9dWU31ouU1n1PWFlo4KD3w==",
            "x-amz-cf-pop": "IAD12-P5",
            "x-cache": "Miss from cloudfront",
            "x-content-type-options": "nosniff",
            "x-frame-options": "SAMEORIGIN",
            "x-generator": "Drupal 10 (https://www.drupal.org)"
          },
          "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": "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": "7 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 25,
        "urgency": "low",
        "origin": "https://www.barcelona.cat",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://www.barcelona.cat/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/sitemap.xml",
            "found": true,
            "status": 200,
            "contentType": "application/xml; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/manifest.webmanifest",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/favicon.ico",
            "found": true,
            "status": 200,
            "contentType": "image/x-icon"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "low",
            "detail": "Missing beneficial file(s): /.well-known/security.txt, /manifest.webmanifest."
          }
        ]
      },
      "mediaHints": {
        "score": 45,
        "urgency": "medium",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 12,
          "imagesWithLazy": 1,
          "imagesWithoutLazy": 11
        },
        "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": "11 of 12 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 85,
        "urgency": "medium",
        "data": {
          "hasPrintStyles": true,
          "hasReducedMotion": true,
          "media": {
            "totalImages": 17,
            "lazyImages": 2,
            "totalIframes": 1,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "\"Source Sans Pro\", \"Helvetica Neue\", Helvetica, Arial, sans-serif",
            "usesSystemFont": true
          },
          "tracking": {
            "count": 0,
            "scripts": []
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 2/17 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": "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"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 69,
        "urgency": "high",
        "totalEstimatedSavingsBytes": 821604.05,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Use modern image compression formats",
            "urgency": "high",
            "estimatedSavingsBytes": 444641.05,
            "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": 376963,
            "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: 434.22 KB."
          },
          {
            "title": "Improve image encoding quality/size",
            "urgency": "high",
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 368.13 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": 1066642.05,
        "totalEstimatedBlockingMs": 1408,
        "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": 444641.05,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 434 KiB",
            "urgency": "high",
            "sourceAuditId": "modern-image-formats"
          },
          {
            "id": "uses-optimized-images",
            "title": "Compress oversized image assets",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss.",
            "estimatedSavingsBytes": 376963,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 368 KiB",
            "urgency": "high",
            "sourceAuditId": "uses-optimized-images"
          },
          {
            "id": "render-blocking-resources",
            "title": "Eliminate render-blocking resources",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering.",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1408,
            "displayValue": "Est savings of 1,410 ms",
            "urgency": "high",
            "sourceAuditId": "render-blocking-resources"
          },
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 83661,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 82 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": 81339,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 79 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-css-rules"
          },
          {
            "id": "uses-responsive-images",
            "title": "Right-size images for viewport",
            "detail": "Avoid sending larger images than the rendered size needs.",
            "estimatedSavingsBytes": 48139,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 47 KiB",
            "urgency": "medium",
            "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": 31899,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 31 KiB",
            "urgency": "low",
            "sourceAuditId": "unused-javascript"
          }
        ],
        "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: 434.22 KB."
          },
          {
            "title": "Compress oversized image assets",
            "urgency": "high",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 368.13 KB."
          },
          {
            "title": "Eliminate render-blocking resources",
            "urgency": "high",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering. Estimated render unblocking: 1408 ms."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "medium",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 81.70 KB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "medium",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 79.43 KB."
          },
          {
            "title": "Right-size images for viewport",
            "urgency": "medium",
            "detail": "Avoid sending larger images than the rendered size needs. Estimated byte savings: 47.01 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": 10,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 7,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "7 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": 168161.2930865922
        },
        "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: 164.22 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: 164.22 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": 6,
        "urgency": "medium",
        "transferBytes": 1184464,
        "css": {
          "unusedBytes": 81339,
          "ratio": 0.06867156789906659,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 31899,
          "duplicatedBytes": 0,
          "ratio": 0.026931168866255115,
          "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": "high",
            "estimatedSavingsBytes": 81339,
            "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": "medium",
            "estimatedSavingsBytes": 31899,
            "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": 1184464,
        "estimatedDeferrableBytes": 196899,
        "renderBlockingMs": 1408,
        "breakdown": {
          "offscreenImageSavings": 83661,
          "unusedJavascriptSavings": 31899,
          "unusedCssSavings": 81339
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 83661,
            "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": "medium",
            "estimatedSavingsBytes": 31899,
            "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": 81339,
            "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": "Eliminate render-blocking resources",
            "area": "render-path",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1408,
            "strategy": "Defer scripts/styles not required for first paint and preload only truly critical assets.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-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 www.barcelona.cat",
            "area": "image",
            "urgency": "high",
            "estimatedSavingsBytes": 426513,
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_medium/public/consell_parc.jpg?itok=gL7I6i2n",
            "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 www.barcelona.cat",
            "area": "font",
            "urgency": "medium",
            "estimatedSavingsBytes": 90570,
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "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 cdn.matomo.cloud",
            "area": "script",
            "urgency": "medium",
            "estimatedSavingsBytes": 76592,
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.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": 64,
        "urgency": "high",
        "providerCount": 7,
        "requestCount": 8,
        "transferBytes": 139873,
        "notGreenCount": 5,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76592,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15571,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7163,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5670,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2862,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=iiivcx&url=https%3A%2F%2Fwww.barcelona.cat%2Fen%2Fwhat-to-do-in-bcn%2Fmontjuic-park%2Ffind-out-about-montjuic-park-council",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "high",
            "detail": "Track 7 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."
          },
          {
            "title": "Prioritize greener alternatives for third-party providers",
            "urgency": "high",
            "detail": "5 third-party script origin(s) are not confirmed green in the Green Web Foundation dataset."
          }
        ]
      },
      "redundancy": {
        "score": 15,
        "urgency": "low",
        "transferBytes": 1184464,
        "estimatedRedundantBytes": 113238,
        "redundancyRatio": 0.0956027367653217,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 81339,
            "displayValue": "Est savings of 79 KiB"
          },
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 31899,
            "displayValue": "Est savings of 31 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 81339,
            "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 unused javascript",
            "urgency": "medium",
            "estimatedSavingsBytes": 31899,
            "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 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": 31,
        "urgency": "medium",
        "totalTransferBytes": 1184464,
        "heavyRequestCount": 5,
        "heavyBytes": 697709,
        "heavyRatio": 0.5890504059220035,
        "heavyRequests": [
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_medium/public/consell_parc.jpg?itok=gL7I6i2n",
            "transferSize": 426513,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "transferSize": 90570,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "transferSize": 76592,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "cdn.matomo.cloud"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament/fonts/icoajuntament.ttf?8aaig7",
            "transferSize": 54929,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/css/css_evpTRQTawGYS1Ro7RbXq3hBxwat7AU-RJm1V8ZgzeaE.css?delta=5&language=en&theme=barcelonacat_theme&include=eJyFzsGKwzAMBNAfiuvDfpAZOyJxcSQjydn272sodFnIsieJmXcY3Ac7DmJPOKuJxfcJ6HXJ0EJNGAWe5CTVupLFqUdwkTb7v0zHRuGs9P0b-E4HxSzi5oqeyspXYGuS0YL5s1XerkQtEvDZfiVMxsySgS19_Qe6ypILp8kU8fMlejgpoy0dim0u3i2uOjra7Se5De4jt2o7rYs9zemIGUYvwgyJSg&tcut5n",
            "transferSize": 49105,
            "resourceType": "stylesheet",
            "mimeType": "text/css",
            "domain": "www.barcelona.cat"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "image",
            "count": 1,
            "transferBytes": 426513
          },
          {
            "resourceType": "font",
            "count": 2,
            "transferBytes": 145499
          },
          {
            "resourceType": "script",
            "count": 1,
            "transferBytes": 76592
          },
          {
            "resourceType": "stylesheet",
            "count": 1,
            "transferBytes": 49105
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.barcelona.cat",
            "count": 4,
            "transferBytes": 621117
          },
          {
            "domain": "cdn.matomo.cloud",
            "count": 1,
            "transferBytes": 76592
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Lazy-load offscreen images and media galleries",
            "urgency": "medium",
            "estimatedSavingsBytes": 83661,
            "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": "Defer non-critical UI modules until after first render",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "strategy": "Keep only above-the-fold resources in the initial path; hydrate or import secondary modules later.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 www.barcelona.cat",
            "urgency": "high",
            "estimatedSavingsBytes": 426513,
            "strategy": "Serve a smaller placeholder first and load this asset only when the user scrolls to or requests the component.",
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_medium/public/consell_parc.jpg?itok=gL7I6i2n",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 www.barcelona.cat",
            "urgency": "medium",
            "estimatedSavingsBytes": 90570,
            "strategy": "Subset or defer this font so full font payloads are only fetched when needed.",
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 cdn.matomo.cloud",
            "urgency": "medium",
            "estimatedSavingsBytes": 76592,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.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": "10.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: 10.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 31 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 31 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,
          "displayValue": "Est savings of 79 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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 79 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,
          "displayValue": "Est savings of 434 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 434 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 368 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 368 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,
          "displayValue": "Est savings of 82 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 82 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": "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": 0,
          "displayValue": "Est savings of 1,410 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 Eliminate render-blocking resources\n\n- Lighthouse audit: render-blocking-resources\n- Current value: Est savings of 1,410 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\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-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 330 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 330 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": "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": 0.75,
          "displayValue": "4.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 Speed Index\n\n- Lighthouse audit: speed-index\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\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": "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": "939 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: 939 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://barcelona.cat/ca",
      "status": "ok",
      "finalUrl": "https://www.barcelona.cat/ca",
      "performanceScore": 0.2,
      "bestPracticesScore": 0.79,
      "transferBytes": 9304565,
      "co2Grams": 3.5644057865910006,
      "greenWeb": {
        "page": {
          "hostname": "www.barcelona.cat",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-13T22:38:00.231825",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.barcelona.cat",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "mobile.com-shi-va.barcelona.cat",
            "resourceType": "script",
            "requestCount": 4,
            "transferBytes": 726958,
            "sampleUrl": "https://mobile.com-shi-va.barcelona.cat/assets/index-CiPq0rWH.js",
            "greenCheck": {
              "hostname": "mobile.com-shi-va.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:58.833590",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/mobile.com-shi-va.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "com-shi-va.barcelona.cat",
            "resourceType": "script",
            "requestCount": 4,
            "transferBytes": 553483,
            "sampleUrl": "https://com-shi-va.barcelona.cat/assets/index-97beb0ec.js",
            "greenCheck": {
              "hostname": "com-shi-va.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:58.890330",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/com-shi-va.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "maps.googleapis.com",
            "resourceType": "script",
            "requestCount": 5,
            "transferBytes": 321496,
            "sampleUrl": "https://maps.googleapis.com/maps/api/js?key=AIzaSyA1hYiZ1NN9YNkxQPWfVHYhI7hmS1JLlLI&libraries=places%2Cgeometry&language=ca&v=3.47&callback=vueGoogleMapsInit",
            "greenCheck": {
              "hostname": "maps.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:28",
              "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/maps.googleapis.com",
              "error": null
            }
          },
          {
            "hostname": "mobile.com-shi-va.barcelona.cat",
            "resourceType": "stylesheet",
            "requestCount": 1,
            "transferBytes": 220905,
            "sampleUrl": "https://mobile.com-shi-va.barcelona.cat/assets/index-DFDXDFpa.css",
            "greenCheck": {
              "hostname": "mobile.com-shi-va.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:58.833590",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/mobile.com-shi-va.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 11,
            "transferBytes": 153586,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 147053,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "releases.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 126719,
            "sampleUrl": "https://releases.jquery.com/git/ui/jquery-ui-git.js",
            "greenCheck": {
              "hostname": "releases.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:38:00.162467",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/releases.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "com-shi-va.barcelona.cat",
            "resourceType": "stylesheet",
            "requestCount": 1,
            "transferBytes": 62190,
            "sampleUrl": "https://com-shi-va.barcelona.cat/assets/index-62bfe776.css",
            "greenCheck": {
              "hostname": "com-shi-va.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:58.890330",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/com-shi-va.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31745,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "stylesheet",
            "requestCount": 1,
            "transferBytes": 24657,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "cdnjs.cloudflare.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15911,
            "sampleUrl": "https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js",
            "greenCheck": {
              "hostname": "cdnjs.cloudflare.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:34",
              "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/cdnjs.cloudflare.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15566,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "stylesheet",
            "requestCount": 8,
            "transferBytes": 11132,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/css/bcn-avisos.css",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "www.youtube.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 11061,
            "sampleUrl": "https://www.youtube.com/iframe_api",
            "greenCheck": {
              "hostname": "www.youtube.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2026-01-10T15:09:17",
              "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.youtube.com",
              "error": null
            }
          },
          {
            "hostname": "fonts.googleapis.com",
            "resourceType": "stylesheet",
            "requestCount": 10,
            "transferBytes": 8274,
            "sampleUrl": "https://fonts.googleapis.com/css?family=Source+Sans+3:200,200i,300,300i,400,400i,500,500i,600,600i,700,700i,900,900i",
            "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
            }
          },
          {
            "hostname": "geoportal.barcelona.cat",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 8188,
            "sampleUrl": "https://geoportal.barcelona.cat/PlanolBCN/webconfig.js.ashx?lang=CA",
            "greenCheck": {
              "hostname": "geoportal.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.864845",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/geoportal.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 5,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 3,
            "transferBytes": 807,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=7vbLg3&url=https%3A%2F%2Fwww.barcelona.cat%2Fca",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 19,
          "greenCount": 7,
          "notGreenCount": 13,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 60,
        "urgency": "high",
        "pageElementOccurrences": 2,
        "uniqueElementsAssessed": 1,
        "reusedFromCacheCount": 1,
        "components": [
          {
            "signature": "form|get|/ca|input|text|query|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "text",
            "fieldName": "query",
            "formContext": "form|get|/ca",
            "hasLabel": true,
            "hasValidationRule": false,
            "hasErrorMessagingHook": false,
            "toolingFriendly": false,
            "assessment": {
              "score": 60,
              "urgency": "high",
              "issues": [
                "No explicit validation rule",
                "No error messaging hook",
                "Missing autocomplete for tooling support"
              ],
              "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.",
                "Provide meaningful autocomplete values to support browsers and assistive tooling."
              ]
            },
            "reusedFromCache": true
          }
        ],
        "recommendations": [
          {
            "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."
          },
          {
            "title": "Missing autocomplete for tooling support",
            "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": "El portal web oficial de Barcelona | Ajuntament de Barcelona",
          "lang": "ca",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "Portal oficial de Barcelona. Accediu als tràmits de l'administració, actualitat de serveis municipals, mobilitat, agenda cultural i recursos per viure i treballar a la ciutat.",
          "robots": "",
          "canonical": "https://www.barcelona.cat/ca",
          "ogTitle": "Barcelona.cat",
          "ogDescription": "Connecta amb Barcelona. Troba tota la informació pràctica per al dia a dia: des de tràmits i serveis públics fins a l'agenda de cultura i oci.",
          "ogType": "Web",
          "ogUrl": "https://www.barcelona.cat/ca/home",
          "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": 42,
        "urgency": "medium",
        "checks": {
          "testedMobile": true,
          "testedTablet": true,
          "horizontalOverflowOnMobile": false,
          "horizontalOverflowOnTablet": false,
          "mobileSmallTapTargets": 64,
          "tabletSmallTapTargets": 58,
          "fixedWidthOffenders": 6,
          "oversizedMedia": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 3,
            "smallTapTargets": 64,
            "oversizedMedia": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 3,
            "smallTapTargets": 58,
            "oversizedMedia": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 64 small targets on mobile and 58 on tablet."
          },
          {
            "title": "Refactor fixed-width components",
            "urgency": "medium",
            "detail": "6 element(s) exceeded viewport width in tested layouts; use responsive component constraints."
          }
        ]
      },
      "securityLight": {
        "score": 59,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": true,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": true,
          "externalScriptCount": 10,
          "externalScriptsWithoutIntegrity": 10,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "age": "63",
            "cache-control": "max-age=300, public",
            "content-encoding": "gzip",
            "content-language": "ca",
            "content-length": "17847",
            "content-type": "text/html; charset=UTF-8",
            "date": "Mon, 13 Apr 2026 22:37:55 GMT",
            "etag": "\"1776119874-gzip\"",
            "expires": "Sun, 19 Nov 1978 05:00:00 GMT",
            "last-modified": "Mon, 13 Apr 2026 22:37:54 GMT",
            "server": "nginx",
            "vary": "Cookie,Accept-Encoding",
            "via": "1.1 ca2190123e61f1744d1210c24c87c840.cloudfront.net (CloudFront)",
            "x-amz-cf-id": "b8y3qKS_odJG7NzWV1bsXaXimOzLyAbJA8FLgOWNk8PlOQ5WWcQ_ig==",
            "x-amz-cf-pop": "IAD12-P5",
            "x-cache": "Hit from cloudfront",
            "x-content-type-options": "nosniff",
            "x-frame-options": "SAMEORIGIN",
            "x-generator": "Drupal 10 (https://www.drupal.org)"
          },
          "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": "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": "10 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 25,
        "urgency": "low",
        "origin": "https://www.barcelona.cat",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://www.barcelona.cat/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/sitemap.xml",
            "found": true,
            "status": 200,
            "contentType": "application/xml; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/manifest.webmanifest",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/favicon.ico",
            "found": true,
            "status": 200,
            "contentType": "image/x-icon"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "low",
            "detail": "Missing beneficial file(s): /.well-known/security.txt, /manifest.webmanifest."
          }
        ]
      },
      "mediaHints": {
        "score": 20,
        "urgency": "low",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 52,
          "imagesWithLazy": 28,
          "imagesWithoutLazy": 24
        },
        "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."
          }
        ]
      },
      "wsgCustom": {
        "score": 85,
        "urgency": "medium",
        "data": {
          "hasPrintStyles": true,
          "hasReducedMotion": true,
          "media": {
            "totalImages": 56,
            "lazyImages": 29,
            "totalIframes": 5,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "\"Source Sans Pro\", \"Helvetica Neue\", Helvetica, Arial, sans-serif",
            "usesSystemFont": true
          },
          "tracking": {
            "count": 0,
            "scripts": []
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 29/56 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": "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"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 57,
        "urgency": "medium",
        "totalEstimatedSavingsBytes": 5313602.5,
        "checks": {
          "hasEffectiveTextCompression": false
        },
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Use modern image compression formats",
            "urgency": "high",
            "estimatedSavingsBytes": 3222951.5,
            "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": 1994763,
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings."
          },
          {
            "id": "unminified-javascript",
            "title": "Minify JavaScript before transfer",
            "urgency": "high",
            "estimatedSavingsBytes": 87247,
            "detail": "Minify JS bundles so transport compression produces better results with fewer bytes."
          },
          {
            "id": "uses-text-compression",
            "title": "Enable Brotli/gzip for text assets",
            "urgency": "low",
            "estimatedSavingsBytes": 4972,
            "detail": "Compress HTML, CSS, JS, JSON, SVG, and XML responses with Brotli or gzip."
          },
          {
            "id": "unminified-css",
            "title": "Minify CSS before transfer",
            "urgency": "low",
            "estimatedSavingsBytes": 3669,
            "detail": "Minification amplifies compression efficiency and reduces payload 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: 3.07 MB."
          },
          {
            "title": "Improve image encoding quality/size",
            "urgency": "high",
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 1.90 MB."
          },
          {
            "title": "Minify JavaScript before transfer",
            "urgency": "high",
            "detail": "Minify JS bundles so transport compression produces better results with fewer bytes. Estimated savings: 85.20 KB."
          },
          {
            "title": "Enable Brotli/gzip for text assets",
            "urgency": "low",
            "detail": "Compress HTML, CSS, JS, JSON, SVG, and XML responses with Brotli or gzip. Estimated savings: 4.86 KB."
          },
          {
            "title": "Minify CSS before transfer",
            "urgency": "low",
            "detail": "Minification amplifies compression efficiency and reduces payload size. Estimated savings: 3.58 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": 7928606.5,
        "totalEstimatedBlockingMs": 1426,
        "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": 3222951.5,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 3,147 KiB",
            "urgency": "high",
            "sourceAuditId": "modern-image-formats"
          },
          {
            "id": "uses-optimized-images",
            "title": "Compress oversized image assets",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss.",
            "estimatedSavingsBytes": 1994763,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 1,948 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": 1933763,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 1,888 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": 327636,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 320 KiB",
            "urgency": "high",
            "sourceAuditId": "unused-css-rules"
          },
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 271551,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 265 KiB",
            "urgency": "high",
            "sourceAuditId": "offscreen-images"
          },
          {
            "id": "unminified-javascript",
            "title": "Minify JavaScript",
            "detail": "Use minified production JS output to reduce payload size.",
            "estimatedSavingsBytes": 87247,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 85 KiB",
            "urgency": "high",
            "sourceAuditId": "unminified-javascript"
          },
          {
            "id": "render-blocking-resources",
            "title": "Eliminate render-blocking resources",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering.",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1426,
            "displayValue": "Est savings of 1,430 ms",
            "urgency": "high",
            "sourceAuditId": "render-blocking-resources"
          },
          {
            "id": "uses-responsive-images",
            "title": "Right-size images for viewport",
            "detail": "Avoid sending larger images than the rendered size needs.",
            "estimatedSavingsBytes": 82054,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 80 KiB",
            "urgency": "medium",
            "sourceAuditId": "uses-responsive-images"
          },
          {
            "id": "uses-text-compression",
            "title": "Enable text compression",
            "detail": "Serve text assets with Brotli or gzip to remove avoidable transfer bloat.",
            "estimatedSavingsBytes": 4972,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 5 KiB",
            "urgency": "low",
            "sourceAuditId": "uses-text-compression"
          },
          {
            "id": "unminified-css",
            "title": "Minify CSS",
            "detail": "Use minified production CSS output to reduce bytes in transit.",
            "estimatedSavingsBytes": 3669,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 4 KiB",
            "urgency": "low",
            "sourceAuditId": "unminified-css"
          }
        ],
        "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: 3.07 MB."
          },
          {
            "title": "Compress oversized image assets",
            "urgency": "high",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 1.90 MB."
          },
          {
            "title": "Remove unused JavaScript",
            "urgency": "high",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 1.84 MB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "high",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 319.96 KB."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "high",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 265.19 KB."
          },
          {
            "title": "Minify JavaScript",
            "urgency": "high",
            "detail": "Use minified production JS output to reduce payload size. Estimated byte savings: 85.20 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": 10,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 10,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "10 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": 3095624.071659684
        },
        "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.95 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.95 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": 16,
        "urgency": "high",
        "transferBytes": 9304565,
        "css": {
          "unusedBytes": 327636,
          "ratio": 0.035212393056526556,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 1933763,
          "duplicatedBytes": 0,
          "ratio": 0.20782949014811547,
          "auditIds": [
            "unused-javascript",
            "duplicated-javascript"
          ]
        },
        "html": {
          "estimatedPenalty": 0.25,
          "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": "high",
            "estimatedSavingsBytes": 327636,
            "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": 1933763,
            "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": 9304565,
        "estimatedDeferrableBytes": 2532950,
        "renderBlockingMs": 1426,
        "breakdown": {
          "offscreenImageSavings": 271551,
          "unusedJavascriptSavings": 1933763,
          "unusedCssSavings": 327636
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "high",
            "estimatedSavingsBytes": 271551,
            "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": 1933763,
            "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": "high",
            "estimatedSavingsBytes": 327636,
            "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": "Eliminate render-blocking resources",
            "area": "render-path",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1426,
            "strategy": "Defer scripts/styles not required for first paint and preload only truly critical assets.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-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 www.barcelona.cat",
            "area": "image",
            "urgency": "high",
            "estimatedSavingsBytes": 1071769,
            "url": "https://www.barcelona.cat/sites/default/files/platja_1920x540.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 mobile.com-shi-va.barcelona.cat",
            "area": "script",
            "urgency": "high",
            "estimatedSavingsBytes": 715602,
            "url": "https://mobile.com-shi-va.barcelona.cat/assets/index-CiPq0rWH.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 com-shi-va.barcelona.cat",
            "area": "script",
            "urgency": "high",
            "estimatedSavingsBytes": 546241,
            "url": "https://com-shi-va.barcelona.cat/assets/index-97beb0ec.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": 90,
        "urgency": "high",
        "providerCount": 14,
        "requestCount": 42,
        "transferBytes": 2120880,
        "notGreenCount": 9,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "mobile.com-shi-va.barcelona.cat",
            "resourceType": "script",
            "requestCount": 4,
            "transferBytes": 726958,
            "sampleUrl": "https://mobile.com-shi-va.barcelona.cat/assets/index-CiPq0rWH.js",
            "greenCheck": {
              "hostname": "mobile.com-shi-va.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:58.833590",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/mobile.com-shi-va.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "com-shi-va.barcelona.cat",
            "resourceType": "script",
            "requestCount": 4,
            "transferBytes": 553483,
            "sampleUrl": "https://com-shi-va.barcelona.cat/assets/index-97beb0ec.js",
            "greenCheck": {
              "hostname": "com-shi-va.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:58.890330",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/com-shi-va.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "maps.googleapis.com",
            "resourceType": "script",
            "requestCount": 5,
            "transferBytes": 321496,
            "sampleUrl": "https://maps.googleapis.com/maps/api/js?key=AIzaSyA1hYiZ1NN9YNkxQPWfVHYhI7hmS1JLlLI&libraries=places%2Cgeometry&language=ca&v=3.47&callback=vueGoogleMapsInit",
            "greenCheck": {
              "hostname": "maps.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:28",
              "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/maps.googleapis.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 11,
            "transferBytes": 153586,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 147053,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "releases.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 126719,
            "sampleUrl": "https://releases.jquery.com/git/ui/jquery-ui-git.js",
            "greenCheck": {
              "hostname": "releases.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:38:00.162467",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/releases.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31745,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "cdnjs.cloudflare.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15911,
            "sampleUrl": "https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js",
            "greenCheck": {
              "hostname": "cdnjs.cloudflare.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:34",
              "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/cdnjs.cloudflare.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15566,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "www.youtube.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 11061,
            "sampleUrl": "https://www.youtube.com/iframe_api",
            "greenCheck": {
              "hostname": "www.youtube.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2026-01-10T15:09:17",
              "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.youtube.com",
              "error": null
            }
          },
          {
            "hostname": "geoportal.barcelona.cat",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 8188,
            "sampleUrl": "https://geoportal.barcelona.cat/PlanolBCN/webconfig.js.ashx?lang=CA",
            "greenCheck": {
              "hostname": "geoportal.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.864845",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/geoportal.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 5,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 3,
            "transferBytes": 807,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=7vbLg3&url=https%3A%2F%2Fwww.barcelona.cat%2Fca",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "high",
            "detail": "Track 14 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."
          },
          {
            "title": "Prioritize greener alternatives for third-party providers",
            "urgency": "high",
            "detail": "9 third-party script origin(s) are not confirmed green in the Green Web Foundation dataset."
          }
        ]
      },
      "redundancy": {
        "score": 48,
        "urgency": "high",
        "transferBytes": 9304565,
        "estimatedRedundantBytes": 2261399,
        "redundancyRatio": 0.243041883204642,
        "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": 1933763,
            "displayValue": "Est savings of 1,888 KiB"
          },
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 327636,
            "displayValue": "Est savings of 320 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused javascript",
            "urgency": "high",
            "estimatedSavingsBytes": 1933763,
            "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": "high",
            "estimatedSavingsBytes": 327636,
            "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": "Enable and verify text compression",
            "urgency": "medium",
            "estimatedSavingsBytes": 4972,
            "auditId": "uses-text-compression",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "2",
              "title": "Remove unnecessary or redundant information",
              "url": "https://www.w3.org/TR/web-sustainability-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": 45,
        "urgency": "high",
        "totalTransferBytes": 9304565,
        "heavyRequestCount": 25,
        "heavyBytes": 7079472,
        "heavyRatio": 0.760860072448309,
        "heavyRequests": [
          {
            "url": "https://www.barcelona.cat/sites/default/files/platja_1920x540.jpg",
            "transferSize": 1071769,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://api.com-shi-va.barcelona.cat/other_bus/lines/?RECORRIDO=0&access_token=1UWeUzjkmvYh93M14bl7JvnNwVkJSK",
            "transferSize": 730853,
            "resourceType": "xhr",
            "mimeType": "application/json",
            "domain": "api.com-shi-va.barcelona.cat"
          },
          {
            "url": "https://mobile.com-shi-va.barcelona.cat/assets/index-CiPq0rWH.js",
            "transferSize": 715602,
            "resourceType": "script",
            "mimeType": "text/javascript",
            "domain": "mobile.com-shi-va.barcelona.cat"
          },
          {
            "url": "https://com-shi-va.barcelona.cat/assets/index-97beb0ec.js",
            "transferSize": 546241,
            "resourceType": "script",
            "mimeType": "text/javascript",
            "domain": "com-shi-va.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/gentgranmontserratolivella_1900x547_0.jpg",
            "transferSize": 498990,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/vistes_aeries_bcn_5_1900x547.jpg",
            "transferSize": 427875,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://api.com-shi-va.barcelona.cat/bus/lines/?RECORRIDO=0&access_token=1UWeUzjkmvYh93M14bl7JvnNwVkJSK",
            "transferSize": 279005,
            "resourceType": "xhr",
            "mimeType": "application/json",
            "domain": "api.com-shi-va.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/una-nena-en-banyador-es-refresca-a-la%20%281%29.jpg",
            "transferSize": 256039,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/estatics/geobcn/1.2/api-full-ca.js",
            "transferSize": 247066,
            "resourceType": "script",
            "mimeType": "text/javascript",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/estatics/geobcn/1.2/js/lib/openlayers/ol-6.15.1.js",
            "transferSize": 243722,
            "resourceType": "script",
            "mimeType": "text/javascript",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/cap_mobile/public/vistes_aeries_bcn_5_1900x547.jpg?itok=h0iRuX1p",
            "transferSize": 227507,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://mobile.com-shi-va.barcelona.cat/assets/index-DFDXDFpa.css",
            "transferSize": 220905,
            "resourceType": "stylesheet",
            "mimeType": "text/css",
            "domain": "mobile.com-shi-va.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/cap_mobile/public/platja_1024x400.jpg?itok=LXkeezfq",
            "transferSize": 209916,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/cap_mobile/public/una-nena-en-banyador-es-refresca-a-la%20%281%29.jpg?itok=Kgm8Kyg7",
            "transferSize": 202153,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://maps.googleapis.com/maps/api/js?key=AIzaSyA1hYiZ1NN9YNkxQPWfVHYhI7hmS1JLlLI&libraries=places%2Cgeometry&language=ca&v=3.47&callback=vueGoogleMapsInit",
            "transferSize": 186125,
            "resourceType": "script",
            "mimeType": "text/javascript",
            "domain": "maps.googleapis.com"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/cap_mobile/public/gentgranmontserratolivella_1900x547_0.jpg?itok=WhrMktlq",
            "transferSize": 175518,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/Banner_Municipals_252x252_CAT%20%281%29.png",
            "transferSize": 157622,
            "resourceType": "image",
            "mimeType": "image/png",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://releases.jquery.com/git/ui/jquery-ui-git.js",
            "transferSize": 126719,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "releases.jquery.com"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/ICUB_WebBarcelona_252x252px_0.png",
            "transferSize": 110511,
            "resourceType": "image",
            "mimeType": "image/png",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/estatics-planol/v1.2/library/jquery-ui-1.10.4.js",
            "transferSize": 109118,
            "resourceType": "script",
            "mimeType": "text/javascript",
            "domain": "www.barcelona.cat"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "image",
            "count": 10,
            "transferBytes": 3337900
          },
          {
            "resourceType": "script",
            "count": 8,
            "transferBytes": 2251184
          },
          {
            "resourceType": "xhr",
            "count": 2,
            "transferBytes": 1009858
          },
          {
            "resourceType": "stylesheet",
            "count": 3,
            "transferBytes": 335039
          },
          {
            "resourceType": "font",
            "count": 2,
            "transferBytes": 145491
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.barcelona.cat",
            "count": 16,
            "transferBytes": 4135241
          },
          {
            "domain": "api.com-shi-va.barcelona.cat",
            "count": 2,
            "transferBytes": 1009858
          },
          {
            "domain": "mobile.com-shi-va.barcelona.cat",
            "count": 2,
            "transferBytes": 936507
          },
          {
            "domain": "com-shi-va.barcelona.cat",
            "count": 2,
            "transferBytes": 608431
          },
          {
            "domain": "maps.googleapis.com",
            "count": 1,
            "transferBytes": 186125
          },
          {
            "domain": "releases.jquery.com",
            "count": 1,
            "transferBytes": 126719
          },
          {
            "domain": "cdn.matomo.cloud",
            "count": 1,
            "transferBytes": 76591
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Lazy-load offscreen images and media galleries",
            "urgency": "high",
            "estimatedSavingsBytes": 271551,
            "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": 1933763,
            "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": "Defer non-critical UI modules until after first render",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "strategy": "Keep only above-the-fold resources in the initial path; hydrate or import secondary modules later.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 www.barcelona.cat",
            "urgency": "high",
            "estimatedSavingsBytes": 1071769,
            "strategy": "Serve a smaller placeholder first and load this asset only when the user scrolls to or requests the component.",
            "url": "https://www.barcelona.cat/sites/default/files/platja_1920x540.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 api.com-shi-va.barcelona.cat",
            "urgency": "high",
            "estimatedSavingsBytes": 730853,
            "strategy": "Move this asset behind an explicit interaction, route boundary, or lazy-loading trigger.",
            "url": "https://api.com-shi-va.barcelona.cat/other_bus/lines/?RECORRIDO=0&access_token=1UWeUzjkmvYh93M14bl7JvnNwVkJSK",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 mobile.com-shi-va.barcelona.cat",
            "urgency": "high",
            "estimatedSavingsBytes": 715602,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://mobile.com-shi-va.barcelona.cat/assets/index-CiPq0rWH.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": "18.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: 18.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": "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": 0.27,
          "displayValue": "7.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 Speed Index\n\n- Lighthouse audit: speed-index\n- Current value: 7.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\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": 0,
          "displayValue": "Est savings of 1,888 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 1,888 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,
          "displayValue": "Est savings of 320 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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 320 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,
          "displayValue": "Est savings of 3,147 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 3,147 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 1,948 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 1,948 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,
          "displayValue": "Est savings of 265 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 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"
        },
        {
          "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": 0,
          "displayValue": "Est savings of 1,430 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 Eliminate render-blocking resources\n\n- Lighthouse audit: render-blocking-resources\n- Current value: Est savings of 1,430 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\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": "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,
          "displayValue": "1,638 elements",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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: 1,638 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"
        },
        {
          "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": 0.5,
          "displayValue": "Est savings of 5 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 Enable text compression\n\n- Lighthouse audit: uses-text-compression\n- Current value: Est savings of 5 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\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": "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 9,086 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 9,086 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://barcelona.cat/en",
      "status": "ok",
      "finalUrl": "https://www.barcelona.cat/en",
      "performanceScore": 0.31,
      "bestPracticesScore": 0.82,
      "transferBytes": 9133170,
      "co2Grams": 3.4987475500380003,
      "greenWeb": {
        "page": {
          "hostname": "www.barcelona.cat",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-13T22:38:00.231825",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.barcelona.cat",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "mobile.com-shi-va.barcelona.cat",
            "resourceType": "script",
            "requestCount": 4,
            "transferBytes": 726938,
            "sampleUrl": "https://mobile.com-shi-va.barcelona.cat/assets/index-CiPq0rWH.js",
            "greenCheck": {
              "hostname": "mobile.com-shi-va.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:58.833590",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/mobile.com-shi-va.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "com-shi-va.barcelona.cat",
            "resourceType": "script",
            "requestCount": 4,
            "transferBytes": 546220,
            "sampleUrl": "https://com-shi-va.barcelona.cat/assets/index-97beb0ec.js",
            "greenCheck": {
              "hostname": "com-shi-va.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:58.890330",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/com-shi-va.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "mobile.com-shi-va.barcelona.cat",
            "resourceType": "stylesheet",
            "requestCount": 1,
            "transferBytes": 220914,
            "sampleUrl": "https://mobile.com-shi-va.barcelona.cat/assets/index-DFDXDFpa.css",
            "greenCheck": {
              "hostname": "mobile.com-shi-va.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:58.833590",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/mobile.com-shi-va.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "maps.googleapis.com",
            "resourceType": "script",
            "requestCount": 5,
            "transferBytes": 185261,
            "sampleUrl": "https://maps.googleapis.com/maps/api/js?key=AIzaSyA1hYiZ1NN9YNkxQPWfVHYhI7hmS1JLlLI&libraries=places%2Cgeometry&language=en&v=3.47&callback=vueGoogleMapsInit",
            "greenCheck": {
              "hostname": "maps.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:28",
              "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/maps.googleapis.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 10,
            "transferBytes": 153570,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 146720,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "releases.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 126610,
            "sampleUrl": "https://releases.jquery.com/git/ui/jquery-ui-git.js",
            "greenCheck": {
              "hostname": "releases.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:38:00.162467",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/releases.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "com-shi-va.barcelona.cat",
            "resourceType": "stylesheet",
            "requestCount": 1,
            "transferBytes": 62179,
            "sampleUrl": "https://com-shi-va.barcelona.cat/assets/index-62bfe776.css",
            "greenCheck": {
              "hostname": "com-shi-va.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:58.890330",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/com-shi-va.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "stylesheet",
            "requestCount": 1,
            "transferBytes": 24660,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "cdnjs.cloudflare.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15863,
            "sampleUrl": "https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js",
            "greenCheck": {
              "hostname": "cdnjs.cloudflare.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:34",
              "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/cdnjs.cloudflare.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15565,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "stylesheet",
            "requestCount": 7,
            "transferBytes": 11119,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/css/bcn-avisos.css",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "www.youtube.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 11067,
            "sampleUrl": "https://www.youtube.com/iframe_api",
            "greenCheck": {
              "hostname": "www.youtube.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2026-01-10T15:09:17",
              "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.youtube.com",
              "error": null
            }
          },
          {
            "hostname": "fonts.googleapis.com",
            "resourceType": "stylesheet",
            "requestCount": 10,
            "transferBytes": 8274,
            "sampleUrl": "https://fonts.googleapis.com/css?family=Source+Sans+3:200,200i,300,300i,400,400i,500,500i,600,600i,700,700i,900,900i",
            "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
            }
          },
          {
            "hostname": "geoportal.barcelona.cat",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 8171,
            "sampleUrl": "https://geoportal.barcelona.cat/PlanolBCN/webconfig.js.ashx?lang=EN",
            "greenCheck": {
              "hostname": "geoportal.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.864845",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/geoportal.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5624,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 5,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 3,
            "transferBytes": 807,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=7pvCms&url=https%3A%2F%2Fwww.barcelona.cat%2Fen",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 19,
          "greenCount": 7,
          "notGreenCount": 13,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 56.666666666666664,
        "urgency": "medium",
        "pageElementOccurrences": 5,
        "uniqueElementsAssessed": 3,
        "reusedFromCacheCount": 2,
        "components": [
          {
            "signature": "form|get|/en|input|text|query|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "text",
            "fieldName": "query",
            "formContext": "form|get|/en",
            "hasLabel": true,
            "hasValidationRule": false,
            "hasErrorMessagingHook": false,
            "toolingFriendly": false,
            "assessment": {
              "score": 60,
              "urgency": "high",
              "issues": [
                "No explicit validation rule",
                "No error messaging hook",
                "Missing autocomplete for tooling support"
              ],
              "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.",
                "Provide meaningful autocomplete values to support browsers and assistive tooling."
              ]
            },
            "reusedFromCache": true
          },
          {
            "signature": "form|get|/ca|input|text|query|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "text",
            "fieldName": "query",
            "formContext": "form|get|/ca",
            "hasLabel": false,
            "hasValidationRule": false,
            "hasErrorMessagingHook": false,
            "toolingFriendly": false,
            "assessment": {
              "score": 60,
              "urgency": "high",
              "issues": [
                "No explicit validation rule",
                "No error messaging hook",
                "Missing autocomplete for tooling support"
              ],
              "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.",
                "Provide meaningful autocomplete values to support browsers and assistive tooling."
              ]
            },
            "reusedFromCache": true
          },
          {
            "signature": "form|get|self|input|checkbox|anonymous|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "checkbox",
            "fieldName": null,
            "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
          }
        ],
        "recommendations": [
          {
            "title": "No explicit validation rule",
            "urgency": "medium",
            "detail": "3 unique form control signature(s) on this page include this issue."
          },
          {
            "title": "No error messaging hook",
            "urgency": "medium",
            "detail": "3 unique form control signature(s) on this page include this issue."
          },
          {
            "title": "Missing autocomplete for tooling support",
            "urgency": "medium",
            "detail": "2 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": "The official Barcelona website | Barcelona City Council",
          "lang": "en",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "Official Barcelona website. Access administrative procedures, news on municipal services and mobility, the cultural calendar and resources for living and working in the city.",
          "robots": "",
          "canonical": "https://www.barcelona.cat/en",
          "ogTitle": "Barcelona.cat",
          "ogDescription": "Connect with Barcelona. Find all the practical information for day-to-day life: from procedures and public services to the cultural and entertainment calendar.",
          "ogType": "Web",
          "ogUrl": "https://www.barcelona.cat/en/home",
          "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": 42,
        "urgency": "medium",
        "checks": {
          "testedMobile": true,
          "testedTablet": true,
          "horizontalOverflowOnMobile": false,
          "horizontalOverflowOnTablet": false,
          "mobileSmallTapTargets": 64,
          "tabletSmallTapTargets": 58,
          "fixedWidthOffenders": 6,
          "oversizedMedia": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 3,
            "smallTapTargets": 64,
            "oversizedMedia": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 3,
            "smallTapTargets": 58,
            "oversizedMedia": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 64 small targets on mobile and 58 on tablet."
          },
          {
            "title": "Refactor fixed-width components",
            "urgency": "medium",
            "detail": "6 element(s) exceeded viewport width in tested layouts; use responsive component constraints."
          }
        ]
      },
      "securityLight": {
        "score": 59,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": true,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": true,
          "externalScriptCount": 10,
          "externalScriptsWithoutIntegrity": 10,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "cache-control": "max-age=300, public",
            "content-encoding": "gzip",
            "content-language": "en",
            "content-length": "17789",
            "content-type": "text/html; charset=UTF-8",
            "date": "Mon, 13 Apr 2026 22:39:28 GMT",
            "etag": "\"1776119967-gzip\"",
            "expires": "Sun, 19 Nov 1978 05:00:00 GMT",
            "last-modified": "Mon, 13 Apr 2026 22:39:27 GMT",
            "server": "nginx",
            "vary": "Cookie,Accept-Encoding",
            "via": "1.1 ca2190123e61f1744d1210c24c87c840.cloudfront.net (CloudFront)",
            "x-amz-cf-id": "Pcs66MJ4VgieEF9HsQSWZoW_pwp0WbWCJp-7bycMChFeXYzxH8ZKBA==",
            "x-amz-cf-pop": "IAD12-P5",
            "x-cache": "Miss from cloudfront",
            "x-content-type-options": "nosniff",
            "x-frame-options": "SAMEORIGIN",
            "x-generator": "Drupal 10 (https://www.drupal.org)"
          },
          "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": "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": "10 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 25,
        "urgency": "low",
        "origin": "https://www.barcelona.cat",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://www.barcelona.cat/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/sitemap.xml",
            "found": true,
            "status": 200,
            "contentType": "application/xml; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/manifest.webmanifest",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/favicon.ico",
            "found": true,
            "status": 200,
            "contentType": "image/x-icon"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "low",
            "detail": "Missing beneficial file(s): /.well-known/security.txt, /manifest.webmanifest."
          }
        ]
      },
      "mediaHints": {
        "score": 20,
        "urgency": "low",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 52,
          "imagesWithLazy": 28,
          "imagesWithoutLazy": 24
        },
        "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."
          }
        ]
      },
      "wsgCustom": {
        "score": 85,
        "urgency": "medium",
        "data": {
          "hasPrintStyles": true,
          "hasReducedMotion": true,
          "media": {
            "totalImages": 56,
            "lazyImages": 29,
            "totalIframes": 5,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "\"Source Sans Pro\", \"Helvetica Neue\", Helvetica, Arial, sans-serif",
            "usesSystemFont": true
          },
          "tracking": {
            "count": 0,
            "scripts": []
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 29/56 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": "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"
          }
        ]
      },
      "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": 5311780.35,
        "checks": {
          "hasEffectiveTextCompression": false
        },
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Use modern image compression formats",
            "urgency": "high",
            "estimatedSavingsBytes": 3221603.35,
            "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": 1994316,
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings."
          },
          {
            "id": "unminified-javascript",
            "title": "Minify JavaScript before transfer",
            "urgency": "high",
            "estimatedSavingsBytes": 87247,
            "detail": "Minify JS bundles so transport compression produces better results with fewer bytes."
          },
          {
            "id": "uses-text-compression",
            "title": "Enable Brotli/gzip for text assets",
            "urgency": "low",
            "estimatedSavingsBytes": 4945,
            "detail": "Compress HTML, CSS, JS, JSON, SVG, and XML responses with Brotli or gzip."
          },
          {
            "id": "unminified-css",
            "title": "Minify CSS before transfer",
            "urgency": "low",
            "estimatedSavingsBytes": 3669,
            "detail": "Minification amplifies compression efficiency and reduces payload 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: 3.07 MB."
          },
          {
            "title": "Improve image encoding quality/size",
            "urgency": "high",
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 1.90 MB."
          },
          {
            "title": "Minify JavaScript before transfer",
            "urgency": "high",
            "detail": "Minify JS bundles so transport compression produces better results with fewer bytes. Estimated savings: 85.20 KB."
          },
          {
            "title": "Enable Brotli/gzip for text assets",
            "urgency": "low",
            "detail": "Compress HTML, CSS, JS, JSON, SVG, and XML responses with Brotli or gzip. Estimated savings: 4.83 KB."
          },
          {
            "title": "Minify CSS before transfer",
            "urgency": "low",
            "detail": "Minification amplifies compression efficiency and reduces payload size. Estimated savings: 3.58 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": 7837244.35,
        "totalEstimatedBlockingMs": 1751,
        "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": 3221603.35,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 3,146 KiB",
            "urgency": "high",
            "sourceAuditId": "modern-image-formats"
          },
          {
            "id": "uses-optimized-images",
            "title": "Compress oversized image assets",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss.",
            "estimatedSavingsBytes": 1994316,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 1,948 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": 1845757,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 1,802 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": 327657,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 320 KiB",
            "urgency": "high",
            "sourceAuditId": "unused-css-rules"
          },
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 269996,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 264 KiB",
            "urgency": "high",
            "sourceAuditId": "offscreen-images"
          },
          {
            "id": "unminified-javascript",
            "title": "Minify JavaScript",
            "detail": "Use minified production JS output to reduce payload size.",
            "estimatedSavingsBytes": 87247,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 85 KiB",
            "urgency": "high",
            "sourceAuditId": "unminified-javascript"
          },
          {
            "id": "render-blocking-resources",
            "title": "Eliminate render-blocking resources",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering.",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1751,
            "displayValue": "Est savings of 1,750 ms",
            "urgency": "high",
            "sourceAuditId": "render-blocking-resources"
          },
          {
            "id": "uses-responsive-images",
            "title": "Right-size images for viewport",
            "detail": "Avoid sending larger images than the rendered size needs.",
            "estimatedSavingsBytes": 82054,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 80 KiB",
            "urgency": "medium",
            "sourceAuditId": "uses-responsive-images"
          },
          {
            "id": "uses-text-compression",
            "title": "Enable text compression",
            "detail": "Serve text assets with Brotli or gzip to remove avoidable transfer bloat.",
            "estimatedSavingsBytes": 4945,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 5 KiB",
            "urgency": "low",
            "sourceAuditId": "uses-text-compression"
          },
          {
            "id": "unminified-css",
            "title": "Minify CSS",
            "detail": "Use minified production CSS output to reduce bytes in transit.",
            "estimatedSavingsBytes": 3669,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 4 KiB",
            "urgency": "low",
            "sourceAuditId": "unminified-css"
          }
        ],
        "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: 3.07 MB."
          },
          {
            "title": "Compress oversized image assets",
            "urgency": "high",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 1.90 MB."
          },
          {
            "title": "Remove unused JavaScript",
            "urgency": "high",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 1.76 MB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "high",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 319.98 KB."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "high",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 263.67 KB."
          },
          {
            "title": "Minify JavaScript",
            "urgency": "high",
            "detail": "Use minified production JS output to reduce payload size. Estimated byte savings: 85.20 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": 10,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 10,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "10 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": 3087981.2271764437
        },
        "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.94 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.94 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": 15,
        "urgency": "high",
        "transferBytes": 9133170,
        "css": {
          "unusedBytes": 327657,
          "ratio": 0.035875495583680146,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 1845757,
          "duplicatedBytes": 0,
          "ratio": 0.20209379656789483,
          "auditIds": [
            "unused-javascript",
            "duplicated-javascript"
          ]
        },
        "html": {
          "estimatedPenalty": 0.25,
          "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": "high",
            "estimatedSavingsBytes": 327657,
            "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": 1845757,
            "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": 23,
        "urgency": "high",
        "transferBytes": 9133170,
        "estimatedDeferrableBytes": 2443410,
        "renderBlockingMs": 1751,
        "breakdown": {
          "offscreenImageSavings": 269996,
          "unusedJavascriptSavings": 1845757,
          "unusedCssSavings": 327657
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "high",
            "estimatedSavingsBytes": 269996,
            "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": 1845757,
            "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": "high",
            "estimatedSavingsBytes": 327657,
            "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": "Eliminate render-blocking resources",
            "area": "render-path",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1751,
            "strategy": "Defer scripts/styles not required for first paint and preload only truly critical assets.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-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 www.barcelona.cat",
            "area": "image",
            "urgency": "high",
            "estimatedSavingsBytes": 1071446,
            "url": "https://www.barcelona.cat/sites/default/files/platja_1920x540_1.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 mobile.com-shi-va.barcelona.cat",
            "area": "script",
            "urgency": "high",
            "estimatedSavingsBytes": 715602,
            "url": "https://mobile.com-shi-va.barcelona.cat/assets/index-CiPq0rWH.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 com-shi-va.barcelona.cat",
            "area": "script",
            "urgency": "high",
            "estimatedSavingsBytes": 546220,
            "url": "https://com-shi-va.barcelona.cat/assets/index-97beb0ec.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": 90,
        "urgency": "high",
        "providerCount": 14,
        "requestCount": 41,
        "transferBytes": 1977023,
        "notGreenCount": 9,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "mobile.com-shi-va.barcelona.cat",
            "resourceType": "script",
            "requestCount": 4,
            "transferBytes": 726938,
            "sampleUrl": "https://mobile.com-shi-va.barcelona.cat/assets/index-CiPq0rWH.js",
            "greenCheck": {
              "hostname": "mobile.com-shi-va.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:58.833590",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/mobile.com-shi-va.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "com-shi-va.barcelona.cat",
            "resourceType": "script",
            "requestCount": 4,
            "transferBytes": 546220,
            "sampleUrl": "https://com-shi-va.barcelona.cat/assets/index-97beb0ec.js",
            "greenCheck": {
              "hostname": "com-shi-va.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:58.890330",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/com-shi-va.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "maps.googleapis.com",
            "resourceType": "script",
            "requestCount": 5,
            "transferBytes": 185261,
            "sampleUrl": "https://maps.googleapis.com/maps/api/js?key=AIzaSyA1hYiZ1NN9YNkxQPWfVHYhI7hmS1JLlLI&libraries=places%2Cgeometry&language=en&v=3.47&callback=vueGoogleMapsInit",
            "greenCheck": {
              "hostname": "maps.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:28",
              "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/maps.googleapis.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 10,
            "transferBytes": 153570,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 146720,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "releases.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 126610,
            "sampleUrl": "https://releases.jquery.com/git/ui/jquery-ui-git.js",
            "greenCheck": {
              "hostname": "releases.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:38:00.162467",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/releases.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "cdnjs.cloudflare.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15863,
            "sampleUrl": "https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js",
            "greenCheck": {
              "hostname": "cdnjs.cloudflare.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:34",
              "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/cdnjs.cloudflare.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15565,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "www.youtube.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 11067,
            "sampleUrl": "https://www.youtube.com/iframe_api",
            "greenCheck": {
              "hostname": "www.youtube.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2026-01-10T15:09:17",
              "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.youtube.com",
              "error": null
            }
          },
          {
            "hostname": "geoportal.barcelona.cat",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 8171,
            "sampleUrl": "https://geoportal.barcelona.cat/PlanolBCN/webconfig.js.ashx?lang=EN",
            "greenCheck": {
              "hostname": "geoportal.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.864845",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/geoportal.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5624,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 5,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 3,
            "transferBytes": 807,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=7pvCms&url=https%3A%2F%2Fwww.barcelona.cat%2Fen",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "high",
            "detail": "Track 14 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."
          },
          {
            "title": "Prioritize greener alternatives for third-party providers",
            "urgency": "high",
            "detail": "9 third-party script origin(s) are not confirmed green in the Green Web Foundation dataset."
          }
        ]
      },
      "redundancy": {
        "score": 48,
        "urgency": "high",
        "transferBytes": 9133170,
        "estimatedRedundantBytes": 2173414,
        "redundancyRatio": 0.23796929215157497,
        "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": 1845757,
            "displayValue": "Est savings of 1,802 KiB"
          },
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 327657,
            "displayValue": "Est savings of 320 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused javascript",
            "urgency": "high",
            "estimatedSavingsBytes": 1845757,
            "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": "high",
            "estimatedSavingsBytes": 327657,
            "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": "Enable and verify text compression",
            "urgency": "medium",
            "estimatedSavingsBytes": 4945,
            "auditId": "uses-text-compression",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "2",
              "title": "Remove unnecessary or redundant information",
              "url": "https://www.w3.org/TR/web-sustainability-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": 46,
        "urgency": "high",
        "totalTransferBytes": 9133170,
        "heavyRequestCount": 25,
        "heavyBytes": 7073270,
        "heavyRatio": 0.7744594702605996,
        "heavyRequests": [
          {
            "url": "https://www.barcelona.cat/sites/default/files/platja_1920x540_1.jpg",
            "transferSize": 1071446,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://api.com-shi-va.barcelona.cat/other_bus/lines/?RECORRIDO=0&access_token=1UWeUzjkmvYh93M14bl7JvnNwVkJSK",
            "transferSize": 727743,
            "resourceType": "xhr",
            "mimeType": "application/json",
            "domain": "api.com-shi-va.barcelona.cat"
          },
          {
            "url": "https://mobile.com-shi-va.barcelona.cat/assets/index-CiPq0rWH.js",
            "transferSize": 715602,
            "resourceType": "script",
            "mimeType": "text/javascript",
            "domain": "mobile.com-shi-va.barcelona.cat"
          },
          {
            "url": "https://com-shi-va.barcelona.cat/assets/index-97beb0ec.js",
            "transferSize": 546220,
            "resourceType": "script",
            "mimeType": "text/javascript",
            "domain": "com-shi-va.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/gentgranmontserratolivella_1900x547_2.jpg",
            "transferSize": 498993,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/vistes_aeries_bcn_5_1900x547_1.jpg",
            "transferSize": 427875,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://api.com-shi-va.barcelona.cat/bus/lines/?RECORRIDO=0&access_token=1UWeUzjkmvYh93M14bl7JvnNwVkJSK",
            "transferSize": 276862,
            "resourceType": "xhr",
            "mimeType": "application/json",
            "domain": "api.com-shi-va.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/una-nena-en-banyador-es-refresca-a-la%20%281%29_1.jpg",
            "transferSize": 256049,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/estatics/geobcn/1.2/api-full-ca.js",
            "transferSize": 247011,
            "resourceType": "script",
            "mimeType": "text/javascript",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/estatics/geobcn/1.2/js/lib/openlayers/ol-6.15.1.js",
            "transferSize": 243723,
            "resourceType": "script",
            "mimeType": "text/javascript",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/cap_mobile/public/vistes_aeries_bcn_5_1900x547_1.jpg?itok=3Z4-xTNJ",
            "transferSize": 227508,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://mobile.com-shi-va.barcelona.cat/assets/index-DFDXDFpa.css",
            "transferSize": 220914,
            "resourceType": "stylesheet",
            "mimeType": "text/css",
            "domain": "mobile.com-shi-va.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/cap_mobile/public/platja_1024x400_1.jpg?itok=AOPri9KF",
            "transferSize": 209925,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/cap_mobile/public/una-nena-en-banyador-es-refresca-a-la%20%281%29_1.jpg?itok=3kOKyCSO",
            "transferSize": 202172,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://maps.googleapis.com/maps/api/js?key=AIzaSyA1hYiZ1NN9YNkxQPWfVHYhI7hmS1JLlLI&libraries=places%2Cgeometry&language=en&v=3.47&callback=vueGoogleMapsInit",
            "transferSize": 185237,
            "resourceType": "script",
            "mimeType": "text/javascript",
            "domain": "maps.googleapis.com"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/cap_mobile/public/gentgranmontserratolivella_1900x547_2.jpg?itok=BMl3PxBR",
            "transferSize": 175516,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/Banner_Municipals_252x252_ENG%20%282%29.png",
            "transferSize": 158206,
            "resourceType": "image",
            "mimeType": "image/png",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://releases.jquery.com/git/ui/jquery-ui-git.js",
            "transferSize": 126610,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "releases.jquery.com"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/ICUB_WebBarcelona_252x252px_0.png",
            "transferSize": 110510,
            "resourceType": "image",
            "mimeType": "image/png",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/estatics-planol/v1.2/library/jquery-ui-1.10.4.js",
            "transferSize": 109118,
            "resourceType": "script",
            "mimeType": "text/javascript",
            "domain": "www.barcelona.cat"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "image",
            "count": 10,
            "transferBytes": 3338200
          },
          {
            "resourceType": "script",
            "count": 8,
            "transferBytes": 2249947
          },
          {
            "resourceType": "xhr",
            "count": 2,
            "transferBytes": 1004605
          },
          {
            "resourceType": "stylesheet",
            "count": 3,
            "transferBytes": 335036
          },
          {
            "resourceType": "font",
            "count": 2,
            "transferBytes": 145482
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.barcelona.cat",
            "count": 16,
            "transferBytes": 4135477
          },
          {
            "domain": "api.com-shi-va.barcelona.cat",
            "count": 2,
            "transferBytes": 1004605
          },
          {
            "domain": "mobile.com-shi-va.barcelona.cat",
            "count": 2,
            "transferBytes": 936516
          },
          {
            "domain": "com-shi-va.barcelona.cat",
            "count": 2,
            "transferBytes": 608399
          },
          {
            "domain": "maps.googleapis.com",
            "count": 1,
            "transferBytes": 185237
          },
          {
            "domain": "releases.jquery.com",
            "count": 1,
            "transferBytes": 126610
          },
          {
            "domain": "cdn.matomo.cloud",
            "count": 1,
            "transferBytes": 76426
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Lazy-load offscreen images and media galleries",
            "urgency": "high",
            "estimatedSavingsBytes": 269996,
            "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": 1845757,
            "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": "Defer non-critical UI modules until after first render",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "strategy": "Keep only above-the-fold resources in the initial path; hydrate or import secondary modules later.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 www.barcelona.cat",
            "urgency": "high",
            "estimatedSavingsBytes": 1071446,
            "strategy": "Serve a smaller placeholder first and load this asset only when the user scrolls to or requests the component.",
            "url": "https://www.barcelona.cat/sites/default/files/platja_1920x540_1.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 api.com-shi-va.barcelona.cat",
            "urgency": "high",
            "estimatedSavingsBytes": 727743,
            "strategy": "Move this asset behind an explicit interaction, route boundary, or lazy-loading trigger.",
            "url": "https://api.com-shi-va.barcelona.cat/other_bus/lines/?RECORRIDO=0&access_token=1UWeUzjkmvYh93M14bl7JvnNwVkJSK",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 mobile.com-shi-va.barcelona.cat",
            "urgency": "high",
            "estimatedSavingsBytes": 715602,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://mobile.com-shi-va.barcelona.cat/assets/index-CiPq0rWH.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": "19.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: 19.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": "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": 0.22,
          "displayValue": "7.9 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 Speed Index\n\n- Lighthouse audit: speed-index\n- Current value: 7.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\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": 0,
          "displayValue": "Est savings of 1,802 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 1,802 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,
          "displayValue": "Est savings of 320 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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 320 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,
          "displayValue": "Est savings of 3,146 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 3,146 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 1,948 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 1,948 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,
          "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": "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": 0,
          "displayValue": "Est savings of 1,750 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 Eliminate render-blocking resources\n\n- Lighthouse audit: render-blocking-resources\n- Current value: Est savings of 1,750 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\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": "server-response-time",
          "title": "Reduce initial server response time",
          "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": 0,
          "displayValue": "Root document took 710 ms",
          "impact": "high",
          "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 Reduce initial server response time\n\n- Lighthouse audit: server-response-time\n- Current value: Root document took 710 ms\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": "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,
          "displayValue": "1,594 elements",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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: 1,594 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"
        },
        {
          "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": 0.5,
          "displayValue": "Est savings of 5 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 Enable text compression\n\n- Lighthouse audit: uses-text-compression\n- Current value: Est savings of 5 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\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": "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,919 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,919 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://barcelona.cat/es",
      "status": "ok",
      "finalUrl": "https://www.barcelona.cat/es",
      "performanceScore": 0.17,
      "bestPracticesScore": 0.79,
      "transferBytes": 9276348,
      "co2Grams": 3.5535963787272005,
      "greenWeb": {
        "page": {
          "hostname": "www.barcelona.cat",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-13T22:38:00.231825",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.barcelona.cat",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "mobile.com-shi-va.barcelona.cat",
            "resourceType": "script",
            "requestCount": 4,
            "transferBytes": 726904,
            "sampleUrl": "https://mobile.com-shi-va.barcelona.cat/assets/index-CiPq0rWH.js",
            "greenCheck": {
              "hostname": "mobile.com-shi-va.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:58.833590",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/mobile.com-shi-va.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "com-shi-va.barcelona.cat",
            "resourceType": "script",
            "requestCount": 4,
            "transferBytes": 551248,
            "sampleUrl": "https://com-shi-va.barcelona.cat/assets/index-97beb0ec.js",
            "greenCheck": {
              "hostname": "com-shi-va.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:58.890330",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/com-shi-va.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "maps.googleapis.com",
            "resourceType": "script",
            "requestCount": 5,
            "transferBytes": 295258,
            "sampleUrl": "https://maps.googleapis.com/maps/api/js?key=AIzaSyA1hYiZ1NN9YNkxQPWfVHYhI7hmS1JLlLI&libraries=places%2Cgeometry&language=es&v=3.47&callback=vueGoogleMapsInit",
            "greenCheck": {
              "hostname": "maps.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:28",
              "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/maps.googleapis.com",
              "error": null
            }
          },
          {
            "hostname": "mobile.com-shi-va.barcelona.cat",
            "resourceType": "stylesheet",
            "requestCount": 1,
            "transferBytes": 220896,
            "sampleUrl": "https://mobile.com-shi-va.barcelona.cat/assets/index-DFDXDFpa.css",
            "greenCheck": {
              "hostname": "mobile.com-shi-va.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:58.833590",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/mobile.com-shi-va.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 10,
            "transferBytes": 153510,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 146718,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "releases.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 126611,
            "sampleUrl": "https://releases.jquery.com/git/ui/jquery-ui-git.js",
            "greenCheck": {
              "hostname": "releases.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:38:00.162467",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/releases.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "com-shi-va.barcelona.cat",
            "resourceType": "stylesheet",
            "requestCount": 1,
            "transferBytes": 62172,
            "sampleUrl": "https://com-shi-va.barcelona.cat/assets/index-62bfe776.css",
            "greenCheck": {
              "hostname": "com-shi-va.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:58.890330",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/com-shi-va.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "stylesheet",
            "requestCount": 1,
            "transferBytes": 24654,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "cdnjs.cloudflare.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15868,
            "sampleUrl": "https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js",
            "greenCheck": {
              "hostname": "cdnjs.cloudflare.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:34",
              "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/cdnjs.cloudflare.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15566,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "www.youtube.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 11090,
            "sampleUrl": "https://www.youtube.com/iframe_api",
            "greenCheck": {
              "hostname": "www.youtube.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2026-01-10T15:09:17",
              "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.youtube.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "stylesheet",
            "requestCount": 7,
            "transferBytes": 11087,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/css/bcn-avisos.css",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "fonts.googleapis.com",
            "resourceType": "stylesheet",
            "requestCount": 10,
            "transferBytes": 8354,
            "sampleUrl": "https://fonts.googleapis.com/css?family=Source+Sans+3:200,200i,300,300i,400,400i,500,500i,600,600i,700,700i,900,900i",
            "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
            }
          },
          {
            "hostname": "geoportal.barcelona.cat",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 8237,
            "sampleUrl": "https://geoportal.barcelona.cat/PlanolBCN/webconfig.js.ashx?lang=ES",
            "greenCheck": {
              "hostname": "geoportal.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.864845",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/geoportal.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5423,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 5,
            "transferBytes": 2860,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 3,
            "transferBytes": 807,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=V5t4d2&url=https%3A%2F%2Fwww.barcelona.cat%2Fes",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 19,
          "greenCount": 7,
          "notGreenCount": 13,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 60,
        "urgency": "high",
        "pageElementOccurrences": 2,
        "uniqueElementsAssessed": 2,
        "reusedFromCacheCount": 1,
        "components": [
          {
            "signature": "form|get|/es/|input|text|query|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "text",
            "fieldName": "query",
            "formContext": "form|get|/es/",
            "hasLabel": true,
            "hasValidationRule": false,
            "hasErrorMessagingHook": false,
            "toolingFriendly": false,
            "assessment": {
              "score": 60,
              "urgency": "high",
              "issues": [
                "No explicit validation rule",
                "No error messaging hook",
                "Missing autocomplete for tooling support"
              ],
              "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.",
                "Provide meaningful autocomplete values to support browsers and assistive tooling."
              ]
            },
            "reusedFromCache": false
          },
          {
            "signature": "form|get|/ca|input|text|query|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "text",
            "fieldName": "query",
            "formContext": "form|get|/ca",
            "hasLabel": false,
            "hasValidationRule": false,
            "hasErrorMessagingHook": false,
            "toolingFriendly": false,
            "assessment": {
              "score": 60,
              "urgency": "high",
              "issues": [
                "No explicit validation rule",
                "No error messaging hook",
                "Missing autocomplete for tooling support"
              ],
              "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.",
                "Provide meaningful autocomplete values to support browsers and assistive tooling."
              ]
            },
            "reusedFromCache": true
          }
        ],
        "recommendations": [
          {
            "title": "No explicit validation rule",
            "urgency": "medium",
            "detail": "2 unique form control signature(s) on this page include this issue."
          },
          {
            "title": "No error messaging hook",
            "urgency": "medium",
            "detail": "2 unique form control signature(s) on this page include this issue."
          },
          {
            "title": "Missing autocomplete for tooling support",
            "urgency": "medium",
            "detail": "2 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": "El portal web oficial de Barcelona | Ayuntamiento de Barcelona",
          "lang": "es",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "Portal oficial de Barcelona. Accede a los trámites de la Administración, actualidad de servicios municipales, movilidad, agenda cultural y recursos para vivir y trabajar en la ciudad.",
          "robots": "",
          "canonical": "https://www.barcelona.cat/es",
          "ogTitle": "Barcelona.cat",
          "ogDescription": "Conecta con Barcelona. Encuentra toda la información práctica para el día a día: desde trámites y servicios públicos hasta la agenda de cultura y ocio.",
          "ogType": "Web",
          "ogUrl": "https://www.barcelona.cat/es/home",
          "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": 42,
        "urgency": "medium",
        "checks": {
          "testedMobile": true,
          "testedTablet": true,
          "horizontalOverflowOnMobile": false,
          "horizontalOverflowOnTablet": false,
          "mobileSmallTapTargets": 65,
          "tabletSmallTapTargets": 58,
          "fixedWidthOffenders": 6,
          "oversizedMedia": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 3,
            "smallTapTargets": 65,
            "oversizedMedia": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 3,
            "smallTapTargets": 58,
            "oversizedMedia": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 65 small targets on mobile and 58 on tablet."
          },
          {
            "title": "Refactor fixed-width components",
            "urgency": "medium",
            "detail": "6 element(s) exceeded viewport width in tested layouts; use responsive component constraints."
          }
        ]
      },
      "securityLight": {
        "score": 59,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": true,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": true,
          "externalScriptCount": 10,
          "externalScriptsWithoutIntegrity": 10,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "cache-control": "max-age=300, public",
            "content-encoding": "gzip",
            "content-language": "es",
            "content-length": "17949",
            "content-type": "text/html; charset=UTF-8",
            "date": "Mon, 13 Apr 2026 22:40:00 GMT",
            "etag": "\"1776120000-gzip\"",
            "expires": "Sun, 19 Nov 1978 05:00:00 GMT",
            "last-modified": "Mon, 13 Apr 2026 22:40:00 GMT",
            "server": "nginx",
            "vary": "Cookie,Accept-Encoding",
            "via": "1.1 ca2190123e61f1744d1210c24c87c840.cloudfront.net (CloudFront)",
            "x-amz-cf-id": "7-uTpZoujHLdf2YECzw_sO6ZCWJXAbTMuRNBiTtwNzlvLD5CsU3WGg==",
            "x-amz-cf-pop": "IAD12-P5",
            "x-cache": "Miss from cloudfront",
            "x-content-type-options": "nosniff",
            "x-frame-options": "SAMEORIGIN",
            "x-generator": "Drupal 10 (https://www.drupal.org)"
          },
          "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": "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": "10 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 25,
        "urgency": "low",
        "origin": "https://www.barcelona.cat",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://www.barcelona.cat/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/sitemap.xml",
            "found": true,
            "status": 200,
            "contentType": "application/xml; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/manifest.webmanifest",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/favicon.ico",
            "found": true,
            "status": 200,
            "contentType": "image/x-icon"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "low",
            "detail": "Missing beneficial file(s): /.well-known/security.txt, /manifest.webmanifest."
          }
        ]
      },
      "mediaHints": {
        "score": 20,
        "urgency": "low",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 52,
          "imagesWithLazy": 28,
          "imagesWithoutLazy": 24
        },
        "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."
          }
        ]
      },
      "wsgCustom": {
        "score": 85,
        "urgency": "medium",
        "data": {
          "hasPrintStyles": true,
          "hasReducedMotion": true,
          "media": {
            "totalImages": 56,
            "lazyImages": 29,
            "totalIframes": 5,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "\"Source Sans Pro\", \"Helvetica Neue\", Helvetica, Arial, sans-serif",
            "usesSystemFont": true
          },
          "tracking": {
            "count": 0,
            "scripts": []
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 29/56 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": "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"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 57,
        "urgency": "medium",
        "totalEstimatedSavingsBytes": 5315304.050000001,
        "checks": {
          "hasEffectiveTextCompression": false
        },
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Use modern image compression formats",
            "urgency": "high",
            "estimatedSavingsBytes": 3223822.0500000003,
            "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": 1995598,
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings."
          },
          {
            "id": "unminified-javascript",
            "title": "Minify JavaScript before transfer",
            "urgency": "high",
            "estimatedSavingsBytes": 87243,
            "detail": "Minify JS bundles so transport compression produces better results with fewer bytes."
          },
          {
            "id": "uses-text-compression",
            "title": "Enable Brotli/gzip for text assets",
            "urgency": "low",
            "estimatedSavingsBytes": 4975,
            "detail": "Compress HTML, CSS, JS, JSON, SVG, and XML responses with Brotli or gzip."
          },
          {
            "id": "unminified-css",
            "title": "Minify CSS before transfer",
            "urgency": "low",
            "estimatedSavingsBytes": 3666,
            "detail": "Minification amplifies compression efficiency and reduces payload 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: 3.07 MB."
          },
          {
            "title": "Improve image encoding quality/size",
            "urgency": "high",
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 1.90 MB."
          },
          {
            "title": "Minify JavaScript before transfer",
            "urgency": "high",
            "detail": "Minify JS bundles so transport compression produces better results with fewer bytes. Estimated savings: 85.20 KB."
          },
          {
            "title": "Enable Brotli/gzip for text assets",
            "urgency": "low",
            "detail": "Compress HTML, CSS, JS, JSON, SVG, and XML responses with Brotli or gzip. Estimated savings: 4.86 KB."
          },
          {
            "title": "Minify CSS before transfer",
            "urgency": "low",
            "detail": "Minification amplifies compression efficiency and reduces payload size. Estimated savings: 3.58 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": 7829936.050000001,
        "totalEstimatedBlockingMs": 1903,
        "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": 3223822.0500000003,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 3,148 KiB",
            "urgency": "high",
            "sourceAuditId": "modern-image-formats"
          },
          {
            "id": "uses-optimized-images",
            "title": "Compress oversized image assets",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss.",
            "estimatedSavingsBytes": 1995598,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 1,949 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": 1834354,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 1,791 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": 327623,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 320 KiB",
            "urgency": "high",
            "sourceAuditId": "unused-css-rules"
          },
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 270601,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 264 KiB",
            "urgency": "high",
            "sourceAuditId": "offscreen-images"
          },
          {
            "id": "unminified-javascript",
            "title": "Minify JavaScript",
            "detail": "Use minified production JS output to reduce payload size.",
            "estimatedSavingsBytes": 87243,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 85 KiB",
            "urgency": "high",
            "sourceAuditId": "unminified-javascript"
          },
          {
            "id": "render-blocking-resources",
            "title": "Eliminate render-blocking resources",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering.",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1903,
            "displayValue": "Est savings of 1,900 ms",
            "urgency": "high",
            "sourceAuditId": "render-blocking-resources"
          },
          {
            "id": "uses-responsive-images",
            "title": "Right-size images for viewport",
            "detail": "Avoid sending larger images than the rendered size needs.",
            "estimatedSavingsBytes": 82054,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 80 KiB",
            "urgency": "medium",
            "sourceAuditId": "uses-responsive-images"
          },
          {
            "id": "uses-text-compression",
            "title": "Enable text compression",
            "detail": "Serve text assets with Brotli or gzip to remove avoidable transfer bloat.",
            "estimatedSavingsBytes": 4975,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 5 KiB",
            "urgency": "low",
            "sourceAuditId": "uses-text-compression"
          },
          {
            "id": "unminified-css",
            "title": "Minify CSS",
            "detail": "Use minified production CSS output to reduce bytes in transit.",
            "estimatedSavingsBytes": 3666,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 4 KiB",
            "urgency": "low",
            "sourceAuditId": "unminified-css"
          }
        ],
        "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: 3.07 MB."
          },
          {
            "title": "Compress oversized image assets",
            "urgency": "high",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 1.90 MB."
          },
          {
            "title": "Remove unused JavaScript",
            "urgency": "high",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 1.75 MB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "high",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 319.94 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.26 KB."
          },
          {
            "title": "Minify JavaScript",
            "urgency": "high",
            "detail": "Use minified production JS output to reduce payload size. Estimated byte savings: 85.20 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": 10,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 10,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "10 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": 3092854.7214851025
        },
        "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.95 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.95 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": 15,
        "urgency": "high",
        "transferBytes": 9276348,
        "css": {
          "unusedBytes": 327623,
          "ratio": 0.03531810147700366,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 1834354,
          "duplicatedBytes": 0,
          "ratio": 0.19774527648164988,
          "auditIds": [
            "unused-javascript",
            "duplicated-javascript"
          ]
        },
        "html": {
          "estimatedPenalty": 0.25,
          "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": "high",
            "estimatedSavingsBytes": 327623,
            "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": 1834354,
            "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": 23,
        "urgency": "high",
        "transferBytes": 9276348,
        "estimatedDeferrableBytes": 2432578,
        "renderBlockingMs": 1903,
        "breakdown": {
          "offscreenImageSavings": 270601,
          "unusedJavascriptSavings": 1834354,
          "unusedCssSavings": 327623
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "high",
            "estimatedSavingsBytes": 270601,
            "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": 1834354,
            "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": "high",
            "estimatedSavingsBytes": 327623,
            "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": "Eliminate render-blocking resources",
            "area": "render-path",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1903,
            "strategy": "Defer scripts/styles not required for first paint and preload only truly critical assets.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-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 www.barcelona.cat",
            "area": "image",
            "urgency": "high",
            "estimatedSavingsBytes": 1071465,
            "url": "https://www.barcelona.cat/sites/default/files/platja_1920x540_0.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 mobile.com-shi-va.barcelona.cat",
            "area": "script",
            "urgency": "high",
            "estimatedSavingsBytes": 715593,
            "url": "https://mobile.com-shi-va.barcelona.cat/assets/index-CiPq0rWH.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 com-shi-va.barcelona.cat",
            "area": "script",
            "urgency": "high",
            "estimatedSavingsBytes": 546223,
            "url": "https://com-shi-va.barcelona.cat/assets/index-97beb0ec.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": 90,
        "urgency": "high",
        "providerCount": 14,
        "requestCount": 41,
        "transferBytes": 2091846,
        "notGreenCount": 9,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "mobile.com-shi-va.barcelona.cat",
            "resourceType": "script",
            "requestCount": 4,
            "transferBytes": 726904,
            "sampleUrl": "https://mobile.com-shi-va.barcelona.cat/assets/index-CiPq0rWH.js",
            "greenCheck": {
              "hostname": "mobile.com-shi-va.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:58.833590",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/mobile.com-shi-va.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "com-shi-va.barcelona.cat",
            "resourceType": "script",
            "requestCount": 4,
            "transferBytes": 551248,
            "sampleUrl": "https://com-shi-va.barcelona.cat/assets/index-97beb0ec.js",
            "greenCheck": {
              "hostname": "com-shi-va.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:58.890330",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/com-shi-va.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "maps.googleapis.com",
            "resourceType": "script",
            "requestCount": 5,
            "transferBytes": 295258,
            "sampleUrl": "https://maps.googleapis.com/maps/api/js?key=AIzaSyA1hYiZ1NN9YNkxQPWfVHYhI7hmS1JLlLI&libraries=places%2Cgeometry&language=es&v=3.47&callback=vueGoogleMapsInit",
            "greenCheck": {
              "hostname": "maps.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:28",
              "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/maps.googleapis.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 10,
            "transferBytes": 153510,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 146718,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "releases.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 126611,
            "sampleUrl": "https://releases.jquery.com/git/ui/jquery-ui-git.js",
            "greenCheck": {
              "hostname": "releases.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:38:00.162467",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/releases.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "cdnjs.cloudflare.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15868,
            "sampleUrl": "https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js",
            "greenCheck": {
              "hostname": "cdnjs.cloudflare.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:34",
              "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/cdnjs.cloudflare.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15566,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "www.youtube.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 11090,
            "sampleUrl": "https://www.youtube.com/iframe_api",
            "greenCheck": {
              "hostname": "www.youtube.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2026-01-10T15:09:17",
              "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.youtube.com",
              "error": null
            }
          },
          {
            "hostname": "geoportal.barcelona.cat",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 8237,
            "sampleUrl": "https://geoportal.barcelona.cat/PlanolBCN/webconfig.js.ashx?lang=ES",
            "greenCheck": {
              "hostname": "geoportal.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.864845",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/geoportal.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5423,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 5,
            "transferBytes": 2860,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 3,
            "transferBytes": 807,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=V5t4d2&url=https%3A%2F%2Fwww.barcelona.cat%2Fes",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "high",
            "detail": "Track 14 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."
          },
          {
            "title": "Prioritize greener alternatives for third-party providers",
            "urgency": "high",
            "detail": "9 third-party script origin(s) are not confirmed green in the Green Web Foundation dataset."
          }
        ]
      },
      "redundancy": {
        "score": 48,
        "urgency": "high",
        "transferBytes": 9276348,
        "estimatedRedundantBytes": 2161977,
        "redundancyRatio": 0.23306337795865356,
        "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": 1834354,
            "displayValue": "Est savings of 1,791 KiB"
          },
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 327623,
            "displayValue": "Est savings of 320 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused javascript",
            "urgency": "high",
            "estimatedSavingsBytes": 1834354,
            "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": "high",
            "estimatedSavingsBytes": 327623,
            "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": "Enable and verify text compression",
            "urgency": "medium",
            "estimatedSavingsBytes": 4975,
            "auditId": "uses-text-compression",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "2",
              "title": "Remove unnecessary or redundant information",
              "url": "https://www.w3.org/TR/web-sustainability-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": 45,
        "urgency": "high",
        "totalTransferBytes": 9276348,
        "heavyRequestCount": 25,
        "heavyBytes": 7076669,
        "heavyRatio": 0.7628723070760174,
        "heavyRequests": [
          {
            "url": "https://www.barcelona.cat/sites/default/files/platja_1920x540_0.jpg",
            "transferSize": 1071465,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://api.com-shi-va.barcelona.cat/other_bus/lines/?RECORRIDO=0&access_token=1UWeUzjkmvYh93M14bl7JvnNwVkJSK",
            "transferSize": 730177,
            "resourceType": "xhr",
            "mimeType": "application/json",
            "domain": "api.com-shi-va.barcelona.cat"
          },
          {
            "url": "https://mobile.com-shi-va.barcelona.cat/assets/index-CiPq0rWH.js",
            "transferSize": 715593,
            "resourceType": "script",
            "mimeType": "text/javascript",
            "domain": "mobile.com-shi-va.barcelona.cat"
          },
          {
            "url": "https://com-shi-va.barcelona.cat/assets/index-97beb0ec.js",
            "transferSize": 546223,
            "resourceType": "script",
            "mimeType": "text/javascript",
            "domain": "com-shi-va.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/gentgranmontserratolivella_1900x547_1.jpg",
            "transferSize": 499011,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/vistes_aeries_bcn_5_1900x547_0.jpg",
            "transferSize": 427874,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://api.com-shi-va.barcelona.cat/bus/lines/?RECORRIDO=0&access_token=1UWeUzjkmvYh93M14bl7JvnNwVkJSK",
            "transferSize": 278524,
            "resourceType": "xhr",
            "mimeType": "application/json",
            "domain": "api.com-shi-va.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/una-nena-en-banyador-es-refresca-a-la%20%281%29_0.jpg",
            "transferSize": 256049,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/estatics/geobcn/1.2/api-full-ca.js",
            "transferSize": 247002,
            "resourceType": "script",
            "mimeType": "text/javascript",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/estatics/geobcn/1.2/js/lib/openlayers/ol-6.15.1.js",
            "transferSize": 243714,
            "resourceType": "script",
            "mimeType": "text/javascript",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/cap_mobile/public/vistes_aeries_bcn_5_1900x547_0.jpg?itok=o9aEFCDQ",
            "transferSize": 227510,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://mobile.com-shi-va.barcelona.cat/assets/index-DFDXDFpa.css",
            "transferSize": 220896,
            "resourceType": "stylesheet",
            "mimeType": "text/css",
            "domain": "mobile.com-shi-va.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/cap_mobile/public/platja_1024x400_0.jpg?itok=RNgDzaxH",
            "transferSize": 209916,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/cap_mobile/public/una-nena-en-banyador-es-refresca-a-la%20%281%29_0.jpg?itok=SyZMzGqI",
            "transferSize": 202155,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://maps.googleapis.com/maps/api/js?key=AIzaSyA1hYiZ1NN9YNkxQPWfVHYhI7hmS1JLlLI&libraries=places%2Cgeometry&language=es&v=3.47&callback=vueGoogleMapsInit",
            "transferSize": 186027,
            "resourceType": "script",
            "mimeType": "text/javascript",
            "domain": "maps.googleapis.com"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/cap_mobile/public/gentgranmontserratolivella_1900x547_1.jpg?itok=_puRLv0g",
            "transferSize": 175519,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/Banner_Municipals_252x252_CAST%20%281%29.png",
            "transferSize": 156769,
            "resourceType": "image",
            "mimeType": "image/png",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://releases.jquery.com/git/ui/jquery-ui-git.js",
            "transferSize": 126611,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "releases.jquery.com"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/ICUB_WebBarcelona_252x252px_0.png",
            "transferSize": 110502,
            "resourceType": "image",
            "mimeType": "image/png",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/estatics-planol/v1.2/library/jquery-ui-1.10.4.js",
            "transferSize": 109109,
            "resourceType": "script",
            "mimeType": "text/javascript",
            "domain": "www.barcelona.cat"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "image",
            "count": 10,
            "transferBytes": 3336770
          },
          {
            "resourceType": "script",
            "count": 8,
            "transferBytes": 2250704
          },
          {
            "resourceType": "xhr",
            "count": 2,
            "transferBytes": 1008701
          },
          {
            "resourceType": "stylesheet",
            "count": 3,
            "transferBytes": 335013
          },
          {
            "resourceType": "font",
            "count": 2,
            "transferBytes": 145481
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.barcelona.cat",
            "count": 16,
            "transferBytes": 4134021
          },
          {
            "domain": "api.com-shi-va.barcelona.cat",
            "count": 2,
            "transferBytes": 1008701
          },
          {
            "domain": "mobile.com-shi-va.barcelona.cat",
            "count": 2,
            "transferBytes": 936489
          },
          {
            "domain": "com-shi-va.barcelona.cat",
            "count": 2,
            "transferBytes": 608395
          },
          {
            "domain": "maps.googleapis.com",
            "count": 1,
            "transferBytes": 186027
          },
          {
            "domain": "releases.jquery.com",
            "count": 1,
            "transferBytes": 126611
          },
          {
            "domain": "cdn.matomo.cloud",
            "count": 1,
            "transferBytes": 76425
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Lazy-load offscreen images and media galleries",
            "urgency": "high",
            "estimatedSavingsBytes": 270601,
            "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": 1834354,
            "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": "Defer non-critical UI modules until after first render",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "strategy": "Keep only above-the-fold resources in the initial path; hydrate or import secondary modules later.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 www.barcelona.cat",
            "urgency": "high",
            "estimatedSavingsBytes": 1071465,
            "strategy": "Serve a smaller placeholder first and load this asset only when the user scrolls to or requests the component.",
            "url": "https://www.barcelona.cat/sites/default/files/platja_1920x540_0.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 api.com-shi-va.barcelona.cat",
            "urgency": "high",
            "estimatedSavingsBytes": 730177,
            "strategy": "Move this asset behind an explicit interaction, route boundary, or lazy-loading trigger.",
            "url": "https://api.com-shi-va.barcelona.cat/other_bus/lines/?RECORRIDO=0&access_token=1UWeUzjkmvYh93M14bl7JvnNwVkJSK",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 mobile.com-shi-va.barcelona.cat",
            "urgency": "high",
            "estimatedSavingsBytes": 715593,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://mobile.com-shi-va.barcelona.cat/assets/index-CiPq0rWH.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": "19.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: 19.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": "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": 0.19,
          "displayValue": "8.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 Speed Index\n\n- Lighthouse audit: speed-index\n- Current value: 8.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\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": 0,
          "displayValue": "Est savings of 1,791 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 1,791 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,
          "displayValue": "Est savings of 320 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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 320 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,
          "displayValue": "Est savings of 3,148 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 3,148 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 1,949 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 1,949 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,
          "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": "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": 0,
          "displayValue": "Est savings of 1,900 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 Eliminate render-blocking resources\n\n- Lighthouse audit: render-blocking-resources\n- Current value: Est savings of 1,900 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\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": "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,
          "displayValue": "1,616 elements",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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: 1,616 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"
        },
        {
          "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": 0.5,
          "displayValue": "Est savings of 5 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 Enable text compression\n\n- Lighthouse audit: uses-text-compression\n- Current value: Est savings of 5 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\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": "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 9,059 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 9,059 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://barcelona.cat/ca/canelons",
      "status": "ok",
      "finalUrl": "https://www.barcelona.cat/ca/canelons",
      "performanceScore": 0.45,
      "bestPracticesScore": 1,
      "transferBytes": 1025838,
      "co2Grams": 0.39297945721320005,
      "greenWeb": {
        "page": {
          "hostname": "www.barcelona.cat",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-13T22:38:00.231825",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.barcelona.cat",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76424,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "stylesheet",
            "requestCount": 1,
            "transferBytes": 24654,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15572,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7145,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 4112,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/css/bcn-avisos.css",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "fonts.googleapis.com",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 2459,
            "sampleUrl": "https://fonts.googleapis.com/css?family=Source+Sans+3:200,200i,300,300i,400,400i,500,500i,600,600i,700,700i,900,900i",
            "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
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=KUM3rY&url=https%3A%2F%2Fwww.barcelona.cat%2Fca%2Fcanelons",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 10,
          "greenCount": 4,
          "notGreenCount": 7,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 60,
        "urgency": "high",
        "pageElementOccurrences": 1,
        "uniqueElementsAssessed": 1,
        "reusedFromCacheCount": 1,
        "components": [
          {
            "signature": "form|get|/ca|input|text|query|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "text",
            "fieldName": "query",
            "formContext": "form|get|/ca",
            "hasLabel": true,
            "hasValidationRule": false,
            "hasErrorMessagingHook": false,
            "toolingFriendly": false,
            "assessment": {
              "score": 60,
              "urgency": "high",
              "issues": [
                "No explicit validation rule",
                "No error messaging hook",
                "Missing autocomplete for tooling support"
              ],
              "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.",
                "Provide meaningful autocomplete values to support browsers and assistive tooling."
              ]
            },
            "reusedFromCache": true
          }
        ],
        "recommendations": [
          {
            "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."
          },
          {
            "title": "Missing autocomplete for tooling support",
            "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": "Canelons de Nadal | La meva Barcelona",
          "lang": "ca",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "Aprèn a preparar els canelons. Un plat d'origen italià que s'ha convertit en un dels menjars típics de les festes de Nadal i, sobretot, de Sant Esteve.",
          "robots": "",
          "canonical": "https://www.barcelona.cat/ca/canelons",
          "ogTitle": "Canelons",
          "ogDescription": "És estrany que durant les #festesdeNadal no mengis uns bons #canelons, ja sigui el dia de #Nadal o per Sant Esteve. Vols saber com es cuinen? Coneix la #recepta d'aquest plat amb tradició a Catalunya.",
          "ogType": "Web",
          "ogUrl": "https://www.barcelona.cat/ca/canelons",
          "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": 33,
          "tabletSmallTapTargets": 31,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 33,
            "oversizedMedia": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 31,
            "oversizedMedia": 0
          }
        ],
        "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 31 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 59,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": true,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": true,
          "externalScriptCount": 7,
          "externalScriptsWithoutIntegrity": 7,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "cache-control": "max-age=300, public",
            "content-encoding": "gzip",
            "content-language": "ca",
            "content-length": "10996",
            "content-type": "text/html; charset=UTF-8",
            "date": "Mon, 13 Apr 2026 22:40:33 GMT",
            "etag": "\"1776120032-gzip\"",
            "expires": "Sun, 19 Nov 1978 05:00:00 GMT",
            "last-modified": "Mon, 13 Apr 2026 22:40:32 GMT",
            "server": "nginx",
            "vary": "Cookie,Accept-Encoding",
            "via": "1.1 ca2190123e61f1744d1210c24c87c840.cloudfront.net (CloudFront)",
            "x-amz-cf-id": "KFDS5i7kbaQyZL72Dn5Yf1fXU7JGG0NS1UW6Kt8cLj7M_m6bZ5x-8w==",
            "x-amz-cf-pop": "IAD12-P5",
            "x-cache": "Miss from cloudfront",
            "x-content-type-options": "nosniff",
            "x-frame-options": "SAMEORIGIN",
            "x-generator": "Drupal 10 (https://www.drupal.org)"
          },
          "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": "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": "7 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 25,
        "urgency": "low",
        "origin": "https://www.barcelona.cat",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://www.barcelona.cat/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/sitemap.xml",
            "found": true,
            "status": 200,
            "contentType": "application/xml; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/manifest.webmanifest",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/favicon.ico",
            "found": true,
            "status": 200,
            "contentType": "image/x-icon"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "low",
            "detail": "Missing beneficial file(s): /.well-known/security.txt, /manifest.webmanifest."
          }
        ]
      },
      "mediaHints": {
        "score": 45,
        "urgency": "medium",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 12,
          "imagesWithLazy": 1,
          "imagesWithoutLazy": 11
        },
        "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": "11 of 12 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 85,
        "urgency": "medium",
        "data": {
          "hasPrintStyles": true,
          "hasReducedMotion": true,
          "media": {
            "totalImages": 17,
            "lazyImages": 2,
            "totalIframes": 1,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "\"Source Sans Pro\", \"Helvetica Neue\", Helvetica, Arial, sans-serif",
            "usesSystemFont": true
          },
          "tracking": {
            "count": 0,
            "scripts": []
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 2/17 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": "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"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 54,
        "urgency": "medium",
        "totalEstimatedSavingsBytes": 549450.95,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Use modern image compression formats",
            "urgency": "high",
            "estimatedSavingsBytes": 296257.95,
            "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": 253193,
            "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: 289.31 KB."
          },
          {
            "title": "Improve image encoding quality/size",
            "urgency": "high",
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 247.26 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": 775501.95,
        "totalEstimatedBlockingMs": 878,
        "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": 296257.95,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 289 KiB",
            "urgency": "high",
            "sourceAuditId": "modern-image-formats"
          },
          {
            "id": "uses-optimized-images",
            "title": "Compress oversized image assets",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss.",
            "estimatedSavingsBytes": 253193,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 247 KiB",
            "urgency": "high",
            "sourceAuditId": "uses-optimized-images"
          },
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 83661,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 82 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": 81612,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 80 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-css-rules"
          },
          {
            "id": "render-blocking-resources",
            "title": "Eliminate render-blocking resources",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering.",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 878,
            "displayValue": "Est savings of 880 ms",
            "urgency": "medium",
            "sourceAuditId": "render-blocking-resources"
          },
          {
            "id": "unused-javascript",
            "title": "Remove unused JavaScript",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code.",
            "estimatedSavingsBytes": 32481,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 32 KiB",
            "urgency": "low",
            "sourceAuditId": "unused-javascript"
          },
          {
            "id": "uses-responsive-images",
            "title": "Right-size images for viewport",
            "detail": "Avoid sending larger images than the rendered size needs.",
            "estimatedSavingsBytes": 28297,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 28 KiB",
            "urgency": "low",
            "sourceAuditId": "uses-responsive-images"
          }
        ],
        "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: 289.31 KB."
          },
          {
            "title": "Compress oversized image assets",
            "urgency": "high",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 247.26 KB."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "medium",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 81.70 KB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "medium",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 79.70 KB."
          },
          {
            "title": "Eliminate render-blocking resources",
            "urgency": "medium",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering. Estimated render unblocking: 878 ms."
          },
          {
            "title": "Remove unused JavaScript",
            "urgency": "low",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 31.72 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": 10,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 7,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "7 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": 168000.4337639665
        },
        "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: 164.06 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: 164.06 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": "medium",
        "transferBytes": 1025838,
        "css": {
          "unusedBytes": 81612,
          "ratio": 0.0795564211893106,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 32481,
          "duplicatedBytes": 0,
          "ratio": 0.03166289414118019,
          "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": "high",
            "estimatedSavingsBytes": 81612,
            "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": "medium",
            "estimatedSavingsBytes": 32481,
            "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": 14,
        "urgency": "medium",
        "transferBytes": 1025838,
        "estimatedDeferrableBytes": 197754,
        "renderBlockingMs": 878,
        "breakdown": {
          "offscreenImageSavings": 83661,
          "unusedJavascriptSavings": 32481,
          "unusedCssSavings": 81612
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 83661,
            "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": "medium",
            "estimatedSavingsBytes": 32481,
            "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": 81612,
            "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": "Eliminate render-blocking resources",
            "area": "render-path",
            "urgency": "medium",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 878,
            "strategy": "Defer scripts/styles not required for first paint and preload only truly critical assets.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-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 www.barcelona.cat",
            "area": "image",
            "urgency": "high",
            "estimatedSavingsBytes": 250878,
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_medium/public/101216_canelons_710x379.jpg?itok=haBG-9BO",
            "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 www.barcelona.cat",
            "area": "font",
            "urgency": "medium",
            "estimatedSavingsBytes": 90560,
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "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 cdn.matomo.cloud",
            "area": "script",
            "urgency": "medium",
            "estimatedSavingsBytes": 76424,
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.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": 64,
        "urgency": "high",
        "providerCount": 7,
        "requestCount": 8,
        "transferBytes": 139463,
        "notGreenCount": 5,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76424,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15572,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7145,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=KUM3rY&url=https%3A%2F%2Fwww.barcelona.cat%2Fca%2Fcanelons",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "high",
            "detail": "Track 7 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."
          },
          {
            "title": "Prioritize greener alternatives for third-party providers",
            "urgency": "high",
            "detail": "5 third-party script origin(s) are not confirmed green in the Green Web Foundation dataset."
          }
        ]
      },
      "redundancy": {
        "score": 16,
        "urgency": "low",
        "transferBytes": 1025838,
        "estimatedRedundantBytes": 114093,
        "redundancyRatio": 0.11121931533049077,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 81612,
            "displayValue": "Est savings of 80 KiB"
          },
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 32481,
            "displayValue": "Est savings of 32 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 81612,
            "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 unused javascript",
            "urgency": "medium",
            "estimatedSavingsBytes": 32481,
            "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 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": 28,
        "urgency": "medium",
        "totalTransferBytes": 1025838,
        "heavyRequestCount": 5,
        "heavyBytes": 521880,
        "heavyRatio": 0.508735297386137,
        "heavyRequests": [
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_medium/public/101216_canelons_710x379.jpg?itok=haBG-9BO",
            "transferSize": 250878,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "transferSize": 90560,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "transferSize": 76424,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "cdn.matomo.cloud"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament/fonts/icoajuntament.ttf?8aaig7",
            "transferSize": 54921,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/css/css_evpTRQTawGYS1Ro7RbXq3hBxwat7AU-RJm1V8ZgzeaE.css?delta=5&language=ca&theme=barcelonacat_theme&include=eJyFzsGKwzAMBNAfiuvDfpAZOyJxcSQjydn272sodFnIsieJmXcY3Ac7DmJPOKuJxfcJ6HXJ0EJNGAWe5CTVupLFqUdwkTb7v0zHRuGs9P0b-E4HxSzi5oqeyspXYGuS0YL5s1XerkQtEvDZfiVMxsySgS19_Qe6ypILp8kU8fMlejgpoy0dim0u3i2uOjra7Se5De4jt2o7rYs9zemIGUYvwgyJSg&tcut5n",
            "transferSize": 49097,
            "resourceType": "stylesheet",
            "mimeType": "text/css",
            "domain": "www.barcelona.cat"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "image",
            "count": 1,
            "transferBytes": 250878
          },
          {
            "resourceType": "font",
            "count": 2,
            "transferBytes": 145481
          },
          {
            "resourceType": "script",
            "count": 1,
            "transferBytes": 76424
          },
          {
            "resourceType": "stylesheet",
            "count": 1,
            "transferBytes": 49097
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.barcelona.cat",
            "count": 4,
            "transferBytes": 445456
          },
          {
            "domain": "cdn.matomo.cloud",
            "count": 1,
            "transferBytes": 76424
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Lazy-load offscreen images and media galleries",
            "urgency": "medium",
            "estimatedSavingsBytes": 83661,
            "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": "Defer non-critical UI modules until after first render",
            "urgency": "medium",
            "estimatedSavingsBytes": 0,
            "strategy": "Keep only above-the-fold resources in the initial path; hydrate or import secondary modules later.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 www.barcelona.cat",
            "urgency": "medium",
            "estimatedSavingsBytes": 250878,
            "strategy": "Serve a smaller placeholder first and load this asset only when the user scrolls to or requests the component.",
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_medium/public/101216_canelons_710x379.jpg?itok=haBG-9BO",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 www.barcelona.cat",
            "urgency": "medium",
            "estimatedSavingsBytes": 90560,
            "strategy": "Subset or defer this font so full font payloads are only fetched when needed.",
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 cdn.matomo.cloud",
            "urgency": "medium",
            "estimatedSavingsBytes": 76424,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.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.04,
          "displayValue": "7.6 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.6 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 32 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 32 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,
          "displayValue": "Est savings of 80 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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 80 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,
          "displayValue": "Est savings of 289 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 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": "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 247 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 247 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,
          "displayValue": "Est savings of 82 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 82 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": "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": 0,
          "displayValue": "Est savings of 880 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 Eliminate render-blocking resources\n\n- Lighthouse audit: render-blocking-resources\n- Current value: Est savings of 880 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\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": "server-response-time",
          "title": "Reduce initial server response time",
          "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": 0,
          "displayValue": "Root document took 620 ms",
          "impact": "high",
          "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 Reduce initial server response time\n\n- Lighthouse audit: server-response-time\n- Current value: Root document took 620 ms\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": "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": 0.8,
          "displayValue": "4.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 Speed Index\n\n- Lighthouse audit: speed-index\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\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": "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": "992 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: 992 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://barcelona.cat/ca/coneixbcn",
      "status": "ok",
      "finalUrl": "https://www.barcelona.cat/ca/coneixbcn",
      "performanceScore": 0.66,
      "bestPracticesScore": 1,
      "transferBytes": 1960330,
      "co2Grams": 0.7509659608620002,
      "greenWeb": {
        "page": {
          "hostname": "www.barcelona.cat",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-13T22:38:00.231825",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.barcelona.cat",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76425,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "stylesheet",
            "requestCount": 1,
            "transferBytes": 24654,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15565,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7145,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 4112,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/css/bcn-avisos.css",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "fonts.googleapis.com",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 2461,
            "sampleUrl": "https://fonts.googleapis.com/css?family=Source+Sans+3:200,200i,300,300i,400,400i,500,500i,600,600i,700,700i,900,900i",
            "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
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=sGJbeq&url=https%3A%2F%2Fwww.barcelona.cat%2Fca%2Fconeixbcn",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 10,
          "greenCount": 4,
          "notGreenCount": 7,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 60,
        "urgency": "high",
        "pageElementOccurrences": 1,
        "uniqueElementsAssessed": 1,
        "reusedFromCacheCount": 1,
        "components": [
          {
            "signature": "form|get|/ca|input|text|query|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "text",
            "fieldName": "query",
            "formContext": "form|get|/ca",
            "hasLabel": true,
            "hasValidationRule": false,
            "hasErrorMessagingHook": false,
            "toolingFriendly": false,
            "assessment": {
              "score": 60,
              "urgency": "high",
              "issues": [
                "No explicit validation rule",
                "No error messaging hook",
                "Missing autocomplete for tooling support"
              ],
              "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.",
                "Provide meaningful autocomplete values to support browsers and assistive tooling."
              ]
            },
            "reusedFromCache": true
          }
        ],
        "recommendations": [
          {
            "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."
          },
          {
            "title": "Missing autocomplete for tooling support",
            "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": "Coneix BCN | Barcelona.cat | Ajuntament de Barcelona",
          "lang": "ca",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "Descobreix la història de Barcelona, els seus punts d'interès, la cultura popular i els racons més emblemàtics de la teva ciutat.",
          "robots": "",
          "canonical": "https://www.barcelona.cat/ca/coneixbcn",
          "ogTitle": "Coneix Barcelona",
          "ogDescription": "Vols conèixer Barcelona? Explora la cultura popular, la memòria i les tradicions de la ciutat.",
          "ogType": "Web",
          "ogUrl": "https://www.barcelona.cat/ca/coneixbcn",
          "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": 38,
          "tabletSmallTapTargets": 33,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 38,
            "oversizedMedia": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 33,
            "oversizedMedia": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 38 small targets on mobile and 33 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 59,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": true,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": true,
          "externalScriptCount": 7,
          "externalScriptsWithoutIntegrity": 7,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "cache-control": "max-age=300, public",
            "content-encoding": "gzip",
            "content-language": "ca",
            "content-length": "12099",
            "content-type": "text/html; charset=UTF-8",
            "date": "Mon, 13 Apr 2026 22:40:45 GMT",
            "etag": "\"1776120045-gzip\"",
            "expires": "Sun, 19 Nov 1978 05:00:00 GMT",
            "last-modified": "Mon, 13 Apr 2026 22:40:45 GMT",
            "server": "nginx",
            "vary": "Cookie,Accept-Encoding",
            "via": "1.1 ca2190123e61f1744d1210c24c87c840.cloudfront.net (CloudFront)",
            "x-amz-cf-id": "Gd6x6EydbBF7w89zkBpP5PWY479xirDBTJ-yCurUNlonx_CpEorHGw==",
            "x-amz-cf-pop": "IAD12-P5",
            "x-cache": "Miss from cloudfront",
            "x-content-type-options": "nosniff",
            "x-frame-options": "SAMEORIGIN",
            "x-generator": "Drupal 10 (https://www.drupal.org)"
          },
          "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": "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": "7 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 25,
        "urgency": "low",
        "origin": "https://www.barcelona.cat",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://www.barcelona.cat/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/sitemap.xml",
            "found": true,
            "status": 200,
            "contentType": "application/xml; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/manifest.webmanifest",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/favicon.ico",
            "found": true,
            "status": 200,
            "contentType": "image/x-icon"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "low",
            "detail": "Missing beneficial file(s): /.well-known/security.txt, /manifest.webmanifest."
          }
        ]
      },
      "mediaHints": {
        "score": 27,
        "urgency": "low",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 37,
          "imagesWithLazy": 14,
          "imagesWithoutLazy": 23
        },
        "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": "23 of 37 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 85,
        "urgency": "medium",
        "data": {
          "hasPrintStyles": true,
          "hasReducedMotion": true,
          "media": {
            "totalImages": 42,
            "lazyImages": 15,
            "totalIframes": 1,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "\"Source Sans Pro\", \"Helvetica Neue\", Helvetica, Arial, sans-serif",
            "usesSystemFont": true
          },
          "tracking": {
            "count": 0,
            "scripts": []
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 15/42 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": "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"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 96,
        "urgency": "high",
        "totalEstimatedSavingsBytes": 1889839.6500000001,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Use modern image compression formats",
            "urgency": "high",
            "estimatedSavingsBytes": 1037339.6500000001,
            "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": 852500,
            "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: 1013.03 KB."
          },
          {
            "title": "Improve image encoding quality/size",
            "urgency": "high",
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 832.52 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": 2111167.6500000004,
        "totalEstimatedBlockingMs": 1664,
        "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": 1037339.6500000001,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 1,013 KiB",
            "urgency": "high",
            "sourceAuditId": "modern-image-formats"
          },
          {
            "id": "uses-optimized-images",
            "title": "Compress oversized image assets",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss.",
            "estimatedSavingsBytes": 852500,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 833 KiB",
            "urgency": "high",
            "sourceAuditId": "uses-optimized-images"
          },
          {
            "id": "render-blocking-resources",
            "title": "Eliminate render-blocking resources",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering.",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1664,
            "displayValue": "Est savings of 1,660 ms",
            "urgency": "high",
            "sourceAuditId": "render-blocking-resources"
          },
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 83661,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 82 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": 83649,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 82 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-css-rules"
          },
          {
            "id": "unused-javascript",
            "title": "Remove unused JavaScript",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code.",
            "estimatedSavingsBytes": 54018,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 53 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-javascript"
          }
        ],
        "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: 1013.03 KB."
          },
          {
            "title": "Compress oversized image assets",
            "urgency": "high",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 832.52 KB."
          },
          {
            "title": "Eliminate render-blocking resources",
            "urgency": "high",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering. Estimated render unblocking: 1664 ms."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "medium",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 81.70 KB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "medium",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 81.69 KB."
          },
          {
            "title": "Remove unused JavaScript",
            "urgency": "medium",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 52.75 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": 10,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 7,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "7 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": 168009.9584846369
        },
        "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: 164.07 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: 164.07 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": 5,
        "urgency": "medium",
        "transferBytes": 1960330,
        "css": {
          "unusedBytes": 83649,
          "ratio": 0.04267087684216433,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 54018,
          "duplicatedBytes": 0,
          "ratio": 0.027555564624323455,
          "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": "high",
            "estimatedSavingsBytes": 83649,
            "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": "medium",
            "estimatedSavingsBytes": 54018,
            "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": 1960330,
        "estimatedDeferrableBytes": 221328,
        "renderBlockingMs": 1664,
        "breakdown": {
          "offscreenImageSavings": 83661,
          "unusedJavascriptSavings": 54018,
          "unusedCssSavings": 83649
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 83661,
            "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": "medium",
            "estimatedSavingsBytes": 54018,
            "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": "high",
            "estimatedSavingsBytes": 83649,
            "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": "Eliminate render-blocking resources",
            "area": "render-path",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1664,
            "strategy": "Defer scripts/styles not required for first paint and preload only truly critical assets.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-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 www.barcelona.cat",
            "area": "image",
            "urgency": "high",
            "estimatedSavingsBytes": 261413,
            "url": "https://www.barcelona.cat/sites/default/files/styles/destacat_gran/public/destacat-cultura%20popular4071.jpg?itok=cA32eUx7",
            "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": 64,
        "urgency": "high",
        "providerCount": 7,
        "requestCount": 8,
        "transferBytes": 139457,
        "notGreenCount": 5,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76425,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15565,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7145,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=sGJbeq&url=https%3A%2F%2Fwww.barcelona.cat%2Fca%2Fconeixbcn",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "high",
            "detail": "Track 7 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."
          },
          {
            "title": "Prioritize greener alternatives for third-party providers",
            "urgency": "high",
            "detail": "5 third-party script origin(s) are not confirmed green in the Green Web Foundation dataset."
          }
        ]
      },
      "redundancy": {
        "score": 14,
        "urgency": "medium",
        "transferBytes": 1960330,
        "estimatedRedundantBytes": 137667,
        "redundancyRatio": 0.07022644146648778,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 83649,
            "displayValue": "Est savings of 82 KiB"
          },
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 54018,
            "displayValue": "Est savings of 53 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 83649,
            "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 unused javascript",
            "urgency": "medium",
            "estimatedSavingsBytes": 54018,
            "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 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": 33,
        "urgency": "high",
        "totalTransferBytes": 1960330,
        "heavyRequestCount": 9,
        "heavyBytes": 1128194,
        "heavyRatio": 0.5755122861967118,
        "heavyRequests": [
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/destacat_gran/public/destacat-cultura%20popular4071.jpg?itok=cA32eUx7",
            "transferSize": 261413,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/destacat_gran/public/dues-nenes-conversen-assegudes-als-bancs_528x228px.jpg?itok=zMbAEvlJ",
            "transferSize": 181475,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/destacat_gran/public/biblioteca2_528x228.jpg?itok=M55yvOgb",
            "transferSize": 156173,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/destacat_gran/public/llibreria_528x228.jpg?itok=ALHo3TA5",
            "transferSize": 142285,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/distribuidora_banner_menu/public/memoria_tradicio.jpg?itok=j2Tlac4l",
            "transferSize": 113004,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "transferSize": 90560,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "transferSize": 76425,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "cdn.matomo.cloud"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament/fonts/icoajuntament.ttf?8aaig7",
            "transferSize": 54921,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/css/css_qDD4BCxE8K-iT7MRORwp32v03DlJblP9-xrYwOBWlQo.css?delta=5&language=ca&theme=barcelonacat_theme&include=eJyFz0FqxTAMBNALxd-LHsiMHTVxcSQjyenP7Wso_FJI6Upi5m0GH4MdB7EnnNXE4vcJ6HXJ0EJNGAWe5CTVupLFqUdwkTb7v0zHRuGs9Pkb-E4HxSzi5oqeysp34B1crizPu25rktGC-dUqb3eiFgl47boTJmNmycCW3v4DXWXJhdNkivj6Ej2dlNGWDsU21-wWVx0d7fGTPAb3kVu1ndbFLnM6YobRF2idlFA&tcut5n",
            "transferSize": 51938,
            "resourceType": "stylesheet",
            "mimeType": "text/css",
            "domain": "www.barcelona.cat"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "image",
            "count": 5,
            "transferBytes": 854350
          },
          {
            "resourceType": "font",
            "count": 2,
            "transferBytes": 145481
          },
          {
            "resourceType": "script",
            "count": 1,
            "transferBytes": 76425
          },
          {
            "resourceType": "stylesheet",
            "count": 1,
            "transferBytes": 51938
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.barcelona.cat",
            "count": 8,
            "transferBytes": 1051769
          },
          {
            "domain": "cdn.matomo.cloud",
            "count": 1,
            "transferBytes": 76425
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Lazy-load offscreen images and media galleries",
            "urgency": "medium",
            "estimatedSavingsBytes": 83661,
            "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": "medium",
            "estimatedSavingsBytes": 54018,
            "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": "Defer non-critical UI modules until after first render",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "strategy": "Keep only above-the-fold resources in the initial path; hydrate or import secondary modules later.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 www.barcelona.cat",
            "urgency": "medium",
            "estimatedSavingsBytes": 261413,
            "strategy": "Serve a smaller placeholder first and load this asset only when the user scrolls to or requests the component.",
            "url": "https://www.barcelona.cat/sites/default/files/styles/destacat_gran/public/destacat-cultura%20popular4071.jpg?itok=cA32eUx7",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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": "10.0 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: 10.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,
          "displayValue": "Est savings of 53 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 53 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,
          "displayValue": "Est savings of 82 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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 82 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,
          "displayValue": "Est savings of 1,013 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,013 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 833 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 833 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,
          "displayValue": "Est savings of 82 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 82 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": "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": 0,
          "displayValue": "Est savings of 1,660 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 Eliminate render-blocking resources\n\n- Lighthouse audit: render-blocking-resources\n- Current value: Est savings of 1,660 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\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": "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": 0.84,
          "displayValue": "3.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 Speed Index\n\n- Lighthouse audit: speed-index\n- Current value: 3.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\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": "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": "1,101 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: 1,101 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://barcelona.cat/ca/diada-nacional-de-catalunya-2022",
      "status": "ok",
      "finalUrl": "https://www.barcelona.cat/ca/diada-nacional-de-catalunya-2022",
      "performanceScore": 0.64,
      "bestPracticesScore": 1,
      "transferBytes": 809952,
      "co2Grams": 0.31027754609280006,
      "greenWeb": {
        "page": {
          "hostname": "www.barcelona.cat",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-13T22:38:00.231825",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.barcelona.cat",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76426,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "stylesheet",
            "requestCount": 1,
            "transferBytes": 24654,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15565,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7146,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 4113,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/css/bcn-avisos.css",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "fonts.googleapis.com",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 2461,
            "sampleUrl": "https://fonts.googleapis.com/css?family=Source+Sans+3:200,200i,300,300i,400,400i,500,500i,600,600i,700,700i,900,900i",
            "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
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=CqeFQ0&url=https%3A%2F%2Fwww.barcelona.cat%2Fca%2Fdiada-nacional-de-catalunya-2022",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 10,
          "greenCount": 4,
          "notGreenCount": 7,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 60,
        "urgency": "high",
        "pageElementOccurrences": 1,
        "uniqueElementsAssessed": 1,
        "reusedFromCacheCount": 1,
        "components": [
          {
            "signature": "form|get|/ca|input|text|query|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "text",
            "fieldName": "query",
            "formContext": "form|get|/ca",
            "hasLabel": true,
            "hasValidationRule": false,
            "hasErrorMessagingHook": false,
            "toolingFriendly": false,
            "assessment": {
              "score": 60,
              "urgency": "high",
              "issues": [
                "No explicit validation rule",
                "No error messaging hook",
                "Missing autocomplete for tooling support"
              ],
              "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.",
                "Provide meaningful autocomplete values to support browsers and assistive tooling."
              ]
            },
            "reusedFromCache": true
          }
        ],
        "recommendations": [
          {
            "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."
          },
          {
            "title": "Missing autocomplete for tooling support",
            "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": "Diada 2022 | Web de Barcelona | Ajuntament de Barcelona",
          "lang": "ca",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "Actes, activitats, portes obertes, manifestacions, afectacions al trànsit i el transport públic i recomanacions de mobilitat a Barcelona durant l'11 de setembre, la Diada Nacional de Catalunya 2022.",
          "robots": "",
          "canonical": "https://www.barcelona.cat/ca/diada-nacional-de-catalunya-2022",
          "ogTitle": "Diada 2022 | Web de Barcelona | Ajuntament de Barcelona",
          "ogDescription": "Actes, activitats, afectacions al trànsit i el transport públic i recomanacions de mobilitat a Barcelona durant la Diada Nacional de Catalunya 2022.",
          "ogType": "Web",
          "ogUrl": "https://www.barcelona.cat/ca/diada-nacional-de-catalunya-2022",
          "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": 33,
          "tabletSmallTapTargets": 31,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 33,
            "oversizedMedia": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 31,
            "oversizedMedia": 0
          }
        ],
        "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 31 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 59,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": true,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": true,
          "externalScriptCount": 7,
          "externalScriptsWithoutIntegrity": 7,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "cache-control": "max-age=300, public",
            "content-encoding": "gzip",
            "content-language": "ca",
            "content-length": "9736",
            "content-type": "text/html; charset=UTF-8",
            "date": "Mon, 13 Apr 2026 22:41:00 GMT",
            "etag": "\"1776120059-gzip\"",
            "expires": "Sun, 19 Nov 1978 05:00:00 GMT",
            "last-modified": "Mon, 13 Apr 2026 22:40:59 GMT",
            "server": "nginx",
            "vary": "Cookie,Accept-Encoding",
            "via": "1.1 ca2190123e61f1744d1210c24c87c840.cloudfront.net (CloudFront)",
            "x-amz-cf-id": "98qGTSvLfskUh9cNxhTBa_Ua69pDnBHNT56XBiRE6JpPx30AAuEx4Q==",
            "x-amz-cf-pop": "IAD12-P5",
            "x-cache": "Miss from cloudfront",
            "x-content-type-options": "nosniff",
            "x-frame-options": "SAMEORIGIN",
            "x-generator": "Drupal 10 (https://www.drupal.org)"
          },
          "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": "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": "7 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 25,
        "urgency": "low",
        "origin": "https://www.barcelona.cat",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://www.barcelona.cat/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/sitemap.xml",
            "found": true,
            "status": 200,
            "contentType": "application/xml; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/manifest.webmanifest",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/favicon.ico",
            "found": true,
            "status": 200,
            "contentType": "image/x-icon"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "low",
            "detail": "Missing beneficial file(s): /.well-known/security.txt, /manifest.webmanifest."
          }
        ]
      },
      "mediaHints": {
        "score": 45,
        "urgency": "medium",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 12,
          "imagesWithLazy": 1,
          "imagesWithoutLazy": 11
        },
        "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": "11 of 12 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 85,
        "urgency": "medium",
        "data": {
          "hasPrintStyles": true,
          "hasReducedMotion": true,
          "media": {
            "totalImages": 17,
            "lazyImages": 2,
            "totalIframes": 1,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "\"Source Sans Pro\", \"Helvetica Neue\", Helvetica, Arial, sans-serif",
            "usesSystemFont": true
          },
          "tracking": {
            "count": 0,
            "scripts": []
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 2/17 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": "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"
          }
        ]
      },
      "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": 157070.75,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Use modern image compression formats",
            "urgency": "medium",
            "estimatedSavingsBytes": 99038.75,
            "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size."
          },
          {
            "id": "uses-optimized-images",
            "title": "Improve image encoding quality/size",
            "urgency": "medium",
            "estimatedSavingsBytes": 58032,
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings."
          }
        ],
        "recommendations": [
          {
            "title": "Use modern image compression formats",
            "urgency": "medium",
            "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size. Estimated savings: 96.72 KB."
          },
          {
            "title": "Improve image encoding quality/size",
            "urgency": "medium",
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 56.67 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": 355080.75,
        "totalEstimatedBlockingMs": 874,
        "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": 99038.75,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 97 KiB",
            "urgency": "medium",
            "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": 83661,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 82 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": 81868,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 80 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-css-rules"
          },
          {
            "id": "uses-optimized-images",
            "title": "Compress oversized image assets",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss.",
            "estimatedSavingsBytes": 58032,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 57 KiB",
            "urgency": "medium",
            "sourceAuditId": "uses-optimized-images"
          },
          {
            "id": "render-blocking-resources",
            "title": "Eliminate render-blocking resources",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering.",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 874,
            "displayValue": "Est savings of 870 ms",
            "urgency": "medium",
            "sourceAuditId": "render-blocking-resources"
          },
          {
            "id": "unused-javascript",
            "title": "Remove unused JavaScript",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code.",
            "estimatedSavingsBytes": 32481,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 32 KiB",
            "urgency": "low",
            "sourceAuditId": "unused-javascript"
          }
        ],
        "recommendations": [
          {
            "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: 96.72 KB."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "medium",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 81.70 KB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "medium",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 79.95 KB."
          },
          {
            "title": "Compress oversized image assets",
            "urgency": "medium",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 56.67 KB."
          },
          {
            "title": "Eliminate render-blocking resources",
            "urgency": "medium",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering. Estimated render unblocking: 874 ms."
          },
          {
            "title": "Remove unused JavaScript",
            "urgency": "low",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 31.72 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": 10,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 7,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "7 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": 167997.9519553073
        },
        "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: 164.06 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: 164.06 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": "medium",
        "transferBytes": 809952,
        "css": {
          "unusedBytes": 81868,
          "ratio": 0.10107759472166251,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 32481,
          "duplicatedBytes": 0,
          "ratio": 0.0401023764371222,
          "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": "high",
            "estimatedSavingsBytes": 81868,
            "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": "medium",
            "estimatedSavingsBytes": 32481,
            "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": 16,
        "urgency": "medium",
        "transferBytes": 809952,
        "estimatedDeferrableBytes": 198010,
        "renderBlockingMs": 874,
        "breakdown": {
          "offscreenImageSavings": 83661,
          "unusedJavascriptSavings": 32481,
          "unusedCssSavings": 81868
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 83661,
            "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": "medium",
            "estimatedSavingsBytes": 32481,
            "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": 81868,
            "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": "Eliminate render-blocking resources",
            "area": "render-path",
            "urgency": "medium",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 874,
            "strategy": "Defer scripts/styles not required for first paint and preload only truly critical assets.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-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 www.barcelona.cat",
            "area": "font",
            "urgency": "medium",
            "estimatedSavingsBytes": 90562,
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "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 www.barcelona.cat",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 84135,
            "url": "https://www.barcelona.cat/themes/barcelonacat_theme/images/menu/viula.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 cdn.matomo.cloud",
            "area": "script",
            "urgency": "medium",
            "estimatedSavingsBytes": 76426,
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.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": 64,
        "urgency": "high",
        "providerCount": 7,
        "requestCount": 8,
        "transferBytes": 139459,
        "notGreenCount": 5,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76426,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15565,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7146,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=CqeFQ0&url=https%3A%2F%2Fwww.barcelona.cat%2Fca%2Fdiada-nacional-de-catalunya-2022",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "high",
            "detail": "Track 7 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."
          },
          {
            "title": "Prioritize greener alternatives for third-party providers",
            "urgency": "high",
            "detail": "5 third-party script origin(s) are not confirmed green in the Green Web Foundation dataset."
          }
        ]
      },
      "redundancy": {
        "score": 18,
        "urgency": "low",
        "transferBytes": 809952,
        "estimatedRedundantBytes": 114349,
        "redundancyRatio": 0.14117997115878472,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 81868,
            "displayValue": "Est savings of 80 KiB"
          },
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 32481,
            "displayValue": "Est savings of 32 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 81868,
            "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 unused javascript",
            "urgency": "medium",
            "estimatedSavingsBytes": 32481,
            "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 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": 20,
        "urgency": "medium",
        "totalTransferBytes": 809952,
        "heavyRequestCount": 4,
        "heavyBytes": 271013,
        "heavyRatio": 0.3346037789893722,
        "heavyRequests": [
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "transferSize": 90562,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "transferSize": 76426,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "cdn.matomo.cloud"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament/fonts/icoajuntament.ttf?8aaig7",
            "transferSize": 54920,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/css/css_evpTRQTawGYS1Ro7RbXq3hBxwat7AU-RJm1V8ZgzeaE.css?delta=5&language=ca&theme=barcelonacat_theme&include=eJyFzkEKwzAMBMAPxfjQB5m1I1IXRzKSkja_r6EQKKT0pGV3DsJjY8dK7Al7NbH4OQG9ThlaqAmjwJPspFpnsjj0Flykjf2X6Vgo7JWe38DvtFLMIm6u6KnMfAWWJhktmB-t8nIlapGA8_crYbKNLhnY0u0f6CpTLpwGU8QzJXo5KaNNdpjTGjOM3gg5eRY&tcut5n",
            "transferSize": 49105,
            "resourceType": "stylesheet",
            "mimeType": "text/css",
            "domain": "www.barcelona.cat"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "font",
            "count": 2,
            "transferBytes": 145482
          },
          {
            "resourceType": "script",
            "count": 1,
            "transferBytes": 76426
          },
          {
            "resourceType": "stylesheet",
            "count": 1,
            "transferBytes": 49105
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.barcelona.cat",
            "count": 3,
            "transferBytes": 194587
          },
          {
            "domain": "cdn.matomo.cloud",
            "count": 1,
            "transferBytes": 76426
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Lazy-load offscreen images and media galleries",
            "urgency": "medium",
            "estimatedSavingsBytes": 83661,
            "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": "Defer non-critical UI modules until after first render",
            "urgency": "medium",
            "estimatedSavingsBytes": 0,
            "strategy": "Keep only above-the-fold resources in the initial path; hydrate or import secondary modules later.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 www.barcelona.cat",
            "urgency": "medium",
            "estimatedSavingsBytes": 90562,
            "strategy": "Subset or defer this font so full font payloads are only fetched when needed.",
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 cdn.matomo.cloud",
            "urgency": "medium",
            "estimatedSavingsBytes": 76426,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.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.03,
          "displayValue": "7.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: 7.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 32 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 32 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,
          "displayValue": "Est savings of 80 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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 80 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,
          "displayValue": "Est savings of 97 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 97 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 57 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 57 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,
          "displayValue": "Est savings of 82 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 82 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": "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": 0,
          "displayValue": "Est savings of 870 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 Eliminate render-blocking resources\n\n- Lighthouse audit: render-blocking-resources\n- Current value: Est savings of 870 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\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": "server-response-time",
          "title": "Reduce initial server response time",
          "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": 0,
          "displayValue": "Root document took 630 ms",
          "impact": "high",
          "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 Reduce initial server response time\n\n- Lighthouse audit: server-response-time\n- Current value: Root document took 630 ms\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": "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": 0.79,
          "displayValue": "4.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 Speed Index\n\n- Lighthouse audit: speed-index\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\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": "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": "936 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: 936 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://barcelona.cat/ca/implicat",
      "status": "ok",
      "finalUrl": "https://www.barcelona.cat/ca/implicat",
      "performanceScore": 0.64,
      "bestPracticesScore": 1,
      "transferBytes": 1766613,
      "co2Grams": 0.6767565812982,
      "greenWeb": {
        "page": {
          "hostname": "www.barcelona.cat",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-13T22:38:00.231825",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.barcelona.cat",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76427,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "stylesheet",
            "requestCount": 1,
            "transferBytes": 24654,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15565,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7146,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5656,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 4113,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/css/bcn-avisos.css",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "fonts.googleapis.com",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 2461,
            "sampleUrl": "https://fonts.googleapis.com/css?family=Source+Sans+3:200,200i,300,300i,400,400i,500,500i,600,600i,700,700i,900,900i",
            "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
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=nWhOz0&url=https%3A%2F%2Fwww.barcelona.cat%2Fca%2Fimplicat",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 10,
          "greenCount": 4,
          "notGreenCount": 7,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 60,
        "urgency": "high",
        "pageElementOccurrences": 1,
        "uniqueElementsAssessed": 1,
        "reusedFromCacheCount": 1,
        "components": [
          {
            "signature": "form|get|/ca|input|text|query|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "text",
            "fieldName": "query",
            "formContext": "form|get|/ca",
            "hasLabel": true,
            "hasValidationRule": false,
            "hasErrorMessagingHook": false,
            "toolingFriendly": false,
            "assessment": {
              "score": 60,
              "urgency": "high",
              "issues": [
                "No explicit validation rule",
                "No error messaging hook",
                "Missing autocomplete for tooling support"
              ],
              "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.",
                "Provide meaningful autocomplete values to support browsers and assistive tooling."
              ]
            },
            "reusedFromCache": true
          }
        ],
        "recommendations": [
          {
            "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."
          },
          {
            "title": "Missing autocomplete for tooling support",
            "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": "Implica't | Barcelona.cat | Ajuntament de Barcelona",
          "lang": "ca",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "Coneix els projectes d'innovació i participació que transformen Barcelona. Implica-t'hi i ajuda a fer una ciutat millor per a tothom.",
          "robots": "",
          "canonical": "https://www.barcelona.cat/ca/implicat",
          "ogTitle": "Implica't",
          "ogDescription": "La teva participació és el motor de Barcelona. Descobreix com implicar-te en els projectes d'innovació que malden per millorar la qualitat de vida a la nostra ciutat.",
          "ogType": "Web",
          "ogUrl": "https://www.barcelona.cat/ca/implicat",
          "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": 47,
          "tabletSmallTapTargets": 43,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 47,
            "oversizedMedia": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 43,
            "oversizedMedia": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 47 small targets on mobile and 43 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 59,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": true,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": true,
          "externalScriptCount": 7,
          "externalScriptsWithoutIntegrity": 7,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "cache-control": "max-age=300, public",
            "content-encoding": "gzip",
            "content-language": "ca",
            "content-length": "17825",
            "content-type": "text/html; charset=UTF-8",
            "date": "Mon, 13 Apr 2026 22:41:13 GMT",
            "etag": "\"1776120073-gzip\"",
            "expires": "Sun, 19 Nov 1978 05:00:00 GMT",
            "last-modified": "Mon, 13 Apr 2026 22:41:13 GMT",
            "server": "nginx",
            "vary": "Cookie,Accept-Encoding",
            "via": "1.1 ca2190123e61f1744d1210c24c87c840.cloudfront.net (CloudFront)",
            "x-amz-cf-id": "wL9DGhAKgL94HSuchE_KNUUzyMpKWVCxAkerrDFPdg5dhaKVnwn3hw==",
            "x-amz-cf-pop": "IAD12-P5",
            "x-cache": "Miss from cloudfront",
            "x-content-type-options": "nosniff",
            "x-frame-options": "SAMEORIGIN",
            "x-generator": "Drupal 10 (https://www.drupal.org)"
          },
          "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": "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": "7 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 25,
        "urgency": "low",
        "origin": "https://www.barcelona.cat",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://www.barcelona.cat/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/sitemap.xml",
            "found": true,
            "status": 200,
            "contentType": "application/xml; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/manifest.webmanifest",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/favicon.ico",
            "found": true,
            "status": 200,
            "contentType": "image/x-icon"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "low",
            "detail": "Missing beneficial file(s): /.well-known/security.txt, /manifest.webmanifest."
          }
        ]
      },
      "mediaHints": {
        "score": 20,
        "urgency": "low",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 65,
          "imagesWithLazy": 53,
          "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."
          }
        ]
      },
      "wsgCustom": {
        "score": 85,
        "urgency": "medium",
        "data": {
          "hasPrintStyles": true,
          "hasReducedMotion": true,
          "media": {
            "totalImages": 70,
            "lazyImages": 54,
            "totalIframes": 1,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "\"Source Sans Pro\", \"Helvetica Neue\", Helvetica, Arial, sans-serif",
            "usesSystemFont": true
          },
          "tracking": {
            "count": 0,
            "scripts": []
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 54/70 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": "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"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 91,
        "urgency": "high",
        "totalEstimatedSavingsBytes": 1609380.8000000003,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Use modern image compression formats",
            "urgency": "high",
            "estimatedSavingsBytes": 881054.8000000002,
            "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": 728326,
            "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: 860.41 KB."
          },
          {
            "title": "Improve image encoding quality/size",
            "urgency": "high",
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 711.26 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": 1840139.8000000003,
        "totalEstimatedBlockingMs": 883,
        "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": 881054.8000000002,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 860 KiB",
            "urgency": "high",
            "sourceAuditId": "modern-image-formats"
          },
          {
            "id": "uses-optimized-images",
            "title": "Compress oversized image assets",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss.",
            "estimatedSavingsBytes": 728326,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 711 KiB",
            "urgency": "high",
            "sourceAuditId": "uses-optimized-images"
          },
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 83661,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 82 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": 83309,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 81 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-css-rules"
          },
          {
            "id": "unused-javascript",
            "title": "Remove unused JavaScript",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code.",
            "estimatedSavingsBytes": 63789,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 62 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-javascript"
          },
          {
            "id": "render-blocking-resources",
            "title": "Eliminate render-blocking resources",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering.",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 883,
            "displayValue": "Est savings of 880 ms",
            "urgency": "medium",
            "sourceAuditId": "render-blocking-resources"
          }
        ],
        "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: 860.41 KB."
          },
          {
            "title": "Compress oversized image assets",
            "urgency": "high",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 711.26 KB."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "medium",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 81.70 KB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "medium",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 81.36 KB."
          },
          {
            "title": "Remove unused JavaScript",
            "urgency": "medium",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 62.29 KB."
          },
          {
            "title": "Eliminate render-blocking resources",
            "urgency": "medium",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering. Estimated render unblocking: 883 ms."
          }
        ]
      },
      "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": 10,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 7,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "7 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": 167992.5954259777
        },
        "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: 164.06 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: 164.06 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": 6,
        "urgency": "medium",
        "transferBytes": 1766613,
        "css": {
          "unusedBytes": 83309,
          "ratio": 0.047157470255228505,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 63789,
          "duplicatedBytes": 0,
          "ratio": 0.036108078000105286,
          "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": "high",
            "estimatedSavingsBytes": 83309,
            "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": "medium",
            "estimatedSavingsBytes": 63789,
            "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": "medium",
        "transferBytes": 1766613,
        "estimatedDeferrableBytes": 230759,
        "renderBlockingMs": 883,
        "breakdown": {
          "offscreenImageSavings": 83661,
          "unusedJavascriptSavings": 63789,
          "unusedCssSavings": 83309
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 83661,
            "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": "medium",
            "estimatedSavingsBytes": 63789,
            "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": "high",
            "estimatedSavingsBytes": 83309,
            "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": "Eliminate render-blocking resources",
            "area": "render-path",
            "urgency": "medium",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 883,
            "strategy": "Defer scripts/styles not required for first paint and preload only truly critical assets.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-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 www.barcelona.cat",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 113400,
            "url": "https://www.barcelona.cat/sites/default/files/styles/destacat_petit/public/foment_de_ciutat_ess_ocupacio_barris_252x228_1.jpg?itok=xJ7tCCBI",
            "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 www.barcelona.cat",
            "area": "font",
            "urgency": "medium",
            "estimatedSavingsBytes": 90559,
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "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": 64,
        "urgency": "high",
        "providerCount": 7,
        "requestCount": 8,
        "transferBytes": 139670,
        "notGreenCount": 5,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76427,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15565,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7146,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5656,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=nWhOz0&url=https%3A%2F%2Fwww.barcelona.cat%2Fca%2Fimplicat",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "high",
            "detail": "Track 7 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."
          },
          {
            "title": "Prioritize greener alternatives for third-party providers",
            "urgency": "high",
            "detail": "5 third-party script origin(s) are not confirmed green in the Green Web Foundation dataset."
          }
        ]
      },
      "redundancy": {
        "score": 15,
        "urgency": "medium",
        "transferBytes": 1766613,
        "estimatedRedundantBytes": 147098,
        "redundancyRatio": 0.08326554825533379,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 83309,
            "displayValue": "Est savings of 81 KiB"
          },
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 63789,
            "displayValue": "Est savings of 62 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 83309,
            "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 unused javascript",
            "urgency": "medium",
            "estimatedSavingsBytes": 63789,
            "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 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": 15,
        "urgency": "medium",
        "totalTransferBytes": 1766613,
        "heavyRequestCount": 5,
        "heavyBytes": 387250,
        "heavyRatio": 0.21920477206949116,
        "heavyRequests": [
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/destacat_petit/public/foment_de_ciutat_ess_ocupacio_barris_252x228_1.jpg?itok=xJ7tCCBI",
            "transferSize": 113400,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "transferSize": 90559,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "transferSize": 76427,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "cdn.matomo.cloud"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament/fonts/icoajuntament.ttf?8aaig7",
            "transferSize": 54919,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/css/css_qDD4BCxE8K-iT7MRORwp32v03DlJblP9-xrYwOBWlQo.css?delta=5&language=ca&theme=barcelonacat_theme&include=eJyFz8GOwyAMBNAfCuXQD0ID8SasiI2wSZu_X6RKXa3EqidbM-8y-O5sOIgt4Mwq6l_HoeYloiUqwkiwICe1lldSP3R3JlJG_5-p2MidmR5_ge10kI8iptZQQ1p5Br7A6YrynHVbkYji1K6SeZuJnMThvWsm5FFmsUofWVCwhvsnUJssMXEYrMG_v0BPo8YoS0XDNkbu6tfWK8rtN7l1rj2WrDuti15qdPgIpR8d6Z1O&tcut5n",
            "transferSize": 51945,
            "resourceType": "stylesheet",
            "mimeType": "text/css",
            "domain": "www.barcelona.cat"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "font",
            "count": 2,
            "transferBytes": 145478
          },
          {
            "resourceType": "image",
            "count": 1,
            "transferBytes": 113400
          },
          {
            "resourceType": "script",
            "count": 1,
            "transferBytes": 76427
          },
          {
            "resourceType": "stylesheet",
            "count": 1,
            "transferBytes": 51945
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.barcelona.cat",
            "count": 4,
            "transferBytes": 310823
          },
          {
            "domain": "cdn.matomo.cloud",
            "count": 1,
            "transferBytes": 76427
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Lazy-load offscreen images and media galleries",
            "urgency": "medium",
            "estimatedSavingsBytes": 83661,
            "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": "medium",
            "estimatedSavingsBytes": 63789,
            "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": "Defer non-critical UI modules until after first render",
            "urgency": "medium",
            "estimatedSavingsBytes": 0,
            "strategy": "Keep only above-the-fold resources in the initial path; hydrate or import secondary modules later.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 www.barcelona.cat",
            "urgency": "medium",
            "estimatedSavingsBytes": 113400,
            "strategy": "Serve a smaller placeholder first and load this asset only when the user scrolls to or requests the component.",
            "url": "https://www.barcelona.cat/sites/default/files/styles/destacat_petit/public/foment_de_ciutat_ess_ocupacio_barris_252x228_1.jpg?itok=xJ7tCCBI",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 www.barcelona.cat",
            "urgency": "medium",
            "estimatedSavingsBytes": 90559,
            "strategy": "Subset or defer this font so full font payloads are only fetched when needed.",
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 cdn.matomo.cloud",
            "urgency": "medium",
            "estimatedSavingsBytes": 76427,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.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.01,
          "displayValue": "8.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: 8.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 62 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 62 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,
          "displayValue": "Est savings of 81 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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 81 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,
          "displayValue": "Est savings of 860 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 860 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 711 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 711 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,
          "displayValue": "Est savings of 82 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 82 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": "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": 0,
          "displayValue": "Est savings of 880 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 Eliminate render-blocking resources\n\n- Lighthouse audit: render-blocking-resources\n- Current value: Est savings of 880 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\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": "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": 0.84,
          "displayValue": "3.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 Speed Index\n\n- Lighthouse audit: speed-index\n- Current value: 3.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\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": "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": "1,462 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: 1,462 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://barcelona.cat/ca/pagina-imatge-promocional",
      "status": "ok",
      "finalUrl": "https://www.barcelona.cat/ca/pagina-imatge-promocional",
      "performanceScore": 0.55,
      "bestPracticesScore": 1,
      "transferBytes": 1053372,
      "co2Grams": 0.40352722048080003,
      "greenWeb": {
        "page": {
          "hostname": "www.barcelona.cat",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-13T22:38:00.231825",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.barcelona.cat",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76424,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "stylesheet",
            "requestCount": 1,
            "transferBytes": 24654,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15566,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7150,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 4127,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/css/bcn-avisos.css",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "fonts.googleapis.com",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 2461,
            "sampleUrl": "https://fonts.googleapis.com/css?family=Source+Sans+3:200,200i,300,300i,400,400i,500,500i,600,600i,700,700i,900,900i",
            "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
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=M5KOGB&url=https%3A%2F%2Fwww.barcelona.cat%2Fca%2Fpagina-imatge-promocional",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 10,
          "greenCount": 4,
          "notGreenCount": 7,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 60,
        "urgency": "high",
        "pageElementOccurrences": 1,
        "uniqueElementsAssessed": 1,
        "reusedFromCacheCount": 1,
        "components": [
          {
            "signature": "form|get|/ca|input|text|query|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "text",
            "fieldName": "query",
            "formContext": "form|get|/ca",
            "hasLabel": true,
            "hasValidationRule": false,
            "hasErrorMessagingHook": false,
            "toolingFriendly": false,
            "assessment": {
              "score": 60,
              "urgency": "high",
              "issues": [
                "No explicit validation rule",
                "No error messaging hook",
                "Missing autocomplete for tooling support"
              ],
              "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.",
                "Provide meaningful autocomplete values to support browsers and assistive tooling."
              ]
            },
            "reusedFromCache": true
          }
        ],
        "recommendations": [
          {
            "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."
          },
          {
            "title": "Missing autocomplete for tooling support",
            "urgency": "medium",
            "detail": "1 unique form control signature(s) on this page include this issue."
          }
        ]
      },
      "metadata": {
        "score": 25,
        "urgency": "low",
        "checks": {
          "hasTitle": true,
          "hasLang": true,
          "hasDescription": false,
          "hasCanonical": true,
          "hasOpenGraphCore": false,
          "hasTwitterCard": true,
          "hasViewport": true,
          "hasCharset": true,
          "hasValidStructuredData": true,
          "hasInvalidStructuredData": false
        },
        "observed": {
          "title": "Pagina Imatge promocional | Barcelona.cat | Ajuntament de Barcelona",
          "lang": "ca",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "",
          "robots": "",
          "canonical": "https://www.barcelona.cat/ca/pagina-imatge-promocional",
          "ogTitle": "Pagina Imatge promocional",
          "ogDescription": "",
          "ogType": "Web",
          "ogUrl": "https://www.barcelona.cat/ca/pagina-imatge-promocional",
          "twitterCard": "summary_large_image",
          "ldJsonCount": 0,
          "validLdJsonCount": 0,
          "invalidLdJsonCount": 0
        },
        "recommendations": [
          {
            "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."
          }
        ]
      },
      "layoutAdaptation": {
        "score": 30,
        "urgency": "medium",
        "checks": {
          "testedMobile": true,
          "testedTablet": true,
          "horizontalOverflowOnMobile": false,
          "horizontalOverflowOnTablet": false,
          "mobileSmallTapTargets": 33,
          "tabletSmallTapTargets": 31,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 33,
            "oversizedMedia": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 31,
            "oversizedMedia": 0
          }
        ],
        "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 31 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 59,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": true,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": true,
          "externalScriptCount": 7,
          "externalScriptsWithoutIntegrity": 7,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "cache-control": "max-age=300, public",
            "content-encoding": "gzip",
            "content-language": "ca",
            "content-length": "9505",
            "content-type": "text/html; charset=UTF-8",
            "date": "Mon, 13 Apr 2026 22:41:29 GMT",
            "etag": "\"1776120088-gzip\"",
            "expires": "Sun, 19 Nov 1978 05:00:00 GMT",
            "last-modified": "Mon, 13 Apr 2026 22:41:28 GMT",
            "server": "nginx",
            "vary": "Cookie,Accept-Encoding",
            "via": "1.1 ca2190123e61f1744d1210c24c87c840.cloudfront.net (CloudFront)",
            "x-amz-cf-id": "3e38oxERZMzptXnUJsr3Hx6RLhFH9Jd5Ej52aXHLBdoHbsX2hGNbUQ==",
            "x-amz-cf-pop": "IAD12-P5",
            "x-cache": "Miss from cloudfront",
            "x-content-type-options": "nosniff",
            "x-frame-options": "SAMEORIGIN",
            "x-generator": "Drupal 10 (https://www.drupal.org)"
          },
          "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": "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": "7 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 25,
        "urgency": "low",
        "origin": "https://www.barcelona.cat",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://www.barcelona.cat/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/sitemap.xml",
            "found": true,
            "status": 200,
            "contentType": "application/xml; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/manifest.webmanifest",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/favicon.ico",
            "found": true,
            "status": 200,
            "contentType": "image/x-icon"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "low",
            "detail": "Missing beneficial file(s): /.well-known/security.txt, /manifest.webmanifest."
          }
        ]
      },
      "mediaHints": {
        "score": 45,
        "urgency": "medium",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 12,
          "imagesWithLazy": 1,
          "imagesWithoutLazy": 11
        },
        "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": "11 of 12 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 85,
        "urgency": "medium",
        "data": {
          "hasPrintStyles": true,
          "hasReducedMotion": true,
          "media": {
            "totalImages": 17,
            "lazyImages": 2,
            "totalIframes": 1,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "\"Source Sans Pro\", \"Helvetica Neue\", Helvetica, Arial, sans-serif",
            "usesSystemFont": true
          },
          "tracking": {
            "count": 0,
            "scripts": []
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 2/17 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": "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"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 53,
        "urgency": "medium",
        "totalEstimatedSavingsBytes": 562765.45,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Use modern image compression formats",
            "urgency": "high",
            "estimatedSavingsBytes": 313928.44999999995,
            "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": 248837,
            "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: 306.57 KB."
          },
          {
            "title": "Improve image encoding quality/size",
            "urgency": "high",
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 243.00 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": 764233.45,
        "totalEstimatedBlockingMs": 876,
        "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": 313928.44999999995,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 307 KiB",
            "urgency": "high",
            "sourceAuditId": "modern-image-formats"
          },
          {
            "id": "uses-optimized-images",
            "title": "Compress oversized image assets",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss.",
            "estimatedSavingsBytes": 248837,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 243 KiB",
            "urgency": "high",
            "sourceAuditId": "uses-optimized-images"
          },
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 87109,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 85 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": 81878,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 80 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-css-rules"
          },
          {
            "id": "render-blocking-resources",
            "title": "Eliminate render-blocking resources",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering.",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 876,
            "displayValue": "Est savings of 880 ms",
            "urgency": "medium",
            "sourceAuditId": "render-blocking-resources"
          },
          {
            "id": "unused-javascript",
            "title": "Remove unused JavaScript",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code.",
            "estimatedSavingsBytes": 32481,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 32 KiB",
            "urgency": "low",
            "sourceAuditId": "unused-javascript"
          }
        ],
        "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: 306.57 KB."
          },
          {
            "title": "Compress oversized image assets",
            "urgency": "high",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 243.00 KB."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "medium",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 85.07 KB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "medium",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 79.96 KB."
          },
          {
            "title": "Eliminate render-blocking resources",
            "urgency": "medium",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering. Estimated render unblocking: 876 ms."
          },
          {
            "title": "Remove unused JavaScript",
            "urgency": "low",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 31.72 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": 10,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 7,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "7 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": 168009.1650139665
        },
        "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: 164.07 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: 164.07 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": "medium",
        "transferBytes": 1053372,
        "css": {
          "unusedBytes": 81878,
          "ratio": 0.07772942512236893,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 32481,
          "duplicatedBytes": 0,
          "ratio": 0.03083526047777993,
          "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": "high",
            "estimatedSavingsBytes": 81878,
            "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": "medium",
            "estimatedSavingsBytes": 32481,
            "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": 14,
        "urgency": "medium",
        "transferBytes": 1053372,
        "estimatedDeferrableBytes": 201468,
        "renderBlockingMs": 876,
        "breakdown": {
          "offscreenImageSavings": 87109,
          "unusedJavascriptSavings": 32481,
          "unusedCssSavings": 81878
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 87109,
            "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": "medium",
            "estimatedSavingsBytes": 32481,
            "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": 81878,
            "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": "Eliminate render-blocking resources",
            "area": "render-path",
            "urgency": "medium",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 876,
            "strategy": "Defer scripts/styles not required for first paint and preload only truly critical assets.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-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 www.barcelona.cat",
            "area": "image",
            "urgency": "high",
            "estimatedSavingsBytes": 224240,
            "url": "https://www.barcelona.cat/sites/default/files/styles/img_promo_mobile/public/amb_accessibilitat-insercio_laboral_5693_1.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 font from www.barcelona.cat",
            "area": "font",
            "urgency": "medium",
            "estimatedSavingsBytes": 90560,
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "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 cdn.matomo.cloud",
            "area": "script",
            "urgency": "medium",
            "estimatedSavingsBytes": 76424,
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.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": 64,
        "urgency": "high",
        "providerCount": 7,
        "requestCount": 8,
        "transferBytes": 139462,
        "notGreenCount": 5,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76424,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15566,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7150,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=M5KOGB&url=https%3A%2F%2Fwww.barcelona.cat%2Fca%2Fpagina-imatge-promocional",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "high",
            "detail": "Track 7 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."
          },
          {
            "title": "Prioritize greener alternatives for third-party providers",
            "urgency": "high",
            "detail": "5 third-party script origin(s) are not confirmed green in the Green Web Foundation dataset."
          }
        ]
      },
      "redundancy": {
        "score": 16,
        "urgency": "low",
        "transferBytes": 1053372,
        "estimatedRedundantBytes": 114359,
        "redundancyRatio": 0.10856468560014886,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 81878,
            "displayValue": "Est savings of 80 KiB"
          },
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 32481,
            "displayValue": "Est savings of 32 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 81878,
            "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 unused javascript",
            "urgency": "medium",
            "estimatedSavingsBytes": 32481,
            "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 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": 26,
        "urgency": "medium",
        "totalTransferBytes": 1053372,
        "heavyRequestCount": 5,
        "heavyBytes": 495248,
        "heavyRatio": 0.4701548930482299,
        "heavyRequests": [
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/img_promo_mobile/public/amb_accessibilitat-insercio_laboral_5693_1.jpg",
            "transferSize": 224240,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "transferSize": 90560,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "transferSize": 76424,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "cdn.matomo.cloud"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament/fonts/icoajuntament.ttf?8aaig7",
            "transferSize": 54920,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/css/css_evpTRQTawGYS1Ro7RbXq3hBxwat7AU-RJm1V8ZgzeaE.css?delta=5&language=ca&theme=barcelonacat_theme&include=eJyFzsGKwzAMBNAfiuvDfpAZOyJxcSQjydn272sodFnIsieJmXcY3Ac7DmJPOKuJxfcJ6HXJ0EJNGAWe5CTVupLFqUdwkTb7v0zHRuGs9P0b-E4HxSzi5oqeyspXYGuS0YL5s1XerkQtEvDZfiVMxsySgS19_Qe6ypILp8kU8fMlejgpoy0dim0u3i2uOjra7Se5De4jt2o7rYs9zemIGUYvwgyJSg&tcut5n",
            "transferSize": 49104,
            "resourceType": "stylesheet",
            "mimeType": "text/css",
            "domain": "www.barcelona.cat"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "image",
            "count": 1,
            "transferBytes": 224240
          },
          {
            "resourceType": "font",
            "count": 2,
            "transferBytes": 145480
          },
          {
            "resourceType": "script",
            "count": 1,
            "transferBytes": 76424
          },
          {
            "resourceType": "stylesheet",
            "count": 1,
            "transferBytes": 49104
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.barcelona.cat",
            "count": 4,
            "transferBytes": 418824
          },
          {
            "domain": "cdn.matomo.cloud",
            "count": 1,
            "transferBytes": 76424
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Lazy-load offscreen images and media galleries",
            "urgency": "medium",
            "estimatedSavingsBytes": 87109,
            "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": "Defer non-critical UI modules until after first render",
            "urgency": "medium",
            "estimatedSavingsBytes": 0,
            "strategy": "Keep only above-the-fold resources in the initial path; hydrate or import secondary modules later.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 www.barcelona.cat",
            "urgency": "medium",
            "estimatedSavingsBytes": 224240,
            "strategy": "Serve a smaller placeholder first and load this asset only when the user scrolls to or requests the component.",
            "url": "https://www.barcelona.cat/sites/default/files/styles/img_promo_mobile/public/amb_accessibilitat-insercio_laboral_5693_1.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 font asset from www.barcelona.cat",
            "urgency": "medium",
            "estimatedSavingsBytes": 90560,
            "strategy": "Subset or defer this font so full font payloads are only fetched when needed.",
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 cdn.matomo.cloud",
            "urgency": "medium",
            "estimatedSavingsBytes": 76424,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.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": "9.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: 9.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 32 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 32 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,
          "displayValue": "Est savings of 80 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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 80 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,
          "displayValue": "Est savings of 307 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 307 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 243 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 243 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,
          "displayValue": "Est savings of 85 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 85 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": "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": 0,
          "displayValue": "Est savings of 880 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 Eliminate render-blocking resources\n\n- Lighthouse audit: render-blocking-resources\n- Current value: Est savings of 880 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\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": "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": 0.88,
          "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 Speed Index\n\n- Lighthouse audit: speed-index\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\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": "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": "928 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: 928 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://barcelona.cat/ca/prova-video",
      "status": "ok",
      "finalUrl": "https://www.barcelona.cat/ca/prova-video",
      "performanceScore": 0.66,
      "bestPracticesScore": 1,
      "transferBytes": 774853,
      "co2Grams": 0.2968317720342,
      "greenWeb": {
        "page": {
          "hostname": "www.barcelona.cat",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-13T22:38:00.231825",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.barcelona.cat",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76425,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "stylesheet",
            "requestCount": 1,
            "transferBytes": 24654,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15566,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7161,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 4109,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/css/bcn-avisos.css",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2860,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "fonts.googleapis.com",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 2461,
            "sampleUrl": "https://fonts.googleapis.com/css?family=Source+Sans+3:200,200i,300,300i,400,400i,500,500i,600,600i,700,700i,900,900i",
            "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
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=9slT81&url=https%3A%2F%2Fwww.barcelona.cat%2Fca%2Fprova-video",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 10,
          "greenCount": 4,
          "notGreenCount": 7,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 60,
        "urgency": "high",
        "pageElementOccurrences": 1,
        "uniqueElementsAssessed": 1,
        "reusedFromCacheCount": 1,
        "components": [
          {
            "signature": "form|get|/ca|input|text|query|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "text",
            "fieldName": "query",
            "formContext": "form|get|/ca",
            "hasLabel": true,
            "hasValidationRule": false,
            "hasErrorMessagingHook": false,
            "toolingFriendly": false,
            "assessment": {
              "score": 60,
              "urgency": "high",
              "issues": [
                "No explicit validation rule",
                "No error messaging hook",
                "Missing autocomplete for tooling support"
              ],
              "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.",
                "Provide meaningful autocomplete values to support browsers and assistive tooling."
              ]
            },
            "reusedFromCache": true
          }
        ],
        "recommendations": [
          {
            "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."
          },
          {
            "title": "Missing autocomplete for tooling support",
            "urgency": "medium",
            "detail": "1 unique form control signature(s) on this page include this issue."
          }
        ]
      },
      "metadata": {
        "score": 25,
        "urgency": "low",
        "checks": {
          "hasTitle": true,
          "hasLang": true,
          "hasDescription": false,
          "hasCanonical": true,
          "hasOpenGraphCore": false,
          "hasTwitterCard": true,
          "hasViewport": true,
          "hasCharset": true,
          "hasValidStructuredData": true,
          "hasInvalidStructuredData": false
        },
        "observed": {
          "title": "Prova video | Barcelona.cat | Ajuntament de Barcelona",
          "lang": "ca",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "",
          "robots": "",
          "canonical": "https://www.barcelona.cat/ca/prova-video",
          "ogTitle": "Prova video",
          "ogDescription": "",
          "ogType": "Web",
          "ogUrl": "https://www.barcelona.cat/ca/prova-video",
          "twitterCard": "summary_large_image",
          "ldJsonCount": 0,
          "validLdJsonCount": 0,
          "invalidLdJsonCount": 0
        },
        "recommendations": [
          {
            "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."
          }
        ]
      },
      "layoutAdaptation": {
        "score": 30,
        "urgency": "medium",
        "checks": {
          "testedMobile": true,
          "testedTablet": true,
          "horizontalOverflowOnMobile": false,
          "horizontalOverflowOnTablet": false,
          "mobileSmallTapTargets": 33,
          "tabletSmallTapTargets": 31,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 33,
            "oversizedMedia": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 31,
            "oversizedMedia": 0
          }
        ],
        "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 31 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 59,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": true,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": true,
          "externalScriptCount": 7,
          "externalScriptsWithoutIntegrity": 7,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "cache-control": "max-age=300, public",
            "content-encoding": "gzip",
            "content-language": "ca",
            "content-length": "10063",
            "content-type": "text/html; charset=UTF-8",
            "date": "Mon, 13 Apr 2026 22:41:42 GMT",
            "etag": "\"1776120101-gzip\"",
            "expires": "Sun, 19 Nov 1978 05:00:00 GMT",
            "last-modified": "Mon, 13 Apr 2026 22:41:41 GMT",
            "server": "nginx",
            "vary": "Cookie,Accept-Encoding",
            "via": "1.1 ca2190123e61f1744d1210c24c87c840.cloudfront.net (CloudFront)",
            "x-amz-cf-id": "_AOUcVKSWkzFNZthrEQUlJGGYjySVI3fh9Pt2PV8XeAaQbbyjvXaNQ==",
            "x-amz-cf-pop": "IAD12-P5",
            "x-cache": "Miss from cloudfront",
            "x-content-type-options": "nosniff",
            "x-frame-options": "SAMEORIGIN",
            "x-generator": "Drupal 10 (https://www.drupal.org)"
          },
          "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": "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": "7 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 25,
        "urgency": "low",
        "origin": "https://www.barcelona.cat",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://www.barcelona.cat/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/sitemap.xml",
            "found": true,
            "status": 200,
            "contentType": "application/xml; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/manifest.webmanifest",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/favicon.ico",
            "found": true,
            "status": 200,
            "contentType": "image/x-icon"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "low",
            "detail": "Missing beneficial file(s): /.well-known/security.txt, /manifest.webmanifest."
          }
        ]
      },
      "mediaHints": {
        "score": 50,
        "urgency": "medium",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 11,
          "imagesWithLazy": 0,
          "imagesWithoutLazy": 11
        },
        "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": "11 of 11 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 85,
        "urgency": "medium",
        "data": {
          "hasPrintStyles": true,
          "hasReducedMotion": true,
          "media": {
            "totalImages": 16,
            "lazyImages": 1,
            "totalIframes": 1,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "\"Source Sans Pro\", \"Helvetica Neue\", Helvetica, Arial, sans-serif",
            "usesSystemFont": true
          },
          "tracking": {
            "count": 0,
            "scripts": []
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 1/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": "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"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 17,
        "urgency": "low",
        "totalEstimatedSavingsBytes": 130442.55,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Use modern image compression formats",
            "urgency": "medium",
            "estimatedSavingsBytes": 72410.55,
            "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size."
          },
          {
            "id": "uses-optimized-images",
            "title": "Improve image encoding quality/size",
            "urgency": "medium",
            "estimatedSavingsBytes": 58032,
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings."
          }
        ],
        "recommendations": [
          {
            "title": "Use modern image compression formats",
            "urgency": "medium",
            "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size. Estimated savings: 70.71 KB."
          },
          {
            "title": "Improve image encoding quality/size",
            "urgency": "medium",
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 56.67 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": 331829.55,
        "totalEstimatedBlockingMs": 876,
        "opportunities": [
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 87110,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 85 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": 81796,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 80 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-css-rules"
          },
          {
            "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": 72410.55,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 71 KiB",
            "urgency": "medium",
            "sourceAuditId": "modern-image-formats"
          },
          {
            "id": "uses-optimized-images",
            "title": "Compress oversized image assets",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss.",
            "estimatedSavingsBytes": 58032,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 57 KiB",
            "urgency": "medium",
            "sourceAuditId": "uses-optimized-images"
          },
          {
            "id": "render-blocking-resources",
            "title": "Eliminate render-blocking resources",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering.",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 876,
            "displayValue": "Est savings of 880 ms",
            "urgency": "medium",
            "sourceAuditId": "render-blocking-resources"
          },
          {
            "id": "unused-javascript",
            "title": "Remove unused JavaScript",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code.",
            "estimatedSavingsBytes": 32481,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 32 KiB",
            "urgency": "low",
            "sourceAuditId": "unused-javascript"
          }
        ],
        "recommendations": [
          {
            "title": "Lazy-load offscreen images",
            "urgency": "medium",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 85.07 KB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "medium",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 79.88 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: 70.71 KB."
          },
          {
            "title": "Compress oversized image assets",
            "urgency": "medium",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 56.67 KB."
          },
          {
            "title": "Eliminate render-blocking resources",
            "urgency": "medium",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering. Estimated render unblocking: 876 ms."
          },
          {
            "title": "Remove unused JavaScript",
            "urgency": "low",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 31.72 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": 10,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 7,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "7 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": 168009.08348463685
        },
        "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: 164.07 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: 164.07 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": "medium",
        "transferBytes": 774853,
        "css": {
          "unusedBytes": 81796,
          "ratio": 0.10556324877105722,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 32481,
          "duplicatedBytes": 0,
          "ratio": 0.04191891881427832,
          "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": "high",
            "estimatedSavingsBytes": 81796,
            "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": "medium",
            "estimatedSavingsBytes": 32481,
            "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": 16,
        "urgency": "medium",
        "transferBytes": 774853,
        "estimatedDeferrableBytes": 201387,
        "renderBlockingMs": 876,
        "breakdown": {
          "offscreenImageSavings": 87110,
          "unusedJavascriptSavings": 32481,
          "unusedCssSavings": 81796
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 87110,
            "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": "medium",
            "estimatedSavingsBytes": 32481,
            "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": 81796,
            "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": "Eliminate render-blocking resources",
            "area": "render-path",
            "urgency": "medium",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 876,
            "strategy": "Defer scripts/styles not required for first paint and preload only truly critical assets.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-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 www.barcelona.cat",
            "area": "font",
            "urgency": "medium",
            "estimatedSavingsBytes": 90561,
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "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 www.barcelona.cat",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 84137,
            "url": "https://www.barcelona.cat/themes/barcelonacat_theme/images/menu/viula.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 cdn.matomo.cloud",
            "area": "script",
            "urgency": "medium",
            "estimatedSavingsBytes": 76425,
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.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": 64,
        "urgency": "high",
        "providerCount": 7,
        "requestCount": 8,
        "transferBytes": 139473,
        "notGreenCount": 5,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76425,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15566,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7161,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2860,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=9slT81&url=https%3A%2F%2Fwww.barcelona.cat%2Fca%2Fprova-video",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "high",
            "detail": "Track 7 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."
          },
          {
            "title": "Prioritize greener alternatives for third-party providers",
            "urgency": "high",
            "detail": "5 third-party script origin(s) are not confirmed green in the Green Web Foundation dataset."
          }
        ]
      },
      "redundancy": {
        "score": 18,
        "urgency": "low",
        "transferBytes": 774853,
        "estimatedRedundantBytes": 114277,
        "redundancyRatio": 0.14748216758533553,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 81796,
            "displayValue": "Est savings of 80 KiB"
          },
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 32481,
            "displayValue": "Est savings of 32 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 81796,
            "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 unused javascript",
            "urgency": "medium",
            "estimatedSavingsBytes": 32481,
            "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 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": 21,
        "urgency": "medium",
        "totalTransferBytes": 774853,
        "heavyRequestCount": 4,
        "heavyBytes": 271001,
        "heavyRatio": 0.349745048415635,
        "heavyRequests": [
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "transferSize": 90561,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "transferSize": 76425,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "cdn.matomo.cloud"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament/fonts/icoajuntament.ttf?8aaig7",
            "transferSize": 54921,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/css/css_evpTRQTawGYS1Ro7RbXq3hBxwat7AU-RJm1V8ZgzeaE.css?delta=5&language=ca&theme=barcelonacat_theme&include=eJyFzsGKwzAMBNAfiuvDfpAZOyJxcSQjydn272sodFnIsieJmXcY3Ac7DmJPOKuJxfcJ6HXJ0EJNGAWe5CTVupLFqUdwkTb7v0zHRuGs9P0b-E4HxSzi5oqeyspXYGuS0YL5s1XerkQtEvDZfiVMxsySgS19_Qe6ypILp8kU8fMlejgpoy0dim0u3i2uOjra7Se5De4jt2o7rYs9zemIGUYvwgyJSg&tcut5n",
            "transferSize": 49094,
            "resourceType": "stylesheet",
            "mimeType": "text/css",
            "domain": "www.barcelona.cat"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "font",
            "count": 2,
            "transferBytes": 145482
          },
          {
            "resourceType": "script",
            "count": 1,
            "transferBytes": 76425
          },
          {
            "resourceType": "stylesheet",
            "count": 1,
            "transferBytes": 49094
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.barcelona.cat",
            "count": 3,
            "transferBytes": 194576
          },
          {
            "domain": "cdn.matomo.cloud",
            "count": 1,
            "transferBytes": 76425
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Lazy-load offscreen images and media galleries",
            "urgency": "medium",
            "estimatedSavingsBytes": 87110,
            "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": "Defer non-critical UI modules until after first render",
            "urgency": "medium",
            "estimatedSavingsBytes": 0,
            "strategy": "Keep only above-the-fold resources in the initial path; hydrate or import secondary modules later.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 www.barcelona.cat",
            "urgency": "medium",
            "estimatedSavingsBytes": 90561,
            "strategy": "Subset or defer this font so full font payloads are only fetched when needed.",
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 cdn.matomo.cloud",
            "urgency": "medium",
            "estimatedSavingsBytes": 76425,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.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.02,
          "displayValue": "8.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: 8.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 32 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 32 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,
          "displayValue": "Est savings of 80 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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 80 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,
          "displayValue": "Est savings of 71 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 71 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 57 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 57 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,
          "displayValue": "Est savings of 85 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 85 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": "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": 0,
          "displayValue": "Est savings of 880 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 Eliminate render-blocking resources\n\n- Lighthouse audit: render-blocking-resources\n- Current value: Est savings of 880 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\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": "server-response-time",
          "title": "Reduce initial server response time",
          "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": 0,
          "displayValue": "Root document took 680 ms",
          "impact": "high",
          "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 Reduce initial server response time\n\n- Lighthouse audit: server-response-time\n- Current value: Root document took 680 ms\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": "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": 0.8,
          "displayValue": "4.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 Speed Index\n\n- Lighthouse audit: speed-index\n- Current value: 4.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\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": "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": "937 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: 937 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://barcelona.cat/ca/que-pots-fer-a-bcn",
      "status": "ok",
      "finalUrl": "https://www.barcelona.cat/ca/que-pots-fer-a-bcn",
      "performanceScore": 0.65,
      "bestPracticesScore": 1,
      "transferBytes": 2392063,
      "co2Grams": 0.9163548429281999,
      "greenWeb": {
        "page": {
          "hostname": "www.barcelona.cat",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-13T22:38:00.231825",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.barcelona.cat",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76425,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "stylesheet",
            "requestCount": 1,
            "transferBytes": 24654,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15565,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7144,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 4112,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/css/bcn-avisos.css",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2862,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "fonts.googleapis.com",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 2462,
            "sampleUrl": "https://fonts.googleapis.com/css?family=Source+Sans+3:200,200i,300,300i,400,400i,500,500i,600,600i,700,700i,900,900i",
            "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
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=zF0DqZ&url=https%3A%2F%2Fwww.barcelona.cat%2Fca%2Fque-pots-fer-a-bcn",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 10,
          "greenCount": 4,
          "notGreenCount": 7,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 60,
        "urgency": "high",
        "pageElementOccurrences": 1,
        "uniqueElementsAssessed": 1,
        "reusedFromCacheCount": 1,
        "components": [
          {
            "signature": "form|get|/ca|input|text|query|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "text",
            "fieldName": "query",
            "formContext": "form|get|/ca",
            "hasLabel": true,
            "hasValidationRule": false,
            "hasErrorMessagingHook": false,
            "toolingFriendly": false,
            "assessment": {
              "score": 60,
              "urgency": "high",
              "issues": [
                "No explicit validation rule",
                "No error messaging hook",
                "Missing autocomplete for tooling support"
              ],
              "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.",
                "Provide meaningful autocomplete values to support browsers and assistive tooling."
              ]
            },
            "reusedFromCache": true
          }
        ],
        "recommendations": [
          {
            "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."
          },
          {
            "title": "Missing autocomplete for tooling support",
            "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": "Què es pot fer a Barcelona | Barcelona.cat | Ajuntament de Barcelona",
          "lang": "ca",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "Consulta l'agenda d'activitats, esdeveniments culturals, centres esportius i parcs que t'ofereix la ciutat de Barcelona.",
          "robots": "",
          "canonical": "https://www.barcelona.cat/ca/que-pots-fer-a-bcn",
          "ogTitle": "Descobreix tot el que pots fer a Barcelona",
          "ogDescription": "No et perdis res! Explora la guia d'activitats de la ciutat: des de cultura fins a centres esportius i parcs a Barcelona.",
          "ogType": "Web",
          "ogUrl": "https://www.barcelona.cat/ca/que-pots-fer-a-bcn",
          "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": 34,
        "urgency": "medium",
        "checks": {
          "testedMobile": true,
          "testedTablet": true,
          "horizontalOverflowOnMobile": false,
          "horizontalOverflowOnTablet": false,
          "mobileSmallTapTargets": 46,
          "tabletSmallTapTargets": 33,
          "fixedWidthOffenders": 2,
          "oversizedMedia": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 1,
            "smallTapTargets": 46,
            "oversizedMedia": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 1,
            "smallTapTargets": 33,
            "oversizedMedia": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 46 small targets on mobile and 33 on tablet."
          },
          {
            "title": "Refactor fixed-width components",
            "urgency": "medium",
            "detail": "2 element(s) exceeded viewport width in tested layouts; use responsive component constraints."
          }
        ]
      },
      "securityLight": {
        "score": 59,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": true,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": true,
          "externalScriptCount": 7,
          "externalScriptsWithoutIntegrity": 7,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "cache-control": "max-age=300, public",
            "content-encoding": "gzip",
            "content-language": "ca",
            "content-length": "14249",
            "content-type": "text/html; charset=UTF-8",
            "date": "Mon, 13 Apr 2026 22:41:54 GMT",
            "etag": "\"1776120114-gzip\"",
            "expires": "Sun, 19 Nov 1978 05:00:00 GMT",
            "last-modified": "Mon, 13 Apr 2026 22:41:54 GMT",
            "server": "nginx",
            "vary": "Cookie,Accept-Encoding",
            "via": "1.1 ca2190123e61f1744d1210c24c87c840.cloudfront.net (CloudFront)",
            "x-amz-cf-id": "p_L63PJ6hzEDM_z2exX0FkdHlKSTqb-GoDuDxycgBrz9X5_u1laF3g==",
            "x-amz-cf-pop": "IAD12-P5",
            "x-cache": "Miss from cloudfront",
            "x-content-type-options": "nosniff",
            "x-frame-options": "SAMEORIGIN",
            "x-generator": "Drupal 10 (https://www.drupal.org)"
          },
          "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": "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": "7 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 25,
        "urgency": "low",
        "origin": "https://www.barcelona.cat",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://www.barcelona.cat/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/sitemap.xml",
            "found": true,
            "status": 200,
            "contentType": "application/xml; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/manifest.webmanifest",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/favicon.ico",
            "found": true,
            "status": 200,
            "contentType": "image/x-icon"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "low",
            "detail": "Missing beneficial file(s): /.well-known/security.txt, /manifest.webmanifest."
          }
        ]
      },
      "mediaHints": {
        "score": 20,
        "urgency": "low",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 63,
          "imagesWithLazy": 34,
          "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."
          }
        ]
      },
      "wsgCustom": {
        "score": 85,
        "urgency": "medium",
        "data": {
          "hasPrintStyles": true,
          "hasReducedMotion": true,
          "media": {
            "totalImages": 68,
            "lazyImages": 35,
            "totalIframes": 1,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "\"Source Sans Pro\", \"Helvetica Neue\", Helvetica, Arial, sans-serif",
            "usesSystemFont": true
          },
          "tracking": {
            "count": 0,
            "scripts": []
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 35/68 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": "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"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 100,
        "urgency": "high",
        "totalEstimatedSavingsBytes": 2538217.3499999996,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Use modern image compression formats",
            "urgency": "high",
            "estimatedSavingsBytes": 1380798.3499999996,
            "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": 1157419,
            "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: 1.32 MB."
          },
          {
            "title": "Improve image encoding quality/size",
            "urgency": "high",
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 1.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": 2763249.3499999996,
        "totalEstimatedBlockingMs": 1502,
        "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": 1380798.3499999996,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 1,348 KiB",
            "urgency": "high",
            "sourceAuditId": "modern-image-formats"
          },
          {
            "id": "uses-optimized-images",
            "title": "Compress oversized image assets",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss.",
            "estimatedSavingsBytes": 1157419,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 1,130 KiB",
            "urgency": "high",
            "sourceAuditId": "uses-optimized-images"
          },
          {
            "id": "render-blocking-resources",
            "title": "Eliminate render-blocking resources",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering.",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1502,
            "displayValue": "Est savings of 1,500 ms",
            "urgency": "high",
            "sourceAuditId": "render-blocking-resources"
          },
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 87109,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 85 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": 83298,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 81 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-css-rules"
          },
          {
            "id": "unused-javascript",
            "title": "Remove unused JavaScript",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code.",
            "estimatedSavingsBytes": 54625,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 53 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-javascript"
          }
        ],
        "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.32 MB."
          },
          {
            "title": "Compress oversized image assets",
            "urgency": "high",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 1.10 MB."
          },
          {
            "title": "Eliminate render-blocking resources",
            "urgency": "high",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering. Estimated render unblocking: 1502 ms."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "medium",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 85.07 KB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "medium",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 81.35 KB."
          },
          {
            "title": "Remove unused JavaScript",
            "urgency": "medium",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 53.34 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": 10,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 7,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "7 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": 167994.32723463688
        },
        "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: 164.06 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: 164.06 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": "medium",
        "transferBytes": 2392063,
        "css": {
          "unusedBytes": 83298,
          "ratio": 0.03482266144328139,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 54625,
          "duplicatedBytes": 0,
          "ratio": 0.022835937013364616,
          "auditIds": [
            "unused-javascript",
            "duplicated-javascript"
          ]
        },
        "html": {
          "estimatedPenalty": 0.25,
          "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": "high",
            "estimatedSavingsBytes": 83298,
            "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": "medium",
            "estimatedSavingsBytes": 54625,
            "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": 2392063,
        "estimatedDeferrableBytes": 225032,
        "renderBlockingMs": 1502,
        "breakdown": {
          "offscreenImageSavings": 87109,
          "unusedJavascriptSavings": 54625,
          "unusedCssSavings": 83298
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 87109,
            "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": "medium",
            "estimatedSavingsBytes": 54625,
            "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": "high",
            "estimatedSavingsBytes": 83298,
            "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": "Eliminate render-blocking resources",
            "area": "render-path",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1502,
            "strategy": "Defer scripts/styles not required for first paint and preload only truly critical assets.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-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 www.barcelona.cat",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 131591,
            "url": "https://www.barcelona.cat/sites/default/files/styles/distribuidora_banner_paginat/public/banner_05_2.jpg?itok=v2FZuICQ",
            "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": 64,
        "urgency": "high",
        "providerCount": 7,
        "requestCount": 8,
        "transferBytes": 139457,
        "notGreenCount": 5,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76425,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15565,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7144,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2862,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=zF0DqZ&url=https%3A%2F%2Fwww.barcelona.cat%2Fca%2Fque-pots-fer-a-bcn",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "high",
            "detail": "Track 7 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."
          },
          {
            "title": "Prioritize greener alternatives for third-party providers",
            "urgency": "high",
            "detail": "5 third-party script origin(s) are not confirmed green in the Green Web Foundation dataset."
          }
        ]
      },
      "redundancy": {
        "score": 23,
        "urgency": "medium",
        "transferBytes": 2392063,
        "estimatedRedundantBytes": 137923,
        "redundancyRatio": 0.057658598456646,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 83298,
            "displayValue": "Est savings of 81 KiB"
          },
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 54625,
            "displayValue": "Est savings of 53 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 83298,
            "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 unused javascript",
            "urgency": "medium",
            "estimatedSavingsBytes": 54625,
            "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 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": 21,
        "urgency": "high",
        "totalTransferBytes": 2392063,
        "heavyRequestCount": 8,
        "heavyBytes": 728500,
        "heavyRatio": 0.3045488350432242,
        "heavyRequests": [
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/distribuidora_banner_paginat/public/banner_05_2.jpg?itok=v2FZuICQ",
            "transferSize": 131591,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/distribuidora_banner_menu/public/parcs%20i%20jardins%208789.jpg?itok=uTySxKDK",
            "transferSize": 111821,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/destacat_petit/public/edifici_252x228_2.jpg?itok=bXAyHXRG",
            "transferSize": 105744,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/destacat_petit/public/tibidaboia-252x228.jpg?itok=Qv1xI3_6",
            "transferSize": 105503,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "transferSize": 90560,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "transferSize": 76425,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "cdn.matomo.cloud"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament/fonts/icoajuntament.ttf?8aaig7",
            "transferSize": 54920,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/css/css_qDD4BCxE8K-iT7MRORwp32v03DlJblP9-xrYwOBWlQo.css?delta=6&language=ca&theme=barcelonacat_theme&include=eJyFz8FuxCAMBNAfCsuhH4QG4ia0DkbYpJu_L9JKW1VitSdbM-8y-OrFcFCxgDOrqH8ch5qXiJaIpSDBgpzUWl5J_dDdmQiP_pWp2MidmX7-A9vpIB9FTK2hhrSWGfhESVeU-6zbWCLYqV2cyzYTOYnDc9dMKOf07ZASqebINDXSRxYURcPHO1CbLDGVMFiDf36B7katgJeKhm0s3tWvrVfw7S-59VJ75Kw7rYteanT4CKVfKxCiTQ&tcut5n",
            "transferSize": 51936,
            "resourceType": "stylesheet",
            "mimeType": "text/css",
            "domain": "www.barcelona.cat"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "image",
            "count": 4,
            "transferBytes": 454659
          },
          {
            "resourceType": "font",
            "count": 2,
            "transferBytes": 145480
          },
          {
            "resourceType": "script",
            "count": 1,
            "transferBytes": 76425
          },
          {
            "resourceType": "stylesheet",
            "count": 1,
            "transferBytes": 51936
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.barcelona.cat",
            "count": 7,
            "transferBytes": 652075
          },
          {
            "domain": "cdn.matomo.cloud",
            "count": 1,
            "transferBytes": 76425
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Lazy-load offscreen images and media galleries",
            "urgency": "medium",
            "estimatedSavingsBytes": 87109,
            "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": "medium",
            "estimatedSavingsBytes": 54625,
            "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": "Defer non-critical UI modules until after first render",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "strategy": "Keep only above-the-fold resources in the initial path; hydrate or import secondary modules later.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 www.barcelona.cat",
            "urgency": "medium",
            "estimatedSavingsBytes": 131591,
            "strategy": "Serve a smaller placeholder first and load this asset only when the user scrolls to or requests the component.",
            "url": "https://www.barcelona.cat/sites/default/files/styles/distribuidora_banner_paginat/public/banner_05_2.jpg?itok=v2FZuICQ",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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.07,
          "displayValue": "6.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: 6.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 53 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 53 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,
          "displayValue": "Est savings of 81 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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 81 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,
          "displayValue": "Est savings of 1,348 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,348 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 1,130 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 1,130 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,
          "displayValue": "Est savings of 85 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 85 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": "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": 0,
          "displayValue": "Est savings of 1,500 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 Eliminate render-blocking resources\n\n- Lighthouse audit: render-blocking-resources\n- Current value: Est savings of 1,500 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\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": "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,
          "displayValue": "1,514 elements",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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: 1,514 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"
        },
        {
          "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": 0.82,
          "displayValue": "3.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 Speed Index\n\n- Lighthouse audit: speed-index\n- Current value: 3.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\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"
        }
      ]
    },
    {
      "url": "https://barcelona.cat/ca/treball-i-empresa",
      "status": "ok",
      "finalUrl": "https://www.barcelona.cat/ca/treball-i-empresa",
      "performanceScore": 0.62,
      "bestPracticesScore": 1,
      "transferBytes": 3220295,
      "co2Grams": 1.2336351170130004,
      "greenWeb": {
        "page": {
          "hostname": "www.barcelona.cat",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-13T22:38:00.231825",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.barcelona.cat",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76425,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31745,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "stylesheet",
            "requestCount": 1,
            "transferBytes": 24654,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15566,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7144,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 4111,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/css/bcn-avisos.css",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "fonts.googleapis.com",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 2463,
            "sampleUrl": "https://fonts.googleapis.com/css?family=Source+Sans+3:200,200i,300,300i,400,400i,500,500i,600,600i,700,700i,900,900i",
            "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
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=QrHrOc&url=https%3A%2F%2Fwww.barcelona.cat%2Fca%2Ftreball-i-empresa",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 10,
          "greenCount": 4,
          "notGreenCount": 7,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 60,
        "urgency": "high",
        "pageElementOccurrences": 1,
        "uniqueElementsAssessed": 1,
        "reusedFromCacheCount": 1,
        "components": [
          {
            "signature": "form|get|/ca|input|text|query|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "text",
            "fieldName": "query",
            "formContext": "form|get|/ca",
            "hasLabel": true,
            "hasValidationRule": false,
            "hasErrorMessagingHook": false,
            "toolingFriendly": false,
            "assessment": {
              "score": 60,
              "urgency": "high",
              "issues": [
                "No explicit validation rule",
                "No error messaging hook",
                "Missing autocomplete for tooling support"
              ],
              "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.",
                "Provide meaningful autocomplete values to support browsers and assistive tooling."
              ]
            },
            "reusedFromCache": true
          }
        ],
        "recommendations": [
          {
            "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."
          },
          {
            "title": "Missing autocomplete for tooling support",
            "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": "Treball i empresa | Barcelona.cat | Ajuntament de Barcelona",
          "lang": "ca",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "Troba tota la informació, serveis i ajuts per cercar feina, emprendre un negoci o fer créixer la teva empresa a Barcelona",
          "robots": "",
          "canonical": "https://www.barcelona.cat/ca/treball-i-empresa",
          "ogTitle": "Treball i empresa a Barcelona",
          "ogDescription": "Estàs buscant feina o vols emprendre? Descobreix els serveis i ajuts econòmics que et posem a l'abast per potenciar el teu talent o el teu negoci.",
          "ogType": "Web",
          "ogUrl": "https://www.barcelona.cat/ca/treball-i-empresa",
          "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": 96,
          "tabletSmallTapTargets": 93,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 96,
            "oversizedMedia": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 93,
            "oversizedMedia": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 96 small targets on mobile and 93 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 59,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": true,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": true,
          "externalScriptCount": 7,
          "externalScriptsWithoutIntegrity": 7,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "cache-control": "max-age=300, public",
            "content-encoding": "gzip",
            "content-language": "ca",
            "content-length": "17771",
            "content-type": "text/html; charset=UTF-8",
            "date": "Mon, 13 Apr 2026 22:42:10 GMT",
            "etag": "\"1776120130-gzip\"",
            "expires": "Sun, 19 Nov 1978 05:00:00 GMT",
            "last-modified": "Mon, 13 Apr 2026 22:42:10 GMT",
            "server": "nginx",
            "vary": "Cookie,Accept-Encoding",
            "via": "1.1 ca2190123e61f1744d1210c24c87c840.cloudfront.net (CloudFront)",
            "x-amz-cf-id": "SjVvlfbkMZG5DjIN-dXdwsKFqtPV7NT-9XhYmvt1D14Y3bFSVALiRA==",
            "x-amz-cf-pop": "IAD12-P5",
            "x-cache": "Miss from cloudfront",
            "x-content-type-options": "nosniff",
            "x-frame-options": "SAMEORIGIN",
            "x-generator": "Drupal 10 (https://www.drupal.org)"
          },
          "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": "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": "7 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 25,
        "urgency": "low",
        "origin": "https://www.barcelona.cat",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://www.barcelona.cat/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/sitemap.xml",
            "found": true,
            "status": 200,
            "contentType": "application/xml; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/manifest.webmanifest",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/favicon.ico",
            "found": true,
            "status": 200,
            "contentType": "image/x-icon"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "low",
            "detail": "Missing beneficial file(s): /.well-known/security.txt, /manifest.webmanifest."
          }
        ]
      },
      "mediaHints": {
        "score": 20,
        "urgency": "low",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 48,
          "imagesWithLazy": 37,
          "imagesWithoutLazy": 11
        },
        "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."
          }
        ]
      },
      "wsgCustom": {
        "score": 85,
        "urgency": "medium",
        "data": {
          "hasPrintStyles": true,
          "hasReducedMotion": true,
          "media": {
            "totalImages": 53,
            "lazyImages": 38,
            "totalIframes": 1,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "\"Source Sans Pro\", \"Helvetica Neue\", Helvetica, Arial, sans-serif",
            "usesSystemFont": true
          },
          "tracking": {
            "count": 0,
            "scripts": []
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 38/53 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": "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"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 100,
        "urgency": "high",
        "totalEstimatedSavingsBytes": 3958833.35,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Use modern image compression formats",
            "urgency": "high",
            "estimatedSavingsBytes": 2146666.35,
            "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": 1812167,
            "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: 2.05 MB."
          },
          {
            "title": "Improve image encoding quality/size",
            "urgency": "high",
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings. 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": 4187956.35,
        "totalEstimatedBlockingMs": 1510,
        "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": 2146666.35,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 2,096 KiB",
            "urgency": "high",
            "sourceAuditId": "modern-image-formats"
          },
          {
            "id": "uses-optimized-images",
            "title": "Compress oversized image assets",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss.",
            "estimatedSavingsBytes": 1812167,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 1,770 KiB",
            "urgency": "high",
            "sourceAuditId": "uses-optimized-images"
          },
          {
            "id": "render-blocking-resources",
            "title": "Eliminate render-blocking resources",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering.",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1510,
            "displayValue": "Est savings of 1,510 ms",
            "urgency": "high",
            "sourceAuditId": "render-blocking-resources"
          },
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 87110,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 85 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": 83327,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 81 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-css-rules"
          },
          {
            "id": "unused-javascript",
            "title": "Remove unused JavaScript",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code.",
            "estimatedSavingsBytes": 58686,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 57 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-javascript"
          }
        ],
        "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: 2.05 MB."
          },
          {
            "title": "Compress oversized image assets",
            "urgency": "high",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 1.73 MB."
          },
          {
            "title": "Eliminate render-blocking resources",
            "urgency": "high",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering. Estimated render unblocking: 1510 ms."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "medium",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 85.07 KB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "medium",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 81.37 KB."
          },
          {
            "title": "Remove unused JavaScript",
            "urgency": "medium",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 57.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": 10,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 7,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "7 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": 167997.4459846369
        },
        "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: 164.06 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: 164.06 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": "medium",
        "transferBytes": 3220295,
        "css": {
          "unusedBytes": 83327,
          "ratio": 0.025875579721733568,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 58686,
          "duplicatedBytes": 0,
          "ratio": 0.018223796267112173,
          "auditIds": [
            "unused-javascript",
            "duplicated-javascript"
          ]
        },
        "html": {
          "estimatedPenalty": 0.25,
          "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": "high",
            "estimatedSavingsBytes": 83327,
            "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": "medium",
            "estimatedSavingsBytes": 58686,
            "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": 3220295,
        "estimatedDeferrableBytes": 229123,
        "renderBlockingMs": 1510,
        "breakdown": {
          "offscreenImageSavings": 87110,
          "unusedJavascriptSavings": 58686,
          "unusedCssSavings": 83327
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 87110,
            "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": "medium",
            "estimatedSavingsBytes": 58686,
            "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": "high",
            "estimatedSavingsBytes": 83327,
            "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": "Eliminate render-blocking resources",
            "area": "render-path",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1510,
            "strategy": "Defer scripts/styles not required for first paint and preload only truly critical assets.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-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 www.barcelona.cat",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 158293,
            "url": "https://www.barcelona.cat/sites/default/files/styles/distribuidora_central/public/cerques_feina_mercat_laboral_0256.jpg?itok=abQPL1uE",
            "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": 64,
        "urgency": "high",
        "providerCount": 7,
        "requestCount": 8,
        "transferBytes": 139456,
        "notGreenCount": 5,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76425,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31745,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15566,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7144,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=QrHrOc&url=https%3A%2F%2Fwww.barcelona.cat%2Fca%2Ftreball-i-empresa",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "high",
            "detail": "Track 7 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."
          },
          {
            "title": "Prioritize greener alternatives for third-party providers",
            "urgency": "high",
            "detail": "5 third-party script origin(s) are not confirmed green in the Green Web Foundation dataset."
          }
        ]
      },
      "redundancy": {
        "score": 22,
        "urgency": "medium",
        "transferBytes": 3220295,
        "estimatedRedundantBytes": 142013,
        "redundancyRatio": 0.044099375988845745,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 83327,
            "displayValue": "Est savings of 81 KiB"
          },
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 58686,
            "displayValue": "Est savings of 57 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 83327,
            "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 unused javascript",
            "urgency": "medium",
            "estimatedSavingsBytes": 58686,
            "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 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": 35,
        "urgency": "high",
        "totalTransferBytes": 3220295,
        "heavyRequestCount": 17,
        "heavyBytes": 1972829,
        "heavyRatio": 0.6126236882024784,
        "heavyRequests": [
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/distribuidora_central/public/cerques_feina_mercat_laboral_0256.jpg?itok=abQPL1uE",
            "transferSize": 158293,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/distribuidora_central/public/tens%20un%20negoci-nous%20horitzons%203746.jpg?itok=uRlm3ztW",
            "transferSize": 145980,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/distribuidora_central/public/emprenedoria_social_387x223.jpg?itok=4TFG8jfn",
            "transferSize": 138819,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/distribuidora_central/public/190331_f_packfotos_panoramiquesnovesciutat_2056.jpeg?itok=9CGKi9q_",
            "transferSize": 137846,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/distribuidora_central/public/formaci%C3%B2%20continua-cibernarium%209731.jpg?itok=1IncVAns",
            "transferSize": 133963,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/distribuidora_central/public/tens_un_negoci_sector_estrategic%20.jpg?itok=sQIcUf3T",
            "transferSize": 132845,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/distribuidora_central/public/vols_emprendre_ubicat_9592.jpg?itok=6jnocCY8",
            "transferSize": 132755,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/distribuidora_central/public/Cerques_feina_prestacions_3443.jpg?itok=Iv5w4R3J",
            "transferSize": 132485,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/distribuidora_central/public/tens_un_negoci_informat_9782.jpg?itok=zPeXebmg",
            "transferSize": 130957,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/distribuidora_central/public/cerques_feina_assesorat_0440.jpg?itok=0BMoXkQw",
            "transferSize": 121996,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/distribuidora_central/public/Emprenedoria%20Glories%20Barcelona_387x223.jpg?itok=M9nQLGxO",
            "transferSize": 114520,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/distribuidora_central/public/cerques_feina_eines_9597.jpg?itok=xhGYMCD1",
            "transferSize": 112182,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/distribuidora_central/public/20210305_presentaciofestivalsperlaculturasegura_02_0.jpeg?itok=4J6qINE5",
            "transferSize": 106341,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "transferSize": 90560,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "transferSize": 76425,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "cdn.matomo.cloud"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament/fonts/icoajuntament.ttf?8aaig7",
            "transferSize": 54920,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/css/css_qDD4BCxE8K-iT7MRORwp32v03DlJblP9-xrYwOBWlQo.css?delta=5&language=ca&theme=barcelonacat_theme&include=eJyFz8GOwyAMBNAfCuXQD0ID8SasiI2wSZu_X6RKXa3EqidbM-8y-O5sOIgt4Mwq6l_HoeYloiUqwkiwICe1lldSP3R3JlJG_5-p2MidmR5_ge10kI8iptZQQ1p5Br7A6YrynHVbkYji1K6SeZuJnMThvWsm5FFmsUofWVCwhvsnUJssMXEYrMG_v0BPo8YoS0XDNkbu6tfWK8rtN7l1rj2WrDuti15qdPgIpR8d6Z1O&tcut5n",
            "transferSize": 51942,
            "resourceType": "stylesheet",
            "mimeType": "text/css",
            "domain": "www.barcelona.cat"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "image",
            "count": 13,
            "transferBytes": 1698982
          },
          {
            "resourceType": "font",
            "count": 2,
            "transferBytes": 145480
          },
          {
            "resourceType": "script",
            "count": 1,
            "transferBytes": 76425
          },
          {
            "resourceType": "stylesheet",
            "count": 1,
            "transferBytes": 51942
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.barcelona.cat",
            "count": 16,
            "transferBytes": 1896404
          },
          {
            "domain": "cdn.matomo.cloud",
            "count": 1,
            "transferBytes": 76425
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Lazy-load offscreen images and media galleries",
            "urgency": "medium",
            "estimatedSavingsBytes": 87110,
            "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": "medium",
            "estimatedSavingsBytes": 58686,
            "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": "Defer non-critical UI modules until after first render",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "strategy": "Keep only above-the-fold resources in the initial path; hydrate or import secondary modules later.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 www.barcelona.cat",
            "urgency": "medium",
            "estimatedSavingsBytes": 158293,
            "strategy": "Serve a smaller placeholder first and load this asset only when the user scrolls to or requests the component.",
            "url": "https://www.barcelona.cat/sites/default/files/styles/distribuidora_central/public/cerques_feina_mercat_laboral_0256.jpg?itok=abQPL1uE",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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.03,
          "displayValue": "7.6 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.6 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 57 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 57 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,
          "displayValue": "Est savings of 81 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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 81 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,
          "displayValue": "Est savings of 2,096 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,096 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 1,770 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 1,770 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,
          "displayValue": "Est savings of 85 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 85 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": "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": 0,
          "displayValue": "Est savings of 1,510 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 Eliminate render-blocking resources\n\n- Lighthouse audit: render-blocking-resources\n- Current value: Est savings of 1,510 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\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": "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,
          "displayValue": "1,522 elements",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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: 1,522 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"
        },
        {
          "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": 0.85,
          "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 Speed Index\n\n- Lighthouse audit: speed-index\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\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": "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,145 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,145 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://barcelona.cat/ca/viure-a-bcn",
      "status": "ok",
      "finalUrl": "https://www.barcelona.cat/ca/viure-a-bcn",
      "performanceScore": 0.64,
      "bestPracticesScore": 1,
      "transferBytes": 2322493,
      "co2Grams": 0.8897038699302,
      "greenWeb": {
        "page": {
          "hostname": "www.barcelona.cat",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-13T22:38:00.231825",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.barcelona.cat",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76425,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "stylesheet",
            "requestCount": 1,
            "transferBytes": 24659,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15565,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7144,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 4110,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/css/bcn-avisos.css",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2860,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "fonts.googleapis.com",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 2459,
            "sampleUrl": "https://fonts.googleapis.com/css?family=Source+Sans+3:200,200i,300,300i,400,400i,500,500i,600,600i,700,700i,900,900i",
            "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
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=kQD5XH&url=https%3A%2F%2Fwww.barcelona.cat%2Fca%2Fviure-a-bcn",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 10,
          "greenCount": 4,
          "notGreenCount": 7,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 60,
        "urgency": "high",
        "pageElementOccurrences": 1,
        "uniqueElementsAssessed": 1,
        "reusedFromCacheCount": 1,
        "components": [
          {
            "signature": "form|get|/ca|input|text|query|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "text",
            "fieldName": "query",
            "formContext": "form|get|/ca",
            "hasLabel": true,
            "hasValidationRule": false,
            "hasErrorMessagingHook": false,
            "toolingFriendly": false,
            "assessment": {
              "score": 60,
              "urgency": "high",
              "issues": [
                "No explicit validation rule",
                "No error messaging hook",
                "Missing autocomplete for tooling support"
              ],
              "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.",
                "Provide meaningful autocomplete values to support browsers and assistive tooling."
              ]
            },
            "reusedFromCache": true
          }
        ],
        "recommendations": [
          {
            "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."
          },
          {
            "title": "Missing autocomplete for tooling support",
            "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": "Viure a la ciutat | Barcelona.cat | Ajuntament de Barcelona",
          "lang": "ca",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "Troba tota la informació i els avantatges de viure a la ciutat de Barcelona, una ciutat que es preocupa del benestar dels seus ciutadans.",
          "robots": "",
          "canonical": "https://www.barcelona.cat/ca/viure-a-bcn",
          "ogTitle": "Viure a BCN",
          "ogDescription": "Connecta amb la ciutat! Descobreix els avantatges de viure en una Barcelona que cuida la seva gent i els serveis que la ciutat ofereix.",
          "ogType": "Web",
          "ogUrl": "https://www.barcelona.cat/ca/viure-a-bcn",
          "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": 32,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 37,
            "oversizedMedia": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 32,
            "oversizedMedia": 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 32 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 59,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": true,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": true,
          "externalScriptCount": 7,
          "externalScriptsWithoutIntegrity": 7,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "cache-control": "max-age=300, public",
            "content-encoding": "gzip",
            "content-language": "ca",
            "content-length": "15901",
            "content-type": "text/html; charset=UTF-8",
            "date": "Mon, 13 Apr 2026 22:42:26 GMT",
            "etag": "\"1776120146-gzip\"",
            "expires": "Sun, 19 Nov 1978 05:00:00 GMT",
            "last-modified": "Mon, 13 Apr 2026 22:42:26 GMT",
            "server": "nginx",
            "vary": "Cookie,Accept-Encoding",
            "via": "1.1 ca2190123e61f1744d1210c24c87c840.cloudfront.net (CloudFront)",
            "x-amz-cf-id": "oc_QFYmrzC0yDOqOb4JIvETJrjSAyRnAW-8Alhx0ndMDxLz6Oxw74A==",
            "x-amz-cf-pop": "IAD12-P5",
            "x-cache": "Miss from cloudfront",
            "x-content-type-options": "nosniff",
            "x-frame-options": "SAMEORIGIN",
            "x-generator": "Drupal 10 (https://www.drupal.org)"
          },
          "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": "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": "7 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 25,
        "urgency": "low",
        "origin": "https://www.barcelona.cat",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://www.barcelona.cat/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/sitemap.xml",
            "found": true,
            "status": 200,
            "contentType": "application/xml; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/manifest.webmanifest",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/favicon.ico",
            "found": true,
            "status": 200,
            "contentType": "image/x-icon"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "low",
            "detail": "Missing beneficial file(s): /.well-known/security.txt, /manifest.webmanifest."
          }
        ]
      },
      "mediaHints": {
        "score": 20,
        "urgency": "low",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 80,
          "imagesWithLazy": 42,
          "imagesWithoutLazy": 38
        },
        "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."
          }
        ]
      },
      "wsgCustom": {
        "score": 85,
        "urgency": "medium",
        "data": {
          "hasPrintStyles": true,
          "hasReducedMotion": true,
          "media": {
            "totalImages": 85,
            "lazyImages": 43,
            "totalIframes": 1,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "\"Source Sans Pro\", \"Helvetica Neue\", Helvetica, Arial, sans-serif",
            "usesSystemFont": true
          },
          "tracking": {
            "count": 0,
            "scripts": []
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 43/85 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": "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"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 100,
        "urgency": "high",
        "totalEstimatedSavingsBytes": 2398585.1999999997,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Use modern image compression formats",
            "urgency": "high",
            "estimatedSavingsBytes": 1347082.1999999997,
            "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": 1051503,
            "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: 1.28 MB."
          },
          {
            "title": "Improve image encoding quality/size",
            "urgency": "high",
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 1.00 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": 2652845.1999999997,
        "totalEstimatedBlockingMs": 1511,
        "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": 1347082.1999999997,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 1,316 KiB",
            "urgency": "high",
            "sourceAuditId": "modern-image-formats"
          },
          {
            "id": "uses-optimized-images",
            "title": "Compress oversized image assets",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss.",
            "estimatedSavingsBytes": 1051503,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 1,027 KiB",
            "urgency": "high",
            "sourceAuditId": "uses-optimized-images"
          },
          {
            "id": "render-blocking-resources",
            "title": "Eliminate render-blocking resources",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering.",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1511,
            "displayValue": "Est savings of 1,510 ms",
            "urgency": "high",
            "sourceAuditId": "render-blocking-resources"
          },
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 116220,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 113 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": 83415,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 81 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-css-rules"
          },
          {
            "id": "unused-javascript",
            "title": "Remove unused JavaScript",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code.",
            "estimatedSavingsBytes": 54625,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 53 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-javascript"
          }
        ],
        "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.28 MB."
          },
          {
            "title": "Compress oversized image assets",
            "urgency": "high",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 1.00 MB."
          },
          {
            "title": "Eliminate render-blocking resources",
            "urgency": "high",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering. Estimated render unblocking: 1511 ms."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "medium",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 113.50 KB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "medium",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 81.46 KB."
          },
          {
            "title": "Remove unused JavaScript",
            "urgency": "medium",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 53.34 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": 10,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 7,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "7 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": 167996.84598463692
        },
        "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: 164.06 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: 164.06 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": 5,
        "urgency": "medium",
        "transferBytes": 2322493,
        "css": {
          "unusedBytes": 83415,
          "ratio": 0.03591614700238063,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 54625,
          "duplicatedBytes": 0,
          "ratio": 0.02351998477498102,
          "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": "high",
            "estimatedSavingsBytes": 83415,
            "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": "medium",
            "estimatedSavingsBytes": 54625,
            "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": 2322493,
        "estimatedDeferrableBytes": 254260,
        "renderBlockingMs": 1511,
        "breakdown": {
          "offscreenImageSavings": 116220,
          "unusedJavascriptSavings": 54625,
          "unusedCssSavings": 83415
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 116220,
            "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": "medium",
            "estimatedSavingsBytes": 54625,
            "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": "high",
            "estimatedSavingsBytes": 83415,
            "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": "Eliminate render-blocking resources",
            "area": "render-path",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1511,
            "strategy": "Defer scripts/styles not required for first paint and preload only truly critical assets.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-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 www.barcelona.cat",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 103822,
            "url": "https://www.barcelona.cat/sites/default/files/styles/distribuidora_banner_menu/public/nens_nenes_paola.jpg?itok=8VB08syh",
            "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": 64,
        "urgency": "high",
        "providerCount": 7,
        "requestCount": 8,
        "transferBytes": 139455,
        "notGreenCount": 5,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76425,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15565,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7144,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2860,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=kQD5XH&url=https%3A%2F%2Fwww.barcelona.cat%2Fca%2Fviure-a-bcn",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "high",
            "detail": "Track 7 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."
          },
          {
            "title": "Prioritize greener alternatives for third-party providers",
            "urgency": "high",
            "detail": "5 third-party script origin(s) are not confirmed green in the Green Web Foundation dataset."
          }
        ]
      },
      "redundancy": {
        "score": 13,
        "urgency": "medium",
        "transferBytes": 2322493,
        "estimatedRedundantBytes": 138040,
        "redundancyRatio": 0.05943613177736166,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 83415,
            "displayValue": "Est savings of 81 KiB"
          },
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 54625,
            "displayValue": "Est savings of 53 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 83415,
            "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 unused javascript",
            "urgency": "medium",
            "estimatedSavingsBytes": 54625,
            "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 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": 13,
        "urgency": "medium",
        "totalTransferBytes": 2322493,
        "heavyRequestCount": 5,
        "heavyBytes": 377670,
        "heavyRatio": 0.16261405308864224,
        "heavyRequests": [
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/distribuidora_banner_menu/public/nens_nenes_paola.jpg?itok=8VB08syh",
            "transferSize": 103822,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "transferSize": 90560,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "transferSize": 76425,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "cdn.matomo.cloud"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament/fonts/icoajuntament.ttf?8aaig7",
            "transferSize": 54921,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/css/css_qDD4BCxE8K-iT7MRORwp32v03DlJblP9-xrYwOBWlQo.css?delta=5&language=ca&theme=barcelonacat_theme&include=eJyFz0FqxTAMBNALxd-LHsiMHTVxcSQjyenP7Wso_FJI6Upi5m0GH4MdB7EnnNXE4vcJ6HXJ0EJNGAWe5CTVupLFqUdwkTb7v0zHRuGs9Pkb-E4HxSzi5oqeysp34B1crizPu25rktGC-dUqb3eiFgl47boTJmNmycCW3v4DXWXJhdNkivj6Ej2dlNGWDsU21-wWVx0d7fGTPAb3kVu1ndbFLnM6YobRF2idlFA&tcut5n",
            "transferSize": 51942,
            "resourceType": "stylesheet",
            "mimeType": "text/css",
            "domain": "www.barcelona.cat"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "font",
            "count": 2,
            "transferBytes": 145481
          },
          {
            "resourceType": "image",
            "count": 1,
            "transferBytes": 103822
          },
          {
            "resourceType": "script",
            "count": 1,
            "transferBytes": 76425
          },
          {
            "resourceType": "stylesheet",
            "count": 1,
            "transferBytes": 51942
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.barcelona.cat",
            "count": 4,
            "transferBytes": 301245
          },
          {
            "domain": "cdn.matomo.cloud",
            "count": 1,
            "transferBytes": 76425
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Lazy-load offscreen images and media galleries",
            "urgency": "medium",
            "estimatedSavingsBytes": 116220,
            "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": "medium",
            "estimatedSavingsBytes": 54625,
            "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": "Defer non-critical UI modules until after first render",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "strategy": "Keep only above-the-fold resources in the initial path; hydrate or import secondary modules later.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 www.barcelona.cat",
            "urgency": "medium",
            "estimatedSavingsBytes": 103822,
            "strategy": "Serve a smaller placeholder first and load this asset only when the user scrolls to or requests the component.",
            "url": "https://www.barcelona.cat/sites/default/files/styles/distribuidora_banner_menu/public/nens_nenes_paola.jpg?itok=8VB08syh",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 www.barcelona.cat",
            "urgency": "medium",
            "estimatedSavingsBytes": 90560,
            "strategy": "Subset or defer this font so full font payloads are only fetched when needed.",
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 cdn.matomo.cloud",
            "urgency": "medium",
            "estimatedSavingsBytes": 76425,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.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.02,
          "displayValue": "8.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: 8.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 53 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 53 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,
          "displayValue": "Est savings of 81 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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 81 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,
          "displayValue": "Est savings of 1,316 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,316 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 1,027 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 1,027 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": "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": 0,
          "displayValue": "Est savings of 1,510 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 Eliminate render-blocking resources\n\n- Lighthouse audit: render-blocking-resources\n- Current value: Est savings of 1,510 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\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": "server-response-time",
          "title": "Reduce initial server response time",
          "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": 0,
          "displayValue": "Root document took 620 ms",
          "impact": "high",
          "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 Reduce initial server response time\n\n- Lighthouse audit: server-response-time\n- Current value: Root document took 620 ms\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": "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": 0.86,
          "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 Speed Index\n\n- Lighthouse audit: speed-index\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\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": "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 113 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 113 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": "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": "1,433 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: 1,433 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://barcelona.cat/en/catalan-national-day-2022",
      "status": "ok",
      "finalUrl": "https://www.barcelona.cat/en/catalan-national-day-2022",
      "performanceScore": 0.64,
      "bestPracticesScore": 1,
      "transferBytes": 828667,
      "co2Grams": 0.3174469144938001,
      "greenWeb": {
        "page": {
          "hostname": "www.barcelona.cat",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-13T22:38:00.231825",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.barcelona.cat",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76425,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31745,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "stylesheet",
            "requestCount": 1,
            "transferBytes": 24659,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15565,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7143,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5656,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 4110,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/css/bcn-avisos.css",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "fonts.googleapis.com",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 2461,
            "sampleUrl": "https://fonts.googleapis.com/css?family=Source+Sans+3:200,200i,300,300i,400,400i,500,500i,600,600i,700,700i,900,900i",
            "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
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=huVL5I&url=https%3A%2F%2Fwww.barcelona.cat%2Fen%2Fcatalan-national-day-2022",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 10,
          "greenCount": 4,
          "notGreenCount": 7,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 60,
        "urgency": "high",
        "pageElementOccurrences": 1,
        "uniqueElementsAssessed": 1,
        "reusedFromCacheCount": 1,
        "components": [
          {
            "signature": "form|get|/en|input|text|query|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "text",
            "fieldName": "query",
            "formContext": "form|get|/en",
            "hasLabel": true,
            "hasValidationRule": false,
            "hasErrorMessagingHook": false,
            "toolingFriendly": false,
            "assessment": {
              "score": 60,
              "urgency": "high",
              "issues": [
                "No explicit validation rule",
                "No error messaging hook",
                "Missing autocomplete for tooling support"
              ],
              "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.",
                "Provide meaningful autocomplete values to support browsers and assistive tooling."
              ]
            },
            "reusedFromCache": true
          }
        ],
        "recommendations": [
          {
            "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."
          },
          {
            "title": "Missing autocomplete for tooling support",
            "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": "Diada 2022 | Barcelona website | Barcelona City Council",
          "lang": "en",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "Ceremonies, activities, open days, demonstrations, disruptions to public transport and mobility recommendations in Barcelona for Catalan National Day on 11 September.",
          "robots": "",
          "canonical": "https://www.barcelona.cat/en/catalan-national-day-2022",
          "ogTitle": "Diada 2022 | Barcelona website | Barcelona City Council",
          "ogDescription": "Ceremonies, activities, open days, demonstrations, disruptions to public transport and mobility recommendations in Barcelona for Catalan National Day on 11 September.",
          "ogType": "Web",
          "ogUrl": "https://www.barcelona.cat/en/catalan-national-day-2022",
          "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": 33,
          "tabletSmallTapTargets": 31,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 33,
            "oversizedMedia": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 31,
            "oversizedMedia": 0
          }
        ],
        "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 31 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 59,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": true,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": true,
          "externalScriptCount": 7,
          "externalScriptsWithoutIntegrity": 7,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "cache-control": "max-age=300, public",
            "content-encoding": "gzip",
            "content-language": "en",
            "content-length": "9733",
            "content-type": "text/html; charset=UTF-8",
            "date": "Mon, 13 Apr 2026 22:42:41 GMT",
            "etag": "\"1776120160-gzip\"",
            "expires": "Sun, 19 Nov 1978 05:00:00 GMT",
            "last-modified": "Mon, 13 Apr 2026 22:42:40 GMT",
            "server": "nginx",
            "vary": "Cookie,Accept-Encoding",
            "via": "1.1 ca2190123e61f1744d1210c24c87c840.cloudfront.net (CloudFront)",
            "x-amz-cf-id": "ht5mpS9mwzEr6DLgClzmOCpksGLf58XJae6EIy4DlsFalJT0A09XHw==",
            "x-amz-cf-pop": "IAD12-P5",
            "x-cache": "Miss from cloudfront",
            "x-content-type-options": "nosniff",
            "x-frame-options": "SAMEORIGIN",
            "x-generator": "Drupal 10 (https://www.drupal.org)"
          },
          "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": "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": "7 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 25,
        "urgency": "low",
        "origin": "https://www.barcelona.cat",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://www.barcelona.cat/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/sitemap.xml",
            "found": true,
            "status": 200,
            "contentType": "application/xml; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/manifest.webmanifest",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/favicon.ico",
            "found": true,
            "status": 200,
            "contentType": "image/x-icon"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "low",
            "detail": "Missing beneficial file(s): /.well-known/security.txt, /manifest.webmanifest."
          }
        ]
      },
      "mediaHints": {
        "score": 45,
        "urgency": "medium",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 12,
          "imagesWithLazy": 1,
          "imagesWithoutLazy": 11
        },
        "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": "11 of 12 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 85,
        "urgency": "medium",
        "data": {
          "hasPrintStyles": true,
          "hasReducedMotion": true,
          "media": {
            "totalImages": 17,
            "lazyImages": 2,
            "totalIframes": 1,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "\"Source Sans Pro\", \"Helvetica Neue\", Helvetica, Arial, sans-serif",
            "usesSystemFont": true
          },
          "tracking": {
            "count": 0,
            "scripts": []
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 2/17 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": "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"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 22,
        "urgency": "low",
        "totalEstimatedSavingsBytes": 183802.25,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Use modern image compression formats",
            "urgency": "medium",
            "estimatedSavingsBytes": 125770.25,
            "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size."
          },
          {
            "id": "uses-optimized-images",
            "title": "Improve image encoding quality/size",
            "urgency": "medium",
            "estimatedSavingsBytes": 58032,
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings."
          }
        ],
        "recommendations": [
          {
            "title": "Use modern image compression formats",
            "urgency": "medium",
            "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size. Estimated savings: 122.82 KB."
          },
          {
            "title": "Improve image encoding quality/size",
            "urgency": "medium",
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 56.67 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": 385265.25,
        "totalEstimatedBlockingMs": 900,
        "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": 125770.25,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 123 KiB",
            "urgency": "medium",
            "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": 87109,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 85 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": 81873,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 80 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-css-rules"
          },
          {
            "id": "uses-optimized-images",
            "title": "Compress oversized image assets",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss.",
            "estimatedSavingsBytes": 58032,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 57 KiB",
            "urgency": "medium",
            "sourceAuditId": "uses-optimized-images"
          },
          {
            "id": "render-blocking-resources",
            "title": "Eliminate render-blocking resources",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering.",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 900,
            "displayValue": "Est savings of 900 ms",
            "urgency": "medium",
            "sourceAuditId": "render-blocking-resources"
          },
          {
            "id": "unused-javascript",
            "title": "Remove unused JavaScript",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code.",
            "estimatedSavingsBytes": 32481,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 32 KiB",
            "urgency": "low",
            "sourceAuditId": "unused-javascript"
          }
        ],
        "recommendations": [
          {
            "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: 122.82 KB."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "medium",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 85.07 KB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "medium",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 79.95 KB."
          },
          {
            "title": "Compress oversized image assets",
            "urgency": "medium",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 56.67 KB."
          },
          {
            "title": "Eliminate render-blocking resources",
            "urgency": "medium",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering. Estimated render unblocking: 900 ms."
          },
          {
            "title": "Remove unused JavaScript",
            "urgency": "low",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 31.72 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": 10,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 7,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "7 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": 167994.00223463686
        },
        "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: 164.06 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: 164.06 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": "medium",
        "transferBytes": 828667,
        "css": {
          "unusedBytes": 81873,
          "ratio": 0.0988008452128539,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 32481,
          "duplicatedBytes": 0,
          "ratio": 0.039196685761590605,
          "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": "high",
            "estimatedSavingsBytes": 81873,
            "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": "medium",
            "estimatedSavingsBytes": 32481,
            "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": 16,
        "urgency": "medium",
        "transferBytes": 828667,
        "estimatedDeferrableBytes": 201463,
        "renderBlockingMs": 900,
        "breakdown": {
          "offscreenImageSavings": 87109,
          "unusedJavascriptSavings": 32481,
          "unusedCssSavings": 81873
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 87109,
            "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": "medium",
            "estimatedSavingsBytes": 32481,
            "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": 81873,
            "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": "Eliminate render-blocking resources",
            "area": "render-path",
            "urgency": "medium",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 900,
            "strategy": "Defer scripts/styles not required for first paint and preload only truly critical assets.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-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 www.barcelona.cat",
            "area": "font",
            "urgency": "medium",
            "estimatedSavingsBytes": 90560,
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "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 www.barcelona.cat",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 84136,
            "url": "https://www.barcelona.cat/themes/barcelonacat_theme/images/menu/viula.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 cdn.matomo.cloud",
            "area": "script",
            "urgency": "medium",
            "estimatedSavingsBytes": 76425,
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.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": 64,
        "urgency": "high",
        "providerCount": 7,
        "requestCount": 8,
        "transferBytes": 139664,
        "notGreenCount": 5,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76425,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31745,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15565,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7143,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5656,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=huVL5I&url=https%3A%2F%2Fwww.barcelona.cat%2Fen%2Fcatalan-national-day-2022",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "high",
            "detail": "Track 7 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."
          },
          {
            "title": "Prioritize greener alternatives for third-party providers",
            "urgency": "high",
            "detail": "5 third-party script origin(s) are not confirmed green in the Green Web Foundation dataset."
          }
        ]
      },
      "redundancy": {
        "score": 18,
        "urgency": "low",
        "transferBytes": 828667,
        "estimatedRedundantBytes": 114354,
        "redundancyRatio": 0.1379975309744445,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 81873,
            "displayValue": "Est savings of 80 KiB"
          },
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 32481,
            "displayValue": "Est savings of 32 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 81873,
            "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 unused javascript",
            "urgency": "medium",
            "estimatedSavingsBytes": 32481,
            "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 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": 20,
        "urgency": "medium",
        "totalTransferBytes": 828667,
        "heavyRequestCount": 4,
        "heavyBytes": 271011,
        "heavyRatio": 0.3270445184857126,
        "heavyRequests": [
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "transferSize": 90560,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "transferSize": 76425,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "cdn.matomo.cloud"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament/fonts/icoajuntament.ttf?8aaig7",
            "transferSize": 54920,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/css/css_evpTRQTawGYS1Ro7RbXq3hBxwat7AU-RJm1V8ZgzeaE.css?delta=5&language=en&theme=barcelonacat_theme&include=eJyFzkEKwzAMBMAPxfjQB5m1I1IXRzKSkja_r6EQKKT0pGV3DsJjY8dK7Al7NbH4OQG9ThlaqAmjwJPspFpnsjj0Flykjf2X6Vgo7JWe38DvtFLMIm6u6KnMfAWWJhktmB-t8nIlapGA8_crYbKNLhnY0u0f6CpTLpwGU8QzJXo5KaNNdpjTGjOM3gg5eRY&tcut5n",
            "transferSize": 49106,
            "resourceType": "stylesheet",
            "mimeType": "text/css",
            "domain": "www.barcelona.cat"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "font",
            "count": 2,
            "transferBytes": 145480
          },
          {
            "resourceType": "script",
            "count": 1,
            "transferBytes": 76425
          },
          {
            "resourceType": "stylesheet",
            "count": 1,
            "transferBytes": 49106
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.barcelona.cat",
            "count": 3,
            "transferBytes": 194586
          },
          {
            "domain": "cdn.matomo.cloud",
            "count": 1,
            "transferBytes": 76425
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Lazy-load offscreen images and media galleries",
            "urgency": "medium",
            "estimatedSavingsBytes": 87109,
            "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": "Defer non-critical UI modules until after first render",
            "urgency": "medium",
            "estimatedSavingsBytes": 0,
            "strategy": "Keep only above-the-fold resources in the initial path; hydrate or import secondary modules later.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 www.barcelona.cat",
            "urgency": "medium",
            "estimatedSavingsBytes": 90560,
            "strategy": "Subset or defer this font so full font payloads are only fetched when needed.",
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 cdn.matomo.cloud",
            "urgency": "medium",
            "estimatedSavingsBytes": 76425,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.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.01,
          "displayValue": "8.6 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: 8.6 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 32 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 32 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,
          "displayValue": "Est savings of 80 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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 80 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,
          "displayValue": "Est savings of 123 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 123 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 85 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 85 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": "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": 0,
          "displayValue": "Est savings of 900 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 Eliminate render-blocking resources\n\n- Lighthouse audit: render-blocking-resources\n- Current value: Est savings of 900 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\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": "server-response-time",
          "title": "Reduce initial server response time",
          "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": 0,
          "displayValue": "Root document took 650 ms",
          "impact": "high",
          "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 Reduce initial server response time\n\n- Lighthouse audit: server-response-time\n- Current value: Root document took 650 ms\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": "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": 0.78,
          "displayValue": "4.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 Speed Index\n\n- Lighthouse audit: speed-index\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\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": "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 57 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 57 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": "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": "893 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: 893 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://barcelona.cat/en/discoverbcn",
      "status": "ok",
      "finalUrl": "https://www.barcelona.cat/en/discoverbcn",
      "performanceScore": 0.66,
      "bestPracticesScore": 1,
      "transferBytes": 1956574,
      "co2Grams": 0.7495271071236,
      "greenWeb": {
        "page": {
          "hostname": "www.barcelona.cat",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-13T22:38:00.231825",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.barcelona.cat",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76426,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "stylesheet",
            "requestCount": 1,
            "transferBytes": 24654,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15565,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7146,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 4111,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/css/bcn-avisos.css",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "fonts.googleapis.com",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 2463,
            "sampleUrl": "https://fonts.googleapis.com/css?family=Source+Sans+3:200,200i,300,300i,400,400i,500,500i,600,600i,700,700i,900,900i",
            "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
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=yAxckU&url=https%3A%2F%2Fwww.barcelona.cat%2Fen%2Fdiscoverbcn",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 10,
          "greenCount": 4,
          "notGreenCount": 7,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 60,
        "urgency": "high",
        "pageElementOccurrences": 1,
        "uniqueElementsAssessed": 1,
        "reusedFromCacheCount": 1,
        "components": [
          {
            "signature": "form|get|/en|input|text|query|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "text",
            "fieldName": "query",
            "formContext": "form|get|/en",
            "hasLabel": true,
            "hasValidationRule": false,
            "hasErrorMessagingHook": false,
            "toolingFriendly": false,
            "assessment": {
              "score": 60,
              "urgency": "high",
              "issues": [
                "No explicit validation rule",
                "No error messaging hook",
                "Missing autocomplete for tooling support"
              ],
              "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.",
                "Provide meaningful autocomplete values to support browsers and assistive tooling."
              ]
            },
            "reusedFromCache": true
          }
        ],
        "recommendations": [
          {
            "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."
          },
          {
            "title": "Missing autocomplete for tooling support",
            "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": "Discover Barcelona | Barcelona.cat | Barcelona City Council",
          "lang": "en",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "Discover the history of Barcelona, its points of interest, popular culture and the most emblematic places in your city.",
          "robots": "",
          "canonical": "https://www.barcelona.cat/en/discoverbcn",
          "ogTitle": "Discover Barcelona",
          "ogDescription": "Want to discover Barcelona? Explore the city’s folk culture, memory and traditions.",
          "ogType": "Web",
          "ogUrl": "https://www.barcelona.cat/en/discoverbcn",
          "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": 38,
          "tabletSmallTapTargets": 33,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 38,
            "oversizedMedia": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 33,
            "oversizedMedia": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 38 small targets on mobile and 33 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 59,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": true,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": true,
          "externalScriptCount": 7,
          "externalScriptsWithoutIntegrity": 7,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "cache-control": "max-age=300, public",
            "content-encoding": "gzip",
            "content-language": "en",
            "content-length": "12122",
            "content-type": "text/html; charset=UTF-8",
            "date": "Mon, 13 Apr 2026 22:42:54 GMT",
            "etag": "\"1776120173-gzip\"",
            "expires": "Sun, 19 Nov 1978 05:00:00 GMT",
            "last-modified": "Mon, 13 Apr 2026 22:42:53 GMT",
            "server": "nginx",
            "vary": "Cookie,Accept-Encoding",
            "via": "1.1 ca2190123e61f1744d1210c24c87c840.cloudfront.net (CloudFront)",
            "x-amz-cf-id": "PeuhhhQvF_HDXD_RUkRPyMips97Nmmthqy7gx7VCiouUDDdLDkn6Ww==",
            "x-amz-cf-pop": "IAD12-P5",
            "x-cache": "Miss from cloudfront",
            "x-content-type-options": "nosniff",
            "x-frame-options": "SAMEORIGIN",
            "x-generator": "Drupal 10 (https://www.drupal.org)"
          },
          "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": "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": "7 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 25,
        "urgency": "low",
        "origin": "https://www.barcelona.cat",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://www.barcelona.cat/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/sitemap.xml",
            "found": true,
            "status": 200,
            "contentType": "application/xml; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/manifest.webmanifest",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/favicon.ico",
            "found": true,
            "status": 200,
            "contentType": "image/x-icon"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "low",
            "detail": "Missing beneficial file(s): /.well-known/security.txt, /manifest.webmanifest."
          }
        ]
      },
      "mediaHints": {
        "score": 27,
        "urgency": "low",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 37,
          "imagesWithLazy": 14,
          "imagesWithoutLazy": 23
        },
        "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": "23 of 37 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 85,
        "urgency": "medium",
        "data": {
          "hasPrintStyles": true,
          "hasReducedMotion": true,
          "media": {
            "totalImages": 42,
            "lazyImages": 15,
            "totalIframes": 1,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "\"Source Sans Pro\", \"Helvetica Neue\", Helvetica, Arial, sans-serif",
            "usesSystemFont": true
          },
          "tracking": {
            "count": 0,
            "scripts": []
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 15/42 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": "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"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 97,
        "urgency": "high",
        "totalEstimatedSavingsBytes": 1889839.6500000001,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Use modern image compression formats",
            "urgency": "high",
            "estimatedSavingsBytes": 1037339.6500000001,
            "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": 852500,
            "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: 1013.03 KB."
          },
          {
            "title": "Improve image encoding quality/size",
            "urgency": "high",
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 832.52 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": 2115221.6500000004,
        "totalEstimatedBlockingMs": 1637,
        "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": 1037339.6500000001,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 1,013 KiB",
            "urgency": "high",
            "sourceAuditId": "modern-image-formats"
          },
          {
            "id": "uses-optimized-images",
            "title": "Compress oversized image assets",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss.",
            "estimatedSavingsBytes": 852500,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 833 KiB",
            "urgency": "high",
            "sourceAuditId": "uses-optimized-images"
          },
          {
            "id": "render-blocking-resources",
            "title": "Eliminate render-blocking resources",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering.",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1637,
            "displayValue": "Est savings of 1,640 ms",
            "urgency": "high",
            "sourceAuditId": "render-blocking-resources"
          },
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 87108,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 85 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": 83649,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 82 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-css-rules"
          },
          {
            "id": "unused-javascript",
            "title": "Remove unused JavaScript",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code.",
            "estimatedSavingsBytes": 54625,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 53 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-javascript"
          }
        ],
        "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: 1013.03 KB."
          },
          {
            "title": "Compress oversized image assets",
            "urgency": "high",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 832.52 KB."
          },
          {
            "title": "Eliminate render-blocking resources",
            "urgency": "high",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering. Estimated render unblocking: 1637 ms."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "medium",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 85.07 KB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "medium",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 81.69 KB."
          },
          {
            "title": "Remove unused JavaScript",
            "urgency": "medium",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 53.34 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": 10,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 7,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "7 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": 167992.62695530726
        },
        "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: 164.06 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: 164.06 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": 5,
        "urgency": "medium",
        "transferBytes": 1956574,
        "css": {
          "unusedBytes": 83649,
          "ratio": 0.04275279135877304,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 54625,
          "duplicatedBytes": 0,
          "ratio": 0.02791869870498126,
          "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": "high",
            "estimatedSavingsBytes": 83649,
            "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": "medium",
            "estimatedSavingsBytes": 54625,
            "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": 1956574,
        "estimatedDeferrableBytes": 225382,
        "renderBlockingMs": 1637,
        "breakdown": {
          "offscreenImageSavings": 87108,
          "unusedJavascriptSavings": 54625,
          "unusedCssSavings": 83649
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 87108,
            "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": "medium",
            "estimatedSavingsBytes": 54625,
            "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": "high",
            "estimatedSavingsBytes": 83649,
            "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": "Eliminate render-blocking resources",
            "area": "render-path",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1637,
            "strategy": "Defer scripts/styles not required for first paint and preload only truly critical assets.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-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 www.barcelona.cat",
            "area": "image",
            "urgency": "high",
            "estimatedSavingsBytes": 261365,
            "url": "https://www.barcelona.cat/sites/default/files/styles/destacat_gran/public/destacat-cultura%20popular4071.jpg?itok=cA32eUx7",
            "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": 64,
        "urgency": "high",
        "providerCount": 7,
        "requestCount": 8,
        "transferBytes": 139459,
        "notGreenCount": 5,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76426,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15565,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7146,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=yAxckU&url=https%3A%2F%2Fwww.barcelona.cat%2Fen%2Fdiscoverbcn",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "high",
            "detail": "Track 7 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."
          },
          {
            "title": "Prioritize greener alternatives for third-party providers",
            "urgency": "high",
            "detail": "5 third-party script origin(s) are not confirmed green in the Green Web Foundation dataset."
          }
        ]
      },
      "redundancy": {
        "score": 14,
        "urgency": "medium",
        "transferBytes": 1956574,
        "estimatedRedundantBytes": 138274,
        "redundancyRatio": 0.0706714900637543,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 83649,
            "displayValue": "Est savings of 82 KiB"
          },
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 54625,
            "displayValue": "Est savings of 53 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 83649,
            "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 unused javascript",
            "urgency": "medium",
            "estimatedSavingsBytes": 54625,
            "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 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": 34,
        "urgency": "high",
        "totalTransferBytes": 1956574,
        "heavyRequestCount": 9,
        "heavyBytes": 1128111,
        "heavyRatio": 0.5765746657167069,
        "heavyRequests": [
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/destacat_gran/public/destacat-cultura%20popular4071.jpg?itok=cA32eUx7",
            "transferSize": 261365,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/destacat_gran/public/dues-nenes-conversen-assegudes-als-bancs_528x228px_1.jpg?itok=KK65rUY_",
            "transferSize": 181456,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/destacat_gran/public/biblioteca2_528x228.jpg?itok=M55yvOgb",
            "transferSize": 156169,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/destacat_gran/public/llibreria_528x228_1.jpg?itok=p3R2bHNi",
            "transferSize": 142296,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/distribuidora_banner_menu/public/memoria_tradicio.jpg?itok=j2Tlac4l",
            "transferSize": 112984,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "transferSize": 90559,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "transferSize": 76426,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "cdn.matomo.cloud"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament/fonts/icoajuntament.ttf?8aaig7",
            "transferSize": 54919,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/css/css_qDD4BCxE8K-iT7MRORwp32v03DlJblP9-xrYwOBWlQo.css?delta=5&language=en&theme=barcelonacat_theme&include=eJyFz0FqxTAMBNALxd-LHsiMHTVxcSQjyenP7Wso_FJI6Upi5m0GH4MdB7EnnNXE4vcJ6HXJ0EJNGAWe5CTVupLFqUdwkTb7v0zHRuGs9Pkb-E4HxSzi5oqeysp34B1crizPu25rktGC-dUqb3eiFgl47boTJmNmycCW3v4DXWXJhdNkivj6Ej2dlNGWDsU21-wWVx0d7fGTPAb3kVu1ndbFLnM6YobRF2idlFA&tcut5n",
            "transferSize": 51937,
            "resourceType": "stylesheet",
            "mimeType": "text/css",
            "domain": "www.barcelona.cat"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "image",
            "count": 5,
            "transferBytes": 854270
          },
          {
            "resourceType": "font",
            "count": 2,
            "transferBytes": 145478
          },
          {
            "resourceType": "script",
            "count": 1,
            "transferBytes": 76426
          },
          {
            "resourceType": "stylesheet",
            "count": 1,
            "transferBytes": 51937
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.barcelona.cat",
            "count": 8,
            "transferBytes": 1051685
          },
          {
            "domain": "cdn.matomo.cloud",
            "count": 1,
            "transferBytes": 76426
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Lazy-load offscreen images and media galleries",
            "urgency": "medium",
            "estimatedSavingsBytes": 87108,
            "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": "medium",
            "estimatedSavingsBytes": 54625,
            "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": "Defer non-critical UI modules until after first render",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "strategy": "Keep only above-the-fold resources in the initial path; hydrate or import secondary modules later.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 www.barcelona.cat",
            "urgency": "medium",
            "estimatedSavingsBytes": 261365,
            "strategy": "Serve a smaller placeholder first and load this asset only when the user scrolls to or requests the component.",
            "url": "https://www.barcelona.cat/sites/default/files/styles/destacat_gran/public/destacat-cultura%20popular4071.jpg?itok=cA32eUx7",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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.02,
          "displayValue": "8.0 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: 8.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,
          "displayValue": "Est savings of 53 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 53 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,
          "displayValue": "Est savings of 82 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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 82 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,
          "displayValue": "Est savings of 1,013 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,013 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 833 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 833 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,
          "displayValue": "Est savings of 85 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 85 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": "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": 0,
          "displayValue": "Est savings of 1,640 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 Eliminate render-blocking resources\n\n- Lighthouse audit: render-blocking-resources\n- Current value: Est savings of 1,640 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\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": "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": 0.81,
          "displayValue": "4.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 Speed Index\n\n- Lighthouse audit: speed-index\n- Current value: 4.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\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": "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": "1,058 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: 1,058 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://barcelona.cat/en/getinvolved",
      "status": "ok",
      "finalUrl": "https://www.barcelona.cat/en/getinvolved",
      "performanceScore": 0.69,
      "bestPracticesScore": 1,
      "transferBytes": 1748335,
      "co2Grams": 0.669754619469,
      "greenWeb": {
        "page": {
          "hostname": "www.barcelona.cat",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-13T22:38:00.231825",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.barcelona.cat",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76426,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "stylesheet",
            "requestCount": 1,
            "transferBytes": 24654,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15566,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7146,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 4112,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/css/bcn-avisos.css",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "fonts.googleapis.com",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 2461,
            "sampleUrl": "https://fonts.googleapis.com/css?family=Source+Sans+3:200,200i,300,300i,400,400i,500,500i,600,600i,700,700i,900,900i",
            "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
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=5zXDhz&url=https%3A%2F%2Fwww.barcelona.cat%2Fen%2Fgetinvolved",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 10,
          "greenCount": 4,
          "notGreenCount": 7,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 60,
        "urgency": "high",
        "pageElementOccurrences": 1,
        "uniqueElementsAssessed": 1,
        "reusedFromCacheCount": 1,
        "components": [
          {
            "signature": "form|get|/en|input|text|query|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "text",
            "fieldName": "query",
            "formContext": "form|get|/en",
            "hasLabel": true,
            "hasValidationRule": false,
            "hasErrorMessagingHook": false,
            "toolingFriendly": false,
            "assessment": {
              "score": 60,
              "urgency": "high",
              "issues": [
                "No explicit validation rule",
                "No error messaging hook",
                "Missing autocomplete for tooling support"
              ],
              "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.",
                "Provide meaningful autocomplete values to support browsers and assistive tooling."
              ]
            },
            "reusedFromCache": true
          }
        ],
        "recommendations": [
          {
            "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."
          },
          {
            "title": "Missing autocomplete for tooling support",
            "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": "Get involved | Barcelona.cat | Barcelona City Council",
          "lang": "en",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "Learn about the innovation and participation projects that are transforming Barcelona. Get involved and help to make the city better for everyone.",
          "robots": "",
          "canonical": "https://www.barcelona.cat/en/getinvolved",
          "ogTitle": "Get involved",
          "ogDescription": "Your participation is Barcelona’s driving force. Learn how to get involved in innovation projects that aim to improve the quality of life in our city.",
          "ogType": "Web",
          "ogUrl": "https://www.barcelona.cat/en/getinvolved",
          "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": 46,
          "tabletSmallTapTargets": 43,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 46,
            "oversizedMedia": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 43,
            "oversizedMedia": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 46 small targets on mobile and 43 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 59,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": true,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": true,
          "externalScriptCount": 7,
          "externalScriptsWithoutIntegrity": 7,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "cache-control": "max-age=300, public",
            "content-encoding": "gzip",
            "content-language": "en",
            "content-length": "17839",
            "content-type": "text/html; charset=UTF-8",
            "date": "Mon, 13 Apr 2026 22:43:07 GMT",
            "etag": "\"1776120187-gzip\"",
            "expires": "Sun, 19 Nov 1978 05:00:00 GMT",
            "last-modified": "Mon, 13 Apr 2026 22:43:07 GMT",
            "server": "nginx",
            "vary": "Cookie,Accept-Encoding",
            "via": "1.1 ca2190123e61f1744d1210c24c87c840.cloudfront.net (CloudFront)",
            "x-amz-cf-id": "DNsnvxOboR01DboLkMn6EMXwbTIz1QYHTtv6tEt-gSoQgAxj0QgnCg==",
            "x-amz-cf-pop": "IAD12-P5",
            "x-cache": "Miss from cloudfront",
            "x-content-type-options": "nosniff",
            "x-frame-options": "SAMEORIGIN",
            "x-generator": "Drupal 10 (https://www.drupal.org)"
          },
          "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": "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": "7 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 25,
        "urgency": "low",
        "origin": "https://www.barcelona.cat",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://www.barcelona.cat/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/sitemap.xml",
            "found": true,
            "status": 200,
            "contentType": "application/xml; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/manifest.webmanifest",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/favicon.ico",
            "found": true,
            "status": 200,
            "contentType": "image/x-icon"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "low",
            "detail": "Missing beneficial file(s): /.well-known/security.txt, /manifest.webmanifest."
          }
        ]
      },
      "mediaHints": {
        "score": 20,
        "urgency": "low",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 65,
          "imagesWithLazy": 53,
          "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."
          }
        ]
      },
      "wsgCustom": {
        "score": 85,
        "urgency": "medium",
        "data": {
          "hasPrintStyles": true,
          "hasReducedMotion": true,
          "media": {
            "totalImages": 70,
            "lazyImages": 54,
            "totalIframes": 1,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "\"Source Sans Pro\", \"Helvetica Neue\", Helvetica, Arial, sans-serif",
            "usesSystemFont": true
          },
          "tracking": {
            "count": 0,
            "scripts": []
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 54/70 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": "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"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 92,
        "urgency": "high",
        "totalEstimatedSavingsBytes": 1608635.85,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Use modern image compression formats",
            "urgency": "high",
            "estimatedSavingsBytes": 880657.8500000001,
            "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": 727978,
            "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: 860.02 KB."
          },
          {
            "title": "Improve image encoding quality/size",
            "urgency": "high",
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 710.92 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": 1851148.85,
        "totalEstimatedBlockingMs": 1465,
        "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": 880657.8500000001,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 860 KiB",
            "urgency": "high",
            "sourceAuditId": "modern-image-formats"
          },
          {
            "id": "uses-optimized-images",
            "title": "Compress oversized image assets",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss.",
            "estimatedSavingsBytes": 727978,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 711 KiB",
            "urgency": "high",
            "sourceAuditId": "uses-optimized-images"
          },
          {
            "id": "render-blocking-resources",
            "title": "Eliminate render-blocking resources",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering.",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1465,
            "displayValue": "Est savings of 1,470 ms",
            "urgency": "high",
            "sourceAuditId": "render-blocking-resources"
          },
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 94774,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 93 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": 83335,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 81 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-css-rules"
          },
          {
            "id": "unused-javascript",
            "title": "Remove unused JavaScript",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code.",
            "estimatedSavingsBytes": 64404,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 63 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-javascript"
          }
        ],
        "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: 860.02 KB."
          },
          {
            "title": "Compress oversized image assets",
            "urgency": "high",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 710.92 KB."
          },
          {
            "title": "Eliminate render-blocking resources",
            "urgency": "high",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering. Estimated render unblocking: 1465 ms."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "medium",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 92.55 KB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "medium",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 81.38 KB."
          },
          {
            "title": "Remove unused JavaScript",
            "urgency": "medium",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 62.89 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": 10,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 7,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "7 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": 167994.8832053073
        },
        "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: 164.06 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: 164.06 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": 6,
        "urgency": "medium",
        "transferBytes": 1748335,
        "css": {
          "unusedBytes": 83335,
          "ratio": 0.04766535017602462,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 64404,
          "duplicatedBytes": 0,
          "ratio": 0.03683733380616415,
          "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": "high",
            "estimatedSavingsBytes": 83335,
            "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": "medium",
            "estimatedSavingsBytes": 64404,
            "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": 1748335,
        "estimatedDeferrableBytes": 242513,
        "renderBlockingMs": 1465,
        "breakdown": {
          "offscreenImageSavings": 94774,
          "unusedJavascriptSavings": 64404,
          "unusedCssSavings": 83335
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 94774,
            "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": "medium",
            "estimatedSavingsBytes": 64404,
            "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": "high",
            "estimatedSavingsBytes": 83335,
            "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": "Eliminate render-blocking resources",
            "area": "render-path",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1465,
            "strategy": "Defer scripts/styles not required for first paint and preload only truly critical assets.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-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 www.barcelona.cat",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 113438,
            "url": "https://www.barcelona.cat/sites/default/files/styles/destacat_petit/public/foment_de_ciutat_ess_ocupacio_barris_252x228_2.jpg?itok=ldQk8PO-",
            "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 www.barcelona.cat",
            "area": "font",
            "urgency": "medium",
            "estimatedSavingsBytes": 90559,
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "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": 64,
        "urgency": "high",
        "providerCount": 7,
        "requestCount": 8,
        "transferBytes": 139460,
        "notGreenCount": 5,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76426,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15566,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7146,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=5zXDhz&url=https%3A%2F%2Fwww.barcelona.cat%2Fen%2Fgetinvolved",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "high",
            "detail": "Track 7 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."
          },
          {
            "title": "Prioritize greener alternatives for third-party providers",
            "urgency": "high",
            "detail": "5 third-party script origin(s) are not confirmed green in the Green Web Foundation dataset."
          }
        ]
      },
      "redundancy": {
        "score": 15,
        "urgency": "medium",
        "transferBytes": 1748335,
        "estimatedRedundantBytes": 147739,
        "redundancyRatio": 0.08450268398218877,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 83335,
            "displayValue": "Est savings of 81 KiB"
          },
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 64404,
            "displayValue": "Est savings of 63 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 83335,
            "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 unused javascript",
            "urgency": "medium",
            "estimatedSavingsBytes": 64404,
            "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 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": 16,
        "urgency": "medium",
        "totalTransferBytes": 1748335,
        "heavyRequestCount": 5,
        "heavyBytes": 387294,
        "heavyRatio": 0.22152161914049653,
        "heavyRequests": [
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/destacat_petit/public/foment_de_ciutat_ess_ocupacio_barris_252x228_2.jpg?itok=ldQk8PO-",
            "transferSize": 113438,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "transferSize": 90559,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "transferSize": 76426,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "cdn.matomo.cloud"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament/fonts/icoajuntament.ttf?8aaig7",
            "transferSize": 54920,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/css/css_qDD4BCxE8K-iT7MRORwp32v03DlJblP9-xrYwOBWlQo.css?delta=5&language=en&theme=barcelonacat_theme&include=eJyFz8GOwyAMBNAfCuXQD0ID8SasiI2wSZu_X6RKXa3EqidbM-8y-O5sOIgt4Mwq6l_HoeYloiUqwkiwICe1lldSP3R3JlJG_5-p2MidmR5_ge10kI8iptZQQ1p5Br7A6YrynHVbkYji1K6SeZuJnMThvWsm5FFmsUofWVCwhvsnUJssMXEYrMG_v0BPo8YoS0XDNkbu6tfWK8rtN7l1rj2WrDuti15qdPgIpR8d6Z1O&tcut5n",
            "transferSize": 51951,
            "resourceType": "stylesheet",
            "mimeType": "text/css",
            "domain": "www.barcelona.cat"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "font",
            "count": 2,
            "transferBytes": 145479
          },
          {
            "resourceType": "image",
            "count": 1,
            "transferBytes": 113438
          },
          {
            "resourceType": "script",
            "count": 1,
            "transferBytes": 76426
          },
          {
            "resourceType": "stylesheet",
            "count": 1,
            "transferBytes": 51951
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.barcelona.cat",
            "count": 4,
            "transferBytes": 310868
          },
          {
            "domain": "cdn.matomo.cloud",
            "count": 1,
            "transferBytes": 76426
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Lazy-load offscreen images and media galleries",
            "urgency": "medium",
            "estimatedSavingsBytes": 94774,
            "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": "medium",
            "estimatedSavingsBytes": 64404,
            "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": "Defer non-critical UI modules until after first render",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "strategy": "Keep only above-the-fold resources in the initial path; hydrate or import secondary modules later.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 www.barcelona.cat",
            "urgency": "medium",
            "estimatedSavingsBytes": 113438,
            "strategy": "Serve a smaller placeholder first and load this asset only when the user scrolls to or requests the component.",
            "url": "https://www.barcelona.cat/sites/default/files/styles/destacat_petit/public/foment_de_ciutat_ess_ocupacio_barris_252x228_2.jpg?itok=ldQk8PO-",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 www.barcelona.cat",
            "urgency": "medium",
            "estimatedSavingsBytes": 90559,
            "strategy": "Subset or defer this font so full font payloads are only fetched when needed.",
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 cdn.matomo.cloud",
            "urgency": "medium",
            "estimatedSavingsBytes": 76426,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.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.08,
          "displayValue": "6.6 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.6 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 63 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 63 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,
          "displayValue": "Est savings of 81 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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 81 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,
          "displayValue": "Est savings of 860 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 860 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 711 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 711 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,
          "displayValue": "Est savings of 93 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 93 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": "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": 0,
          "displayValue": "Est savings of 1,470 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 Eliminate render-blocking resources\n\n- Lighthouse audit: render-blocking-resources\n- Current value: Est savings of 1,470 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\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": "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": 0.89,
          "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 Speed Index\n\n- Lighthouse audit: speed-index\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\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": "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": "1,423 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: 1,423 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://barcelona.cat/en/living-in-bcn",
      "status": "ok",
      "finalUrl": "https://www.barcelona.cat/en/living-in-bcn",
      "performanceScore": 0.65,
      "bestPracticesScore": 1,
      "transferBytes": 2305144,
      "co2Grams": 0.8830577907216001,
      "greenWeb": {
        "page": {
          "hostname": "www.barcelona.cat",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-13T22:38:00.231825",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.barcelona.cat",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76425,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "stylesheet",
            "requestCount": 1,
            "transferBytes": 24654,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15566,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7144,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 4110,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/css/bcn-avisos.css",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "fonts.googleapis.com",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 2461,
            "sampleUrl": "https://fonts.googleapis.com/css?family=Source+Sans+3:200,200i,300,300i,400,400i,500,500i,600,600i,700,700i,900,900i",
            "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
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=giqj5t&url=https%3A%2F%2Fwww.barcelona.cat%2Fen%2Fliving-in-bcn",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 10,
          "greenCount": 4,
          "notGreenCount": 7,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 60,
        "urgency": "high",
        "pageElementOccurrences": 1,
        "uniqueElementsAssessed": 1,
        "reusedFromCacheCount": 1,
        "components": [
          {
            "signature": "form|get|/en|input|text|query|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "text",
            "fieldName": "query",
            "formContext": "form|get|/en",
            "hasLabel": true,
            "hasValidationRule": false,
            "hasErrorMessagingHook": false,
            "toolingFriendly": false,
            "assessment": {
              "score": 60,
              "urgency": "high",
              "issues": [
                "No explicit validation rule",
                "No error messaging hook",
                "Missing autocomplete for tooling support"
              ],
              "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.",
                "Provide meaningful autocomplete values to support browsers and assistive tooling."
              ]
            },
            "reusedFromCache": true
          }
        ],
        "recommendations": [
          {
            "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."
          },
          {
            "title": "Missing autocomplete for tooling support",
            "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": "Living in the city | Barcelona.cat | Barcelona City Council",
          "lang": "en",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "Find all the information and benefits of living in the city of Barcelona – a city that cares for its citizens’ well-being.",
          "robots": "",
          "canonical": "https://www.barcelona.cat/en/living-in-bcn",
          "ogTitle": "Living in Barcelona",
          "ogDescription": "Connect with the city! Learn about the services and benefits of living in Barcelona – a city that cares for its people.",
          "ogType": "Web",
          "ogUrl": "https://www.barcelona.cat/en/living-in-bcn",
          "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": 32,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 37,
            "oversizedMedia": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 32,
            "oversizedMedia": 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 32 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 59,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": true,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": true,
          "externalScriptCount": 7,
          "externalScriptsWithoutIntegrity": 7,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "cache-control": "max-age=300, public",
            "content-encoding": "gzip",
            "content-language": "en",
            "content-length": "15909",
            "content-type": "text/html; charset=UTF-8",
            "date": "Mon, 13 Apr 2026 22:43:22 GMT",
            "etag": "\"1776120202-gzip\"",
            "expires": "Sun, 19 Nov 1978 05:00:00 GMT",
            "last-modified": "Mon, 13 Apr 2026 22:43:22 GMT",
            "server": "nginx",
            "vary": "Cookie,Accept-Encoding",
            "via": "1.1 ca2190123e61f1744d1210c24c87c840.cloudfront.net (CloudFront)",
            "x-amz-cf-id": "g-SRXUleaLDxbZrLg2cIrwVtfRl7MozpRDBtDYHXYND0aDvMJ3mPOA==",
            "x-amz-cf-pop": "IAD12-P5",
            "x-cache": "Miss from cloudfront",
            "x-content-type-options": "nosniff",
            "x-frame-options": "SAMEORIGIN",
            "x-generator": "Drupal 10 (https://www.drupal.org)"
          },
          "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": "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": "7 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 25,
        "urgency": "low",
        "origin": "https://www.barcelona.cat",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://www.barcelona.cat/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/sitemap.xml",
            "found": true,
            "status": 200,
            "contentType": "application/xml; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/manifest.webmanifest",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/favicon.ico",
            "found": true,
            "status": 200,
            "contentType": "image/x-icon"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "low",
            "detail": "Missing beneficial file(s): /.well-known/security.txt, /manifest.webmanifest."
          }
        ]
      },
      "mediaHints": {
        "score": 20,
        "urgency": "low",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 80,
          "imagesWithLazy": 42,
          "imagesWithoutLazy": 38
        },
        "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."
          }
        ]
      },
      "wsgCustom": {
        "score": 85,
        "urgency": "medium",
        "data": {
          "hasPrintStyles": true,
          "hasReducedMotion": true,
          "media": {
            "totalImages": 85,
            "lazyImages": 43,
            "totalIframes": 1,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "\"Source Sans Pro\", \"Helvetica Neue\", Helvetica, Arial, sans-serif",
            "usesSystemFont": true
          },
          "tracking": {
            "count": 0,
            "scripts": []
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 43/85 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": "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"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 100,
        "urgency": "high",
        "totalEstimatedSavingsBytes": 2398824.9,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Use modern image compression formats",
            "urgency": "high",
            "estimatedSavingsBytes": 1347194.9,
            "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": 1051630,
            "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: 1.28 MB."
          },
          {
            "title": "Improve image encoding quality/size",
            "urgency": "high",
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 1.00 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": 2649986.9,
        "totalEstimatedBlockingMs": 1500,
        "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": 1347194.9,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 1,316 KiB",
            "urgency": "high",
            "sourceAuditId": "modern-image-formats"
          },
          {
            "id": "uses-optimized-images",
            "title": "Compress oversized image assets",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss.",
            "estimatedSavingsBytes": 1051630,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 1,027 KiB",
            "urgency": "high",
            "sourceAuditId": "uses-optimized-images"
          },
          {
            "id": "render-blocking-resources",
            "title": "Eliminate render-blocking resources",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering.",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1500,
            "displayValue": "Est savings of 1,500 ms",
            "urgency": "high",
            "sourceAuditId": "render-blocking-resources"
          },
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 113733,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 111 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": 83418,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 81 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-css-rules"
          },
          {
            "id": "unused-javascript",
            "title": "Remove unused JavaScript",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code.",
            "estimatedSavingsBytes": 54011,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 53 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-javascript"
          }
        ],
        "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.28 MB."
          },
          {
            "title": "Compress oversized image assets",
            "urgency": "high",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 1.00 MB."
          },
          {
            "title": "Eliminate render-blocking resources",
            "urgency": "high",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering. Estimated render unblocking: 1500 ms."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "medium",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 111.07 KB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "medium",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 81.46 KB."
          },
          {
            "title": "Remove unused JavaScript",
            "urgency": "medium",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 52.75 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": 10,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 7,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "7 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": 167995.57723463688
        },
        "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: 164.06 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: 164.06 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": 5,
        "urgency": "medium",
        "transferBytes": 2305144,
        "css": {
          "unusedBytes": 83418,
          "ratio": 0.0361877609381453,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 54011,
          "duplicatedBytes": 0,
          "ratio": 0.023430640341774743,
          "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": "high",
            "estimatedSavingsBytes": 83418,
            "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": "medium",
            "estimatedSavingsBytes": 54011,
            "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": 2305144,
        "estimatedDeferrableBytes": 251162,
        "renderBlockingMs": 1500,
        "breakdown": {
          "offscreenImageSavings": 113733,
          "unusedJavascriptSavings": 54011,
          "unusedCssSavings": 83418
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 113733,
            "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": "medium",
            "estimatedSavingsBytes": 54011,
            "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": "high",
            "estimatedSavingsBytes": 83418,
            "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": "Eliminate render-blocking resources",
            "area": "render-path",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1500,
            "strategy": "Defer scripts/styles not required for first paint and preload only truly critical assets.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-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 www.barcelona.cat",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 103831,
            "url": "https://www.barcelona.cat/sites/default/files/styles/distribuidora_banner_menu/public/nens_nenes_paola_1.jpg?itok=yIky6vCx",
            "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": 64,
        "urgency": "high",
        "providerCount": 7,
        "requestCount": 8,
        "transferBytes": 139457,
        "notGreenCount": 5,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76425,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15566,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7144,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=giqj5t&url=https%3A%2F%2Fwww.barcelona.cat%2Fen%2Fliving-in-bcn",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "high",
            "detail": "Track 7 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."
          },
          {
            "title": "Prioritize greener alternatives for third-party providers",
            "urgency": "high",
            "detail": "5 third-party script origin(s) are not confirmed green in the Green Web Foundation dataset."
          }
        ]
      },
      "redundancy": {
        "score": 13,
        "urgency": "medium",
        "transferBytes": 2305144,
        "estimatedRedundantBytes": 137429,
        "redundancyRatio": 0.05961840127992004,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 83418,
            "displayValue": "Est savings of 81 KiB"
          },
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 54011,
            "displayValue": "Est savings of 53 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 83418,
            "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 unused javascript",
            "urgency": "medium",
            "estimatedSavingsBytes": 54011,
            "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 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": 13,
        "urgency": "medium",
        "totalTransferBytes": 2305144,
        "heavyRequestCount": 5,
        "heavyBytes": 377680,
        "heavyRatio": 0.16384225887840412,
        "heavyRequests": [
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/distribuidora_banner_menu/public/nens_nenes_paola_1.jpg?itok=yIky6vCx",
            "transferSize": 103831,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "transferSize": 90560,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "transferSize": 76425,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "cdn.matomo.cloud"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament/fonts/icoajuntament.ttf?8aaig7",
            "transferSize": 54921,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/css/css_qDD4BCxE8K-iT7MRORwp32v03DlJblP9-xrYwOBWlQo.css?delta=5&language=en&theme=barcelonacat_theme&include=eJyFz0FqxTAMBNALxd-LHsiMHTVxcSQjyenP7Wso_FJI6Upi5m0GH4MdB7EnnNXE4vcJ6HXJ0EJNGAWe5CTVupLFqUdwkTb7v0zHRuGs9Pkb-E4HxSzi5oqeysp34B1crizPu25rktGC-dUqb3eiFgl47boTJmNmycCW3v4DXWXJhdNkivj6Ej2dlNGWDsU21-wWVx0d7fGTPAb3kVu1ndbFLnM6YobRF2idlFA&tcut5n",
            "transferSize": 51943,
            "resourceType": "stylesheet",
            "mimeType": "text/css",
            "domain": "www.barcelona.cat"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "font",
            "count": 2,
            "transferBytes": 145481
          },
          {
            "resourceType": "image",
            "count": 1,
            "transferBytes": 103831
          },
          {
            "resourceType": "script",
            "count": 1,
            "transferBytes": 76425
          },
          {
            "resourceType": "stylesheet",
            "count": 1,
            "transferBytes": 51943
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.barcelona.cat",
            "count": 4,
            "transferBytes": 301255
          },
          {
            "domain": "cdn.matomo.cloud",
            "count": 1,
            "transferBytes": 76425
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Lazy-load offscreen images and media galleries",
            "urgency": "medium",
            "estimatedSavingsBytes": 113733,
            "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": "medium",
            "estimatedSavingsBytes": 54011,
            "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": "Defer non-critical UI modules until after first render",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "strategy": "Keep only above-the-fold resources in the initial path; hydrate or import secondary modules later.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 www.barcelona.cat",
            "urgency": "medium",
            "estimatedSavingsBytes": 103831,
            "strategy": "Serve a smaller placeholder first and load this asset only when the user scrolls to or requests the component.",
            "url": "https://www.barcelona.cat/sites/default/files/styles/distribuidora_banner_menu/public/nens_nenes_paola_1.jpg?itok=yIky6vCx",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 www.barcelona.cat",
            "urgency": "medium",
            "estimatedSavingsBytes": 90560,
            "strategy": "Subset or defer this font so full font payloads are only fetched when needed.",
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 cdn.matomo.cloud",
            "urgency": "medium",
            "estimatedSavingsBytes": 76425,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.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.01,
          "displayValue": "8.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: 8.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 53 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 53 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,
          "displayValue": "Est savings of 81 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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 81 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,
          "displayValue": "Est savings of 1,316 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,316 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 1,027 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 1,027 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": "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": 0,
          "displayValue": "Est savings of 1,500 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 Eliminate render-blocking resources\n\n- Lighthouse audit: render-blocking-resources\n- Current value: Est savings of 1,500 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\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": "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": 0.87,
          "displayValue": "3.6 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 Speed Index\n\n- Lighthouse audit: speed-index\n- Current value: 3.6 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\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": "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 111 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 111 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": "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": "1,389 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: 1,389 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://barcelona.cat/en/pagina-exemple-mapa-sant-jordi",
      "status": "ok",
      "finalUrl": "https://www.barcelona.cat/en/pagina-exemple-mapa-sant-jordi",
      "performanceScore": 0.71,
      "bestPracticesScore": 0.75,
      "transferBytes": 755614,
      "co2Grams": 0.2894616689796,
      "greenWeb": {
        "page": {
          "hostname": "www.barcelona.cat",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-13T22:38:00.231825",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.barcelona.cat",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76426,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "stylesheet",
            "requestCount": 1,
            "transferBytes": 24659,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15566,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7144,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 4109,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/css/bcn-avisos.css",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "fonts.googleapis.com",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 2462,
            "sampleUrl": "https://fonts.googleapis.com/css?family=Source+Sans+3:200,200i,300,300i,400,400i,500,500i,600,600i,700,700i,900,900i",
            "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
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=2uz7JE&url=https%3A%2F%2Fwww.barcelona.cat%2Fen%2Fpagina-exemple-mapa-sant-jordi",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 10,
          "greenCount": 4,
          "notGreenCount": 7,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 60,
        "urgency": "high",
        "pageElementOccurrences": 1,
        "uniqueElementsAssessed": 1,
        "reusedFromCacheCount": 1,
        "components": [
          {
            "signature": "form|get|/en|input|text|query|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "text",
            "fieldName": "query",
            "formContext": "form|get|/en",
            "hasLabel": true,
            "hasValidationRule": false,
            "hasErrorMessagingHook": false,
            "toolingFriendly": false,
            "assessment": {
              "score": 60,
              "urgency": "high",
              "issues": [
                "No explicit validation rule",
                "No error messaging hook",
                "Missing autocomplete for tooling support"
              ],
              "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.",
                "Provide meaningful autocomplete values to support browsers and assistive tooling."
              ]
            },
            "reusedFromCache": true
          }
        ],
        "recommendations": [
          {
            "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."
          },
          {
            "title": "Missing autocomplete for tooling support",
            "urgency": "medium",
            "detail": "1 unique form control signature(s) on this page include this issue."
          }
        ]
      },
      "metadata": {
        "score": 25,
        "urgency": "low",
        "checks": {
          "hasTitle": true,
          "hasLang": true,
          "hasDescription": false,
          "hasCanonical": true,
          "hasOpenGraphCore": false,
          "hasTwitterCard": true,
          "hasViewport": true,
          "hasCharset": true,
          "hasValidStructuredData": true,
          "hasInvalidStructuredData": false
        },
        "observed": {
          "title": "Pàgina exemple mapa sant jordi | Barcelona.cat | Barcelona City Council",
          "lang": "en",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "",
          "robots": "",
          "canonical": "https://www.barcelona.cat/en/pagina-exemple-mapa-sant-jordi",
          "ogTitle": "Pàgina exemple mapa sant jordi",
          "ogDescription": "",
          "ogType": "Web",
          "ogUrl": "https://www.barcelona.cat/en/pagina-exemple-mapa-sant-jordi",
          "twitterCard": "summary_large_image",
          "ldJsonCount": 0,
          "validLdJsonCount": 0,
          "invalidLdJsonCount": 0
        },
        "recommendations": [
          {
            "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."
          }
        ]
      },
      "layoutAdaptation": {
        "score": 30,
        "urgency": "medium",
        "checks": {
          "testedMobile": true,
          "testedTablet": true,
          "horizontalOverflowOnMobile": false,
          "horizontalOverflowOnTablet": false,
          "mobileSmallTapTargets": 33,
          "tabletSmallTapTargets": 31,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 33,
            "oversizedMedia": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 31,
            "oversizedMedia": 0
          }
        ],
        "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 31 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 59,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": true,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": true,
          "externalScriptCount": 7,
          "externalScriptsWithoutIntegrity": 7,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "cache-control": "max-age=300, public",
            "content-encoding": "gzip",
            "content-language": "en",
            "content-length": "9528",
            "content-type": "text/html; charset=UTF-8",
            "date": "Mon, 13 Apr 2026 22:43:37 GMT",
            "etag": "\"1776120217-gzip\"",
            "expires": "Sun, 19 Nov 1978 05:00:00 GMT",
            "last-modified": "Mon, 13 Apr 2026 22:43:37 GMT",
            "server": "nginx",
            "vary": "Cookie,Accept-Encoding",
            "via": "1.1 ca2190123e61f1744d1210c24c87c840.cloudfront.net (CloudFront)",
            "x-amz-cf-id": "iQ0-gZl9Ve-gwm6D3eXuf9i-oHi1iDEC331q1YYRecsAlUpUSrtLDA==",
            "x-amz-cf-pop": "IAD12-P5",
            "x-cache": "Miss from cloudfront",
            "x-content-type-options": "nosniff",
            "x-frame-options": "SAMEORIGIN",
            "x-generator": "Drupal 10 (https://www.drupal.org)"
          },
          "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": "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": "7 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 25,
        "urgency": "low",
        "origin": "https://www.barcelona.cat",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://www.barcelona.cat/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/sitemap.xml",
            "found": true,
            "status": 200,
            "contentType": "application/xml; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/manifest.webmanifest",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/favicon.ico",
            "found": true,
            "status": 200,
            "contentType": "image/x-icon"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "low",
            "detail": "Missing beneficial file(s): /.well-known/security.txt, /manifest.webmanifest."
          }
        ]
      },
      "mediaHints": {
        "score": 50,
        "urgency": "medium",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 11,
          "imagesWithLazy": 0,
          "imagesWithoutLazy": 11
        },
        "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": "11 of 11 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 85,
        "urgency": "medium",
        "data": {
          "hasPrintStyles": true,
          "hasReducedMotion": true,
          "media": {
            "totalImages": 16,
            "lazyImages": 1,
            "totalIframes": 2,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "\"Source Sans Pro\", \"Helvetica Neue\", Helvetica, Arial, sans-serif",
            "usesSystemFont": true
          },
          "tracking": {
            "count": 0,
            "scripts": []
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 1/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": "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"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 17,
        "urgency": "low",
        "totalEstimatedSavingsBytes": 130442.55,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Use modern image compression formats",
            "urgency": "medium",
            "estimatedSavingsBytes": 72410.55,
            "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size."
          },
          {
            "id": "uses-optimized-images",
            "title": "Improve image encoding quality/size",
            "urgency": "medium",
            "estimatedSavingsBytes": 58032,
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings."
          }
        ],
        "recommendations": [
          {
            "title": "Use modern image compression formats",
            "urgency": "medium",
            "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size. Estimated savings: 70.71 KB."
          },
          {
            "title": "Improve image encoding quality/size",
            "urgency": "medium",
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 56.67 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": 331913.55,
        "totalEstimatedBlockingMs": 1482,
        "opportunities": [
          {
            "id": "render-blocking-resources",
            "title": "Eliminate render-blocking resources",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering.",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1482,
            "displayValue": "Est savings of 1,480 ms",
            "urgency": "high",
            "sourceAuditId": "render-blocking-resources"
          },
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 87109,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 85 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": 81881,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 80 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-css-rules"
          },
          {
            "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": 72410.55,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 71 KiB",
            "urgency": "medium",
            "sourceAuditId": "modern-image-formats"
          },
          {
            "id": "uses-optimized-images",
            "title": "Compress oversized image assets",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss.",
            "estimatedSavingsBytes": 58032,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 57 KiB",
            "urgency": "medium",
            "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": 32481,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 32 KiB",
            "urgency": "low",
            "sourceAuditId": "unused-javascript"
          }
        ],
        "recommendations": [
          {
            "title": "Eliminate render-blocking resources",
            "urgency": "high",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering. Estimated render unblocking: 1482 ms."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "medium",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 85.07 KB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "medium",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 79.96 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: 70.71 KB."
          },
          {
            "title": "Compress oversized image assets",
            "urgency": "medium",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 56.67 KB."
          },
          {
            "title": "Remove unused JavaScript",
            "urgency": "low",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 31.72 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": 10,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 7,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "7 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": 167994.5582053073
        },
        "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: 164.06 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: 164.06 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": "medium",
        "transferBytes": 755614,
        "css": {
          "unusedBytes": 81881,
          "ratio": 0.10836352952698071,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 32481,
          "duplicatedBytes": 0,
          "ratio": 0.042986233711921694,
          "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": "high",
            "estimatedSavingsBytes": 81881,
            "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": "medium",
            "estimatedSavingsBytes": 32481,
            "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": 755614,
        "estimatedDeferrableBytes": 201471,
        "renderBlockingMs": 1482,
        "breakdown": {
          "offscreenImageSavings": 87109,
          "unusedJavascriptSavings": 32481,
          "unusedCssSavings": 81881
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 87109,
            "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": "medium",
            "estimatedSavingsBytes": 32481,
            "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": 81881,
            "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": "Eliminate render-blocking resources",
            "area": "render-path",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1482,
            "strategy": "Defer scripts/styles not required for first paint and preload only truly critical assets.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-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 www.barcelona.cat",
            "area": "font",
            "urgency": "medium",
            "estimatedSavingsBytes": 90560,
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "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 www.barcelona.cat",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 84136,
            "url": "https://www.barcelona.cat/themes/barcelonacat_theme/images/menu/viula.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 cdn.matomo.cloud",
            "area": "script",
            "urgency": "medium",
            "estimatedSavingsBytes": 76426,
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.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": 64,
        "urgency": "high",
        "providerCount": 7,
        "requestCount": 8,
        "transferBytes": 139458,
        "notGreenCount": 5,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76426,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15566,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7144,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=2uz7JE&url=https%3A%2F%2Fwww.barcelona.cat%2Fen%2Fpagina-exemple-mapa-sant-jordi",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "high",
            "detail": "Track 7 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."
          },
          {
            "title": "Prioritize greener alternatives for third-party providers",
            "urgency": "high",
            "detail": "5 third-party script origin(s) are not confirmed green in the Green Web Foundation dataset."
          }
        ]
      },
      "redundancy": {
        "score": 18,
        "urgency": "low",
        "transferBytes": 755614,
        "estimatedRedundantBytes": 114362,
        "redundancyRatio": 0.1513497632389024,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 81881,
            "displayValue": "Est savings of 80 KiB"
          },
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 32481,
            "displayValue": "Est savings of 32 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 81881,
            "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 unused javascript",
            "urgency": "medium",
            "estimatedSavingsBytes": 32481,
            "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 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": 22,
        "urgency": "medium",
        "totalTransferBytes": 755614,
        "heavyRequestCount": 4,
        "heavyBytes": 271009,
        "heavyRatio": 0.3586606388976382,
        "heavyRequests": [
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "transferSize": 90560,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "transferSize": 76426,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "cdn.matomo.cloud"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament/fonts/icoajuntament.ttf?8aaig7",
            "transferSize": 54920,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/css/css_evpTRQTawGYS1Ro7RbXq3hBxwat7AU-RJm1V8ZgzeaE.css?delta=5&language=en&theme=barcelonacat_theme&include=eJyFzkEKwzAMBMAPxfjQB5m1I1IXRzKSkja_r6EQKKT0pGV3DsJjY8dK7Al7NbH4OQG9ThlaqAmjwJPspFpnsjj0Flykjf2X6Vgo7JWe38DvtFLMIm6u6KnMfAWWJhktmB-t8nIlapGA8_crYbKNLhnY0u0f6CpTLpwGU8QzJXo5KaNNdpjTGjOM3gg5eRY&tcut5n",
            "transferSize": 49103,
            "resourceType": "stylesheet",
            "mimeType": "text/css",
            "domain": "www.barcelona.cat"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "font",
            "count": 2,
            "transferBytes": 145480
          },
          {
            "resourceType": "script",
            "count": 1,
            "transferBytes": 76426
          },
          {
            "resourceType": "stylesheet",
            "count": 1,
            "transferBytes": 49103
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.barcelona.cat",
            "count": 3,
            "transferBytes": 194583
          },
          {
            "domain": "cdn.matomo.cloud",
            "count": 1,
            "transferBytes": 76426
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Lazy-load offscreen images and media galleries",
            "urgency": "medium",
            "estimatedSavingsBytes": 87109,
            "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": "Defer non-critical UI modules until after first render",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "strategy": "Keep only above-the-fold resources in the initial path; hydrate or import secondary modules later.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 www.barcelona.cat",
            "urgency": "medium",
            "estimatedSavingsBytes": 90560,
            "strategy": "Subset or defer this font so full font payloads are only fetched when needed.",
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 cdn.matomo.cloud",
            "urgency": "medium",
            "estimatedSavingsBytes": 76426,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.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.13,
          "displayValue": "6.0 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.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-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,
          "displayValue": "Est savings of 80 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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 80 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,
          "displayValue": "Est savings of 71 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 71 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 57 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 57 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,
          "displayValue": "Est savings of 85 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 85 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": "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": 0,
          "displayValue": "Est savings of 1,480 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 Eliminate render-blocking resources\n\n- Lighthouse audit: render-blocking-resources\n- Current value: Est savings of 1,480 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\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": "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": 0.87,
          "displayValue": "3.6 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 Speed Index\n\n- Lighthouse audit: speed-index\n- Current value: 3.6 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\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": 0.5,
          "displayValue": "Est savings of 32 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 32 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": "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": "891 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: 891 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://barcelona.cat/en/what-to-do-in-bcn",
      "status": "ok",
      "finalUrl": "https://www.barcelona.cat/en/what-to-do-in-bcn",
      "performanceScore": 0.63,
      "bestPracticesScore": 1,
      "transferBytes": 2436051,
      "co2Grams": 0.9332058275514,
      "greenWeb": {
        "page": {
          "hostname": "www.barcelona.cat",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-13T22:38:00.231825",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.barcelona.cat",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76425,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "stylesheet",
            "requestCount": 1,
            "transferBytes": 24654,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15566,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7146,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 4111,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/css/bcn-avisos.css",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2860,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "fonts.googleapis.com",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 2461,
            "sampleUrl": "https://fonts.googleapis.com/css?family=Source+Sans+3:200,200i,300,300i,400,400i,500,500i,600,600i,700,700i,900,900i",
            "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
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=oBcwvV&url=https%3A%2F%2Fwww.barcelona.cat%2Fen%2Fwhat-to-do-in-bcn",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 10,
          "greenCount": 4,
          "notGreenCount": 7,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 60,
        "urgency": "high",
        "pageElementOccurrences": 1,
        "uniqueElementsAssessed": 1,
        "reusedFromCacheCount": 1,
        "components": [
          {
            "signature": "form|get|/en|input|text|query|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "text",
            "fieldName": "query",
            "formContext": "form|get|/en",
            "hasLabel": true,
            "hasValidationRule": false,
            "hasErrorMessagingHook": false,
            "toolingFriendly": false,
            "assessment": {
              "score": 60,
              "urgency": "high",
              "issues": [
                "No explicit validation rule",
                "No error messaging hook",
                "Missing autocomplete for tooling support"
              ],
              "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.",
                "Provide meaningful autocomplete values to support browsers and assistive tooling."
              ]
            },
            "reusedFromCache": true
          }
        ],
        "recommendations": [
          {
            "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."
          },
          {
            "title": "Missing autocomplete for tooling support",
            "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": "What to do in Barcelona | Barcelona.cat | Barcelona City Council",
          "lang": "en",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "Check the schedule of activities, cultural events, sports centres and parks available in the city of Barcelona.",
          "robots": "",
          "canonical": "https://www.barcelona.cat/en/what-to-do-in-bcn",
          "ogTitle": "Learn about everything you can do in Barcelona",
          "ogDescription": "Don’t miss a thing! Explore the guide to the city’s activities: from culture to sports centres and parks in Barcelona.",
          "ogType": "Web",
          "ogUrl": "https://www.barcelona.cat/en/what-to-do-in-bcn",
          "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": 34,
        "urgency": "medium",
        "checks": {
          "testedMobile": true,
          "testedTablet": true,
          "horizontalOverflowOnMobile": false,
          "horizontalOverflowOnTablet": false,
          "mobileSmallTapTargets": 47,
          "tabletSmallTapTargets": 33,
          "fixedWidthOffenders": 2,
          "oversizedMedia": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 1,
            "smallTapTargets": 47,
            "oversizedMedia": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 1,
            "smallTapTargets": 33,
            "oversizedMedia": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 47 small targets on mobile and 33 on tablet."
          },
          {
            "title": "Refactor fixed-width components",
            "urgency": "medium",
            "detail": "2 element(s) exceeded viewport width in tested layouts; use responsive component constraints."
          }
        ]
      },
      "securityLight": {
        "score": 59,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": true,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": true,
          "externalScriptCount": 7,
          "externalScriptsWithoutIntegrity": 7,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "cache-control": "max-age=300, public",
            "content-encoding": "gzip",
            "content-language": "en",
            "content-length": "14130",
            "content-type": "text/html; charset=UTF-8",
            "date": "Mon, 13 Apr 2026 22:43:49 GMT",
            "etag": "\"1776120229-gzip\"",
            "expires": "Sun, 19 Nov 1978 05:00:00 GMT",
            "last-modified": "Mon, 13 Apr 2026 22:43:49 GMT",
            "server": "nginx",
            "vary": "Cookie,Accept-Encoding",
            "via": "1.1 ca2190123e61f1744d1210c24c87c840.cloudfront.net (CloudFront)",
            "x-amz-cf-id": "U_-RHR76GkLdVIToHYj-Sub9sfIVAbMqMdXNGX7otRu75JLXKb5xyQ==",
            "x-amz-cf-pop": "IAD12-P5",
            "x-cache": "Miss from cloudfront",
            "x-content-type-options": "nosniff",
            "x-frame-options": "SAMEORIGIN",
            "x-generator": "Drupal 10 (https://www.drupal.org)"
          },
          "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": "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": "7 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 25,
        "urgency": "low",
        "origin": "https://www.barcelona.cat",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://www.barcelona.cat/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/sitemap.xml",
            "found": true,
            "status": 200,
            "contentType": "application/xml; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/manifest.webmanifest",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/favicon.ico",
            "found": true,
            "status": 200,
            "contentType": "image/x-icon"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "low",
            "detail": "Missing beneficial file(s): /.well-known/security.txt, /manifest.webmanifest."
          }
        ]
      },
      "mediaHints": {
        "score": 20,
        "urgency": "low",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 63,
          "imagesWithLazy": 34,
          "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."
          }
        ]
      },
      "wsgCustom": {
        "score": 85,
        "urgency": "medium",
        "data": {
          "hasPrintStyles": true,
          "hasReducedMotion": true,
          "media": {
            "totalImages": 68,
            "lazyImages": 35,
            "totalIframes": 1,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "\"Source Sans Pro\", \"Helvetica Neue\", Helvetica, Arial, sans-serif",
            "usesSystemFont": true
          },
          "tracking": {
            "count": 0,
            "scripts": []
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 35/68 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": "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"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 100,
        "urgency": "high",
        "totalEstimatedSavingsBytes": 2650787.8,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Use modern image compression formats",
            "urgency": "high",
            "estimatedSavingsBytes": 1442164.7999999996,
            "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": 1208623,
            "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: 1.38 MB."
          },
          {
            "title": "Improve image encoding quality/size",
            "urgency": "high",
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 1.15 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": 2875846.8,
        "totalEstimatedBlockingMs": 1648,
        "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": 1442164.7999999996,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 1,408 KiB",
            "urgency": "high",
            "sourceAuditId": "modern-image-formats"
          },
          {
            "id": "uses-optimized-images",
            "title": "Compress oversized image assets",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss.",
            "estimatedSavingsBytes": 1208623,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 1,180 KiB",
            "urgency": "high",
            "sourceAuditId": "uses-optimized-images"
          },
          {
            "id": "render-blocking-resources",
            "title": "Eliminate render-blocking resources",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering.",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1648,
            "displayValue": "Est savings of 1,650 ms",
            "urgency": "high",
            "sourceAuditId": "render-blocking-resources"
          },
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 87108,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 85 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": 83326,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 81 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-css-rules"
          },
          {
            "id": "unused-javascript",
            "title": "Remove unused JavaScript",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code.",
            "estimatedSavingsBytes": 54625,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 53 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-javascript"
          }
        ],
        "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.38 MB."
          },
          {
            "title": "Compress oversized image assets",
            "urgency": "high",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 1.15 MB."
          },
          {
            "title": "Eliminate render-blocking resources",
            "urgency": "high",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering. Estimated render unblocking: 1648 ms."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "medium",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 85.07 KB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "medium",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 81.37 KB."
          },
          {
            "title": "Remove unused JavaScript",
            "urgency": "medium",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 53.34 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": 10,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 7,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "7 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": 168006.7584846369
        },
        "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: 164.07 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: 164.07 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": "medium",
        "transferBytes": 2436051,
        "css": {
          "unusedBytes": 83326,
          "ratio": 0.034205359411605095,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 54625,
          "duplicatedBytes": 0,
          "ratio": 0.02242358636990769,
          "auditIds": [
            "unused-javascript",
            "duplicated-javascript"
          ]
        },
        "html": {
          "estimatedPenalty": 0.25,
          "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": "high",
            "estimatedSavingsBytes": 83326,
            "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": "medium",
            "estimatedSavingsBytes": 54625,
            "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": 2436051,
        "estimatedDeferrableBytes": 225059,
        "renderBlockingMs": 1648,
        "breakdown": {
          "offscreenImageSavings": 87108,
          "unusedJavascriptSavings": 54625,
          "unusedCssSavings": 83326
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 87108,
            "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": "medium",
            "estimatedSavingsBytes": 54625,
            "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": "high",
            "estimatedSavingsBytes": 83326,
            "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": "Eliminate render-blocking resources",
            "area": "render-path",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1648,
            "strategy": "Defer scripts/styles not required for first paint and preload only truly critical assets.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-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 www.barcelona.cat",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 131590,
            "url": "https://www.barcelona.cat/sites/default/files/styles/distribuidora_banner_paginat/public/banner_05_1.jpg?itok=JKDuuKQG",
            "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": 64,
        "urgency": "high",
        "providerCount": 7,
        "requestCount": 8,
        "transferBytes": 139458,
        "notGreenCount": 5,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76425,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15566,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7146,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2860,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=oBcwvV&url=https%3A%2F%2Fwww.barcelona.cat%2Fen%2Fwhat-to-do-in-bcn",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "high",
            "detail": "Track 7 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."
          },
          {
            "title": "Prioritize greener alternatives for third-party providers",
            "urgency": "high",
            "detail": "5 third-party script origin(s) are not confirmed green in the Green Web Foundation dataset."
          }
        ]
      },
      "redundancy": {
        "score": 23,
        "urgency": "medium",
        "transferBytes": 2436051,
        "estimatedRedundantBytes": 137951,
        "redundancyRatio": 0.056628945781512785,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 83326,
            "displayValue": "Est savings of 81 KiB"
          },
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 54625,
            "displayValue": "Est savings of 53 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 83326,
            "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 unused javascript",
            "urgency": "medium",
            "estimatedSavingsBytes": 54625,
            "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 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": 21,
        "urgency": "high",
        "totalTransferBytes": 2436051,
        "heavyRequestCount": 8,
        "heavyBytes": 728502,
        "heavyRatio": 0.29905038933913947,
        "heavyRequests": [
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/distribuidora_banner_paginat/public/banner_05_1.jpg?itok=JKDuuKQG",
            "transferSize": 131590,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/distribuidora_banner_menu/public/parcs%20i%20jardins%208789.jpg?itok=uTySxKDK",
            "transferSize": 111807,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/destacat_petit/public/edifici_252x228_4.jpg?itok=bVARiEmF",
            "transferSize": 105745,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/destacat_petit/public/tibidaboia-252x228.jpg?itok=Qv1xI3_6",
            "transferSize": 105500,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "transferSize": 90561,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "transferSize": 76425,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "cdn.matomo.cloud"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament/fonts/icoajuntament.ttf?8aaig7",
            "transferSize": 54920,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/css/css_qDD4BCxE8K-iT7MRORwp32v03DlJblP9-xrYwOBWlQo.css?delta=6&language=en&theme=barcelonacat_theme&include=eJyFz8FuxCAMBNAfCsuhH4QG4ia0DkbYpJu_L9JKW1VitSdbM-8y-OrFcFCxgDOrqH8ch5qXiJaIpSDBgpzUWl5J_dDdmQiP_pWp2MidmX7-A9vpIB9FTK2hhrSWGfhESVeU-6zbWCLYqV2cyzYTOYnDc9dMKOf07ZASqebINDXSRxYURcPHO1CbLDGVMFiDf36B7katgJeKhm0s3tWvrVfw7S-59VJ75Kw7rYteanT4CKVfKxCiTQ&tcut5n",
            "transferSize": 51954,
            "resourceType": "stylesheet",
            "mimeType": "text/css",
            "domain": "www.barcelona.cat"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "image",
            "count": 4,
            "transferBytes": 454642
          },
          {
            "resourceType": "font",
            "count": 2,
            "transferBytes": 145481
          },
          {
            "resourceType": "script",
            "count": 1,
            "transferBytes": 76425
          },
          {
            "resourceType": "stylesheet",
            "count": 1,
            "transferBytes": 51954
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.barcelona.cat",
            "count": 7,
            "transferBytes": 652077
          },
          {
            "domain": "cdn.matomo.cloud",
            "count": 1,
            "transferBytes": 76425
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Lazy-load offscreen images and media galleries",
            "urgency": "medium",
            "estimatedSavingsBytes": 87108,
            "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": "medium",
            "estimatedSavingsBytes": 54625,
            "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": "Defer non-critical UI modules until after first render",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "strategy": "Keep only above-the-fold resources in the initial path; hydrate or import secondary modules later.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 www.barcelona.cat",
            "urgency": "medium",
            "estimatedSavingsBytes": 131590,
            "strategy": "Serve a smaller placeholder first and load this asset only when the user scrolls to or requests the component.",
            "url": "https://www.barcelona.cat/sites/default/files/styles/distribuidora_banner_paginat/public/banner_05_1.jpg?itok=JKDuuKQG",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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.03,
          "displayValue": "7.9 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.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,
          "displayValue": "Est savings of 53 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 53 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,
          "displayValue": "Est savings of 81 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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 81 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,
          "displayValue": "Est savings of 1,408 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,408 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 1,180 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 1,180 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,
          "displayValue": "Est savings of 85 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 85 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": "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": 0,
          "displayValue": "Est savings of 1,650 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 Eliminate render-blocking resources\n\n- Lighthouse audit: render-blocking-resources\n- Current value: Est savings of 1,650 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\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": "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,
          "displayValue": "1,470 elements",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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: 1,470 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"
        },
        {
          "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": 0.81,
          "displayValue": "4.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 Speed Index\n\n- Lighthouse audit: speed-index\n- Current value: 4.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\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"
        }
      ]
    },
    {
      "url": "https://barcelona.cat/es/conocebcn",
      "status": "ok",
      "finalUrl": "https://www.barcelona.cat/es/conocebcn",
      "performanceScore": 0.67,
      "bestPracticesScore": 1,
      "transferBytes": 1961551,
      "co2Grams": 0.7514337032514001,
      "greenWeb": {
        "page": {
          "hostname": "www.barcelona.cat",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-13T22:38:00.231825",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.barcelona.cat",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76425,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "stylesheet",
            "requestCount": 1,
            "transferBytes": 24654,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15565,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7146,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5656,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 4113,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/css/bcn-avisos.css",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "fonts.googleapis.com",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 2461,
            "sampleUrl": "https://fonts.googleapis.com/css?family=Source+Sans+3:200,200i,300,300i,400,400i,500,500i,600,600i,700,700i,900,900i",
            "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
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=61RRZg&url=https%3A%2F%2Fwww.barcelona.cat%2Fes%2Fconocebcn",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 10,
          "greenCount": 4,
          "notGreenCount": 7,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 60,
        "urgency": "high",
        "pageElementOccurrences": 1,
        "uniqueElementsAssessed": 1,
        "reusedFromCacheCount": 1,
        "components": [
          {
            "signature": "form|get|/es/|input|text|query|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "text",
            "fieldName": "query",
            "formContext": "form|get|/es/",
            "hasLabel": true,
            "hasValidationRule": false,
            "hasErrorMessagingHook": false,
            "toolingFriendly": false,
            "assessment": {
              "score": 60,
              "urgency": "high",
              "issues": [
                "No explicit validation rule",
                "No error messaging hook",
                "Missing autocomplete for tooling support"
              ],
              "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.",
                "Provide meaningful autocomplete values to support browsers and assistive tooling."
              ]
            },
            "reusedFromCache": true
          }
        ],
        "recommendations": [
          {
            "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."
          },
          {
            "title": "Missing autocomplete for tooling support",
            "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": "Conoce BCN | Barcelona.cat | Ayuntamiento de Barcelona",
          "lang": "es",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "Descubre la historia de Barcelona, sus puntos de interés, la cultura popular y los rincones más emblemáticos de tu ciudad.",
          "robots": "",
          "canonical": "https://www.barcelona.cat/es/conocebcn",
          "ogTitle": "Conoce Barcelona",
          "ogDescription": "¿Quieres conocer Barcelona? Explora la cultura popular, la memoria y las tradiciones de la ciudad.",
          "ogType": "Web",
          "ogUrl": "https://www.barcelona.cat/es/conocebcn",
          "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": 38,
          "tabletSmallTapTargets": 33,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 38,
            "oversizedMedia": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 33,
            "oversizedMedia": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 38 small targets on mobile and 33 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 59,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": true,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": true,
          "externalScriptCount": 7,
          "externalScriptsWithoutIntegrity": 7,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "cache-control": "max-age=300, public",
            "content-encoding": "gzip",
            "content-language": "es",
            "content-length": "12149",
            "content-type": "text/html; charset=UTF-8",
            "date": "Mon, 13 Apr 2026 22:44:05 GMT",
            "etag": "\"1776120244-gzip\"",
            "expires": "Sun, 19 Nov 1978 05:00:00 GMT",
            "last-modified": "Mon, 13 Apr 2026 22:44:04 GMT",
            "server": "nginx",
            "vary": "Cookie,Accept-Encoding",
            "via": "1.1 ca2190123e61f1744d1210c24c87c840.cloudfront.net (CloudFront)",
            "x-amz-cf-id": "r_TqwxvBm2rRSriU_uDGMbso5Bhws8VskkXANyisgIPLN2viykS0lQ==",
            "x-amz-cf-pop": "IAD12-P5",
            "x-cache": "Miss from cloudfront",
            "x-content-type-options": "nosniff",
            "x-frame-options": "SAMEORIGIN",
            "x-generator": "Drupal 10 (https://www.drupal.org)"
          },
          "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": "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": "7 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 25,
        "urgency": "low",
        "origin": "https://www.barcelona.cat",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://www.barcelona.cat/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/sitemap.xml",
            "found": true,
            "status": 200,
            "contentType": "application/xml; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/manifest.webmanifest",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/favicon.ico",
            "found": true,
            "status": 200,
            "contentType": "image/x-icon"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "low",
            "detail": "Missing beneficial file(s): /.well-known/security.txt, /manifest.webmanifest."
          }
        ]
      },
      "mediaHints": {
        "score": 27,
        "urgency": "low",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 37,
          "imagesWithLazy": 14,
          "imagesWithoutLazy": 23
        },
        "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": "23 of 37 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 85,
        "urgency": "medium",
        "data": {
          "hasPrintStyles": true,
          "hasReducedMotion": true,
          "media": {
            "totalImages": 42,
            "lazyImages": 15,
            "totalIframes": 1,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "\"Source Sans Pro\", \"Helvetica Neue\", Helvetica, Arial, sans-serif",
            "usesSystemFont": true
          },
          "tracking": {
            "count": 0,
            "scripts": []
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 15/42 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": "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"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 96,
        "urgency": "high",
        "totalEstimatedSavingsBytes": 1889839.6500000001,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Use modern image compression formats",
            "urgency": "high",
            "estimatedSavingsBytes": 1037339.6500000001,
            "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": 852500,
            "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: 1013.03 KB."
          },
          {
            "title": "Improve image encoding quality/size",
            "urgency": "high",
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 832.52 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": 2111160.6500000004,
        "totalEstimatedBlockingMs": 1638,
        "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": 1037339.6500000001,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 1,013 KiB",
            "urgency": "high",
            "sourceAuditId": "modern-image-formats"
          },
          {
            "id": "uses-optimized-images",
            "title": "Compress oversized image assets",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss.",
            "estimatedSavingsBytes": 852500,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 833 KiB",
            "urgency": "high",
            "sourceAuditId": "uses-optimized-images"
          },
          {
            "id": "render-blocking-resources",
            "title": "Eliminate render-blocking resources",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering.",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1638,
            "displayValue": "Est savings of 1,640 ms",
            "urgency": "high",
            "sourceAuditId": "render-blocking-resources"
          },
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 83661,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 82 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": 83649,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 82 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-css-rules"
          },
          {
            "id": "unused-javascript",
            "title": "Remove unused JavaScript",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code.",
            "estimatedSavingsBytes": 54011,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 53 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-javascript"
          }
        ],
        "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: 1013.03 KB."
          },
          {
            "title": "Compress oversized image assets",
            "urgency": "high",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 832.52 KB."
          },
          {
            "title": "Eliminate render-blocking resources",
            "urgency": "high",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering. Estimated render unblocking: 1638 ms."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "medium",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 81.70 KB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "medium",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 81.69 KB."
          },
          {
            "title": "Remove unused JavaScript",
            "urgency": "medium",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 52.75 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": 10,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 7,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "7 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": 167999.33348463685
        },
        "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: 164.06 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: 164.06 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": 5,
        "urgency": "medium",
        "transferBytes": 1961551,
        "css": {
          "unusedBytes": 83649,
          "ratio": 0.0426443156461392,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 54011,
          "duplicatedBytes": 0,
          "ratio": 0.02753484360080365,
          "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": "high",
            "estimatedSavingsBytes": 83649,
            "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": "medium",
            "estimatedSavingsBytes": 54011,
            "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": 1961551,
        "estimatedDeferrableBytes": 221321,
        "renderBlockingMs": 1638,
        "breakdown": {
          "offscreenImageSavings": 83661,
          "unusedJavascriptSavings": 54011,
          "unusedCssSavings": 83649
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 83661,
            "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": "medium",
            "estimatedSavingsBytes": 54011,
            "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": "high",
            "estimatedSavingsBytes": 83649,
            "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": "Eliminate render-blocking resources",
            "area": "render-path",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1638,
            "strategy": "Defer scripts/styles not required for first paint and preload only truly critical assets.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-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 www.barcelona.cat",
            "area": "image",
            "urgency": "high",
            "estimatedSavingsBytes": 261357,
            "url": "https://www.barcelona.cat/sites/default/files/styles/destacat_gran/public/destacat-cultura%20popular4071.jpg?itok=cA32eUx7",
            "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": 64,
        "urgency": "high",
        "providerCount": 7,
        "requestCount": 8,
        "transferBytes": 139668,
        "notGreenCount": 5,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76425,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15565,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7146,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5656,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=61RRZg&url=https%3A%2F%2Fwww.barcelona.cat%2Fes%2Fconocebcn",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "high",
            "detail": "Track 7 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."
          },
          {
            "title": "Prioritize greener alternatives for third-party providers",
            "urgency": "high",
            "detail": "5 third-party script origin(s) are not confirmed green in the Green Web Foundation dataset."
          }
        ]
      },
      "redundancy": {
        "score": 14,
        "urgency": "medium",
        "transferBytes": 1961551,
        "estimatedRedundantBytes": 137660,
        "redundancyRatio": 0.07017915924694285,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 83649,
            "displayValue": "Est savings of 82 KiB"
          },
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 54011,
            "displayValue": "Est savings of 53 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 83649,
            "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 unused javascript",
            "urgency": "medium",
            "estimatedSavingsBytes": 54011,
            "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 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": 33,
        "urgency": "high",
        "totalTransferBytes": 1961551,
        "heavyRequestCount": 9,
        "heavyBytes": 1128139,
        "heavyRatio": 0.5751260099788382,
        "heavyRequests": [
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/destacat_gran/public/destacat-cultura%20popular4071.jpg?itok=cA32eUx7",
            "transferSize": 261357,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/destacat_gran/public/dues-nenes-conversen-assegudes-als-bancs_528x228px_2.jpg?itok=bx8tHvwg",
            "transferSize": 181501,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/destacat_gran/public/biblioteca2_528x228.jpg?itok=M55yvOgb",
            "transferSize": 156163,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/destacat_gran/public/llibreria_528x228_0.jpg?itok=KJ5nOJh0",
            "transferSize": 142303,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/distribuidora_banner_menu/public/memoria_tradicio.jpg?itok=j2Tlac4l",
            "transferSize": 112975,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "transferSize": 90560,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "transferSize": 76425,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "cdn.matomo.cloud"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament/fonts/icoajuntament.ttf?8aaig7",
            "transferSize": 54920,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/css/css_qDD4BCxE8K-iT7MRORwp32v03DlJblP9-xrYwOBWlQo.css?delta=5&language=es&theme=barcelonacat_theme&include=eJyFz0FqxTAMBNALxd-LHsiMHTVxcSQjyenP7Wso_FJI6Upi5m0GH4MdB7EnnNXE4vcJ6HXJ0EJNGAWe5CTVupLFqUdwkTb7v0zHRuGs9Pkb-E4HxSzi5oqeysp34B1crizPu25rktGC-dUqb3eiFgl47boTJmNmycCW3v4DXWXJhdNkivj6Ej2dlNGWDsU21-wWVx0d7fGTPAb3kVu1ndbFLnM6YobRF2idlFA&tcut5n",
            "transferSize": 51935,
            "resourceType": "stylesheet",
            "mimeType": "text/css",
            "domain": "www.barcelona.cat"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "image",
            "count": 5,
            "transferBytes": 854299
          },
          {
            "resourceType": "font",
            "count": 2,
            "transferBytes": 145480
          },
          {
            "resourceType": "script",
            "count": 1,
            "transferBytes": 76425
          },
          {
            "resourceType": "stylesheet",
            "count": 1,
            "transferBytes": 51935
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.barcelona.cat",
            "count": 8,
            "transferBytes": 1051714
          },
          {
            "domain": "cdn.matomo.cloud",
            "count": 1,
            "transferBytes": 76425
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Lazy-load offscreen images and media galleries",
            "urgency": "medium",
            "estimatedSavingsBytes": 83661,
            "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": "medium",
            "estimatedSavingsBytes": 54011,
            "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": "Defer non-critical UI modules until after first render",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "strategy": "Keep only above-the-fold resources in the initial path; hydrate or import secondary modules later.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 www.barcelona.cat",
            "urgency": "medium",
            "estimatedSavingsBytes": 261357,
            "strategy": "Serve a smaller placeholder first and load this asset only when the user scrolls to or requests the component.",
            "url": "https://www.barcelona.cat/sites/default/files/styles/destacat_gran/public/destacat-cultura%20popular4071.jpg?itok=cA32eUx7",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 53 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 53 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,
          "displayValue": "Est savings of 82 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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 82 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,
          "displayValue": "Est savings of 1,013 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,013 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 833 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 833 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,
          "displayValue": "Est savings of 82 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 82 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": "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": 0,
          "displayValue": "Est savings of 1,640 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 Eliminate render-blocking resources\n\n- Lighthouse audit: render-blocking-resources\n- Current value: Est savings of 1,640 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\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": "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": 0.87,
          "displayValue": "3.6 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 Speed Index\n\n- Lighthouse audit: speed-index\n- Current value: 3.6 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\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": "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": "1,080 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: 1,080 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://barcelona.cat/es/diada-nacional-de-cataluna-2022",
      "status": "ok",
      "finalUrl": "https://www.barcelona.cat/es/diada-nacional-de-cataluna-2022",
      "performanceScore": 0.48,
      "bestPracticesScore": 1,
      "transferBytes": 851607,
      "co2Grams": 0.3262348018098,
      "greenWeb": {
        "page": {
          "hostname": "www.barcelona.cat",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-13T22:38:00.231825",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.barcelona.cat",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76425,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "stylesheet",
            "requestCount": 1,
            "transferBytes": 24654,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15565,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7145,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 4116,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/css/bcn-avisos.css",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "fonts.googleapis.com",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 2461,
            "sampleUrl": "https://fonts.googleapis.com/css?family=Source+Sans+3:200,200i,300,300i,400,400i,500,500i,600,600i,700,700i,900,900i",
            "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
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=kzTRMD&url=https%3A%2F%2Fwww.barcelona.cat%2Fes%2Fdiada-nacional-de-cataluna-2022",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 10,
          "greenCount": 4,
          "notGreenCount": 7,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 60,
        "urgency": "high",
        "pageElementOccurrences": 1,
        "uniqueElementsAssessed": 1,
        "reusedFromCacheCount": 1,
        "components": [
          {
            "signature": "form|get|/es/|input|text|query|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "text",
            "fieldName": "query",
            "formContext": "form|get|/es/",
            "hasLabel": true,
            "hasValidationRule": false,
            "hasErrorMessagingHook": false,
            "toolingFriendly": false,
            "assessment": {
              "score": 60,
              "urgency": "high",
              "issues": [
                "No explicit validation rule",
                "No error messaging hook",
                "Missing autocomplete for tooling support"
              ],
              "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.",
                "Provide meaningful autocomplete values to support browsers and assistive tooling."
              ]
            },
            "reusedFromCache": true
          }
        ],
        "recommendations": [
          {
            "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."
          },
          {
            "title": "Missing autocomplete for tooling support",
            "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": "Diada 2022 | Web de Barcelona | Ayuntamiento de Barcelona",
          "lang": "es",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "Actos, actividades, puertas abiertas, manifestaciones, afectaciones al tráfico y transporte público y recomendaciones de movilidad en Barcelona durante el 11 de setiembre, la Diada Nacional de Cataluña 2022.",
          "robots": "",
          "canonical": "https://www.barcelona.cat/es/diada-nacional-de-cataluna-2022",
          "ogTitle": "Diada 2022 | Web de Barcelona | Ayuntamiento de Barcelona",
          "ogDescription": "Actos, actividades, puertas abiertas, manifestaciones, afectaciones al tráfico y transporte público y recomendaciones de movilidad en Barcelona durante el 11 de setiembre, la Diada Nacional de Cataluña 2022.",
          "ogType": "Web",
          "ogUrl": "https://www.barcelona.cat/es/diada-nacional-de-cataluna-2022",
          "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": 33,
          "tabletSmallTapTargets": 31,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 33,
            "oversizedMedia": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 31,
            "oversizedMedia": 0
          }
        ],
        "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 31 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 59,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": true,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": true,
          "externalScriptCount": 7,
          "externalScriptsWithoutIntegrity": 7,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "cache-control": "max-age=300, public",
            "content-encoding": "gzip",
            "content-language": "es",
            "content-length": "9792",
            "content-type": "text/html; charset=UTF-8",
            "date": "Mon, 13 Apr 2026 22:44:19 GMT",
            "etag": "\"1776120258-gzip\"",
            "expires": "Sun, 19 Nov 1978 05:00:00 GMT",
            "last-modified": "Mon, 13 Apr 2026 22:44:18 GMT",
            "server": "nginx",
            "vary": "Cookie,Accept-Encoding",
            "via": "1.1 ca2190123e61f1744d1210c24c87c840.cloudfront.net (CloudFront)",
            "x-amz-cf-id": "5HpZiczrZ2zJUYNxyaKnueNJAHUNJW0lMszi7eOa17FV8p_9rEFx5g==",
            "x-amz-cf-pop": "IAD12-P5",
            "x-cache": "Miss from cloudfront",
            "x-content-type-options": "nosniff",
            "x-frame-options": "SAMEORIGIN",
            "x-generator": "Drupal 10 (https://www.drupal.org)"
          },
          "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": "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": "7 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 25,
        "urgency": "low",
        "origin": "https://www.barcelona.cat",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://www.barcelona.cat/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/sitemap.xml",
            "found": true,
            "status": 200,
            "contentType": "application/xml; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/manifest.webmanifest",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/favicon.ico",
            "found": true,
            "status": 200,
            "contentType": "image/x-icon"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "low",
            "detail": "Missing beneficial file(s): /.well-known/security.txt, /manifest.webmanifest."
          }
        ]
      },
      "mediaHints": {
        "score": 45,
        "urgency": "medium",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 12,
          "imagesWithLazy": 1,
          "imagesWithoutLazy": 11
        },
        "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": "11 of 12 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 85,
        "urgency": "medium",
        "data": {
          "hasPrintStyles": true,
          "hasReducedMotion": true,
          "media": {
            "totalImages": 17,
            "lazyImages": 2,
            "totalIframes": 1,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "\"Source Sans Pro\", \"Helvetica Neue\", Helvetica, Arial, sans-serif",
            "usesSystemFont": true
          },
          "tracking": {
            "count": 0,
            "scripts": []
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 2/17 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": "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"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 22,
        "urgency": "low",
        "totalEstimatedSavingsBytes": 187330.25,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Use modern image compression formats",
            "urgency": "medium",
            "estimatedSavingsBytes": 129298.25,
            "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size."
          },
          {
            "id": "uses-optimized-images",
            "title": "Improve image encoding quality/size",
            "urgency": "medium",
            "estimatedSavingsBytes": 58032,
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings."
          }
        ],
        "recommendations": [
          {
            "title": "Use modern image compression formats",
            "urgency": "medium",
            "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size. Estimated savings: 126.27 KB."
          },
          {
            "title": "Improve image encoding quality/size",
            "urgency": "medium",
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 56.67 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": 385340.25,
        "totalEstimatedBlockingMs": 882,
        "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": 129298.25,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 126 KiB",
            "urgency": "medium",
            "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": 83661,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 82 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": 81868,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 80 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-css-rules"
          },
          {
            "id": "uses-optimized-images",
            "title": "Compress oversized image assets",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss.",
            "estimatedSavingsBytes": 58032,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 57 KiB",
            "urgency": "medium",
            "sourceAuditId": "uses-optimized-images"
          },
          {
            "id": "render-blocking-resources",
            "title": "Eliminate render-blocking resources",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering.",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 882,
            "displayValue": "Est savings of 880 ms",
            "urgency": "medium",
            "sourceAuditId": "render-blocking-resources"
          },
          {
            "id": "unused-javascript",
            "title": "Remove unused JavaScript",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code.",
            "estimatedSavingsBytes": 32481,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 32 KiB",
            "urgency": "low",
            "sourceAuditId": "unused-javascript"
          }
        ],
        "recommendations": [
          {
            "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: 126.27 KB."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "medium",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 81.70 KB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "medium",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 79.95 KB."
          },
          {
            "title": "Compress oversized image assets",
            "urgency": "medium",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 56.67 KB."
          },
          {
            "title": "Eliminate render-blocking resources",
            "urgency": "medium",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering. Estimated render unblocking: 882 ms."
          },
          {
            "title": "Remove unused JavaScript",
            "urgency": "low",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 31.72 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": 10,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 7,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "7 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": 167996.6522346369
        },
        "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: 164.06 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: 164.06 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": "medium",
        "transferBytes": 851607,
        "css": {
          "unusedBytes": 81868,
          "ratio": 0.09613354516813506,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 32481,
          "duplicatedBytes": 0,
          "ratio": 0.03814083256713484,
          "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": "high",
            "estimatedSavingsBytes": 81868,
            "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": "medium",
            "estimatedSavingsBytes": 32481,
            "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": "medium",
        "transferBytes": 851607,
        "estimatedDeferrableBytes": 198010,
        "renderBlockingMs": 882,
        "breakdown": {
          "offscreenImageSavings": 83661,
          "unusedJavascriptSavings": 32481,
          "unusedCssSavings": 81868
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 83661,
            "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": "medium",
            "estimatedSavingsBytes": 32481,
            "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": 81868,
            "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": "Eliminate render-blocking resources",
            "area": "render-path",
            "urgency": "medium",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 882,
            "strategy": "Defer scripts/styles not required for first paint and preload only truly critical assets.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-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 www.barcelona.cat",
            "area": "font",
            "urgency": "medium",
            "estimatedSavingsBytes": 90561,
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "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 www.barcelona.cat",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 84135,
            "url": "https://www.barcelona.cat/themes/barcelonacat_theme/images/menu/viula.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 cdn.matomo.cloud",
            "area": "script",
            "urgency": "medium",
            "estimatedSavingsBytes": 76425,
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.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": 64,
        "urgency": "high",
        "providerCount": 7,
        "requestCount": 8,
        "transferBytes": 139457,
        "notGreenCount": 5,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76425,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15565,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7145,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=kzTRMD&url=https%3A%2F%2Fwww.barcelona.cat%2Fes%2Fdiada-nacional-de-cataluna-2022",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "high",
            "detail": "Track 7 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."
          },
          {
            "title": "Prioritize greener alternatives for third-party providers",
            "urgency": "high",
            "detail": "5 third-party script origin(s) are not confirmed green in the Green Web Foundation dataset."
          }
        ]
      },
      "redundancy": {
        "score": 17,
        "urgency": "low",
        "transferBytes": 851607,
        "estimatedRedundantBytes": 114349,
        "redundancyRatio": 0.1342743777352699,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 81868,
            "displayValue": "Est savings of 80 KiB"
          },
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 32481,
            "displayValue": "Est savings of 32 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 81868,
            "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 unused javascript",
            "urgency": "medium",
            "estimatedSavingsBytes": 32481,
            "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 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": 19,
        "urgency": "medium",
        "totalTransferBytes": 851607,
        "heavyRequestCount": 4,
        "heavyBytes": 271012,
        "heavyRatio": 0.318235993832836,
        "heavyRequests": [
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "transferSize": 90561,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "transferSize": 76425,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "cdn.matomo.cloud"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament/fonts/icoajuntament.ttf?8aaig7",
            "transferSize": 54920,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/css/css_evpTRQTawGYS1Ro7RbXq3hBxwat7AU-RJm1V8ZgzeaE.css?delta=5&language=es&theme=barcelonacat_theme&include=eJyFzkEKwzAMBMAPxfjQB5m1I1IXRzKSkja_r6EQKKT0pGV3DsJjY8dK7Al7NbH4OQG9ThlaqAmjwJPspFpnsjj0Flykjf2X6Vgo7JWe38DvtFLMIm6u6KnMfAWWJhktmB-t8nIlapGA8_crYbKNLhnY0u0f6CpTLpwGU8QzJXo5KaNNdpjTGjOM3gg5eRY&tcut5n",
            "transferSize": 49106,
            "resourceType": "stylesheet",
            "mimeType": "text/css",
            "domain": "www.barcelona.cat"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "font",
            "count": 2,
            "transferBytes": 145481
          },
          {
            "resourceType": "script",
            "count": 1,
            "transferBytes": 76425
          },
          {
            "resourceType": "stylesheet",
            "count": 1,
            "transferBytes": 49106
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.barcelona.cat",
            "count": 3,
            "transferBytes": 194587
          },
          {
            "domain": "cdn.matomo.cloud",
            "count": 1,
            "transferBytes": 76425
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Lazy-load offscreen images and media galleries",
            "urgency": "medium",
            "estimatedSavingsBytes": 83661,
            "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": "Defer non-critical UI modules until after first render",
            "urgency": "medium",
            "estimatedSavingsBytes": 0,
            "strategy": "Keep only above-the-fold resources in the initial path; hydrate or import secondary modules later.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 www.barcelona.cat",
            "urgency": "medium",
            "estimatedSavingsBytes": 90561,
            "strategy": "Subset or defer this font so full font payloads are only fetched when needed.",
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 cdn.matomo.cloud",
            "urgency": "medium",
            "estimatedSavingsBytes": 76425,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.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.03,
          "displayValue": "7.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: 7.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 32 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 32 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,
          "displayValue": "Est savings of 80 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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 80 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,
          "displayValue": "Est savings of 126 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 126 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 57 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 57 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,
          "displayValue": "Est savings of 82 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 82 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": "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": 0,
          "displayValue": "Est savings of 880 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 Eliminate render-blocking resources\n\n- Lighthouse audit: render-blocking-resources\n- Current value: Est savings of 880 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\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": "server-response-time",
          "title": "Reduce initial server response time",
          "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": 0,
          "displayValue": "Root document took 640 ms",
          "impact": "high",
          "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 Reduce initial server response time\n\n- Lighthouse audit: server-response-time\n- Current value: Root document took 640 ms\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": "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": 0.76,
          "displayValue": "4.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 Speed Index\n\n- Lighthouse audit: speed-index\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\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": "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": "916 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: 916 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://barcelona.cat/es/implicate",
      "status": "ok",
      "finalUrl": "https://www.barcelona.cat/es/implicate",
      "performanceScore": 0.63,
      "bestPracticesScore": 1,
      "transferBytes": 1707522,
      "co2Grams": 0.6541199182908001,
      "greenWeb": {
        "page": {
          "hostname": "www.barcelona.cat",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-13T22:38:00.231825",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.barcelona.cat",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76426,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "stylesheet",
            "requestCount": 1,
            "transferBytes": 24654,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15565,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7151,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 4128,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/css/bcn-avisos.css",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2860,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "fonts.googleapis.com",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 2461,
            "sampleUrl": "https://fonts.googleapis.com/css?family=Source+Sans+3:200,200i,300,300i,400,400i,500,500i,600,600i,700,700i,900,900i",
            "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
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=E9epT2&url=https%3A%2F%2Fwww.barcelona.cat%2Fes%2Fimplicate",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 10,
          "greenCount": 4,
          "notGreenCount": 7,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 60,
        "urgency": "high",
        "pageElementOccurrences": 1,
        "uniqueElementsAssessed": 1,
        "reusedFromCacheCount": 1,
        "components": [
          {
            "signature": "form|get|/es/|input|text|query|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "text",
            "fieldName": "query",
            "formContext": "form|get|/es/",
            "hasLabel": true,
            "hasValidationRule": false,
            "hasErrorMessagingHook": false,
            "toolingFriendly": false,
            "assessment": {
              "score": 60,
              "urgency": "high",
              "issues": [
                "No explicit validation rule",
                "No error messaging hook",
                "Missing autocomplete for tooling support"
              ],
              "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.",
                "Provide meaningful autocomplete values to support browsers and assistive tooling."
              ]
            },
            "reusedFromCache": true
          }
        ],
        "recommendations": [
          {
            "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."
          },
          {
            "title": "Missing autocomplete for tooling support",
            "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": "Implícate | Barcelona.cat | Ayuntamiento de Barcelona",
          "lang": "es",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "Conoce los proyectos de innovación y participación que transforman Barcelona. Implícate y ayuda a lograr una ciudad mejor para todos.",
          "robots": "",
          "canonical": "https://www.barcelona.cat/es/implicate",
          "ogTitle": "Implícate",
          "ogDescription": "Tu participación es el motor de Barcelona. Descubre cómo implicarte en los proyectos de innovación que buscan mejorar la calidad de vida en nuestra ciudad.",
          "ogType": "Web",
          "ogUrl": "https://www.barcelona.cat/es/implicate",
          "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": 47,
          "tabletSmallTapTargets": 43,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 47,
            "oversizedMedia": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 43,
            "oversizedMedia": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 47 small targets on mobile and 43 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 59,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": true,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": true,
          "externalScriptCount": 7,
          "externalScriptsWithoutIntegrity": 7,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "cache-control": "max-age=300, public",
            "content-encoding": "gzip",
            "content-language": "es",
            "content-length": "18019",
            "content-type": "text/html; charset=UTF-8",
            "date": "Mon, 13 Apr 2026 22:44:32 GMT",
            "etag": "\"1776120271-gzip\"",
            "expires": "Sun, 19 Nov 1978 05:00:00 GMT",
            "last-modified": "Mon, 13 Apr 2026 22:44:31 GMT",
            "server": "nginx",
            "vary": "Cookie,Accept-Encoding",
            "via": "1.1 ca2190123e61f1744d1210c24c87c840.cloudfront.net (CloudFront)",
            "x-amz-cf-id": "tjnlLsc6K3L-HjnS9SVpUsrscFI_bhJpx3-wsbRzpepNkoNN9RAELQ==",
            "x-amz-cf-pop": "IAD12-P5",
            "x-cache": "Miss from cloudfront",
            "x-content-type-options": "nosniff",
            "x-frame-options": "SAMEORIGIN",
            "x-generator": "Drupal 10 (https://www.drupal.org)"
          },
          "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": "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": "7 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 25,
        "urgency": "low",
        "origin": "https://www.barcelona.cat",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://www.barcelona.cat/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/sitemap.xml",
            "found": true,
            "status": 200,
            "contentType": "application/xml; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/manifest.webmanifest",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/favicon.ico",
            "found": true,
            "status": 200,
            "contentType": "image/x-icon"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "low",
            "detail": "Missing beneficial file(s): /.well-known/security.txt, /manifest.webmanifest."
          }
        ]
      },
      "mediaHints": {
        "score": 20,
        "urgency": "low",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 65,
          "imagesWithLazy": 53,
          "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."
          }
        ]
      },
      "wsgCustom": {
        "score": 85,
        "urgency": "medium",
        "data": {
          "hasPrintStyles": true,
          "hasReducedMotion": true,
          "media": {
            "totalImages": 70,
            "lazyImages": 54,
            "totalIframes": 1,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "\"Source Sans Pro\", \"Helvetica Neue\", Helvetica, Arial, sans-serif",
            "usesSystemFont": true
          },
          "tracking": {
            "count": 0,
            "scripts": []
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 54/70 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": "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"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 88,
        "urgency": "high",
        "totalEstimatedSavingsBytes": 1511005.6,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Use modern image compression formats",
            "urgency": "high",
            "estimatedSavingsBytes": 828099.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": 682906,
            "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: 808.69 KB."
          },
          {
            "title": "Improve image encoding quality/size",
            "urgency": "high",
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 666.90 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": 1741756.6,
        "totalEstimatedBlockingMs": 1957,
        "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": 828099.6,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 809 KiB",
            "urgency": "high",
            "sourceAuditId": "modern-image-formats"
          },
          {
            "id": "uses-optimized-images",
            "title": "Compress oversized image assets",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss.",
            "estimatedSavingsBytes": 682906,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 667 KiB",
            "urgency": "high",
            "sourceAuditId": "uses-optimized-images"
          },
          {
            "id": "render-blocking-resources",
            "title": "Eliminate render-blocking resources",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering.",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1957,
            "displayValue": "Est savings of 1,960 ms",
            "urgency": "high",
            "sourceAuditId": "render-blocking-resources"
          },
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 83661,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 82 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": 83301,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 81 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-css-rules"
          },
          {
            "id": "unused-javascript",
            "title": "Remove unused JavaScript",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code.",
            "estimatedSavingsBytes": 63789,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 62 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-javascript"
          }
        ],
        "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: 808.69 KB."
          },
          {
            "title": "Compress oversized image assets",
            "urgency": "high",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 666.90 KB."
          },
          {
            "title": "Eliminate render-blocking resources",
            "urgency": "high",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering. Estimated render unblocking: 1957 ms."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "medium",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 81.70 KB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "medium",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 81.35 KB."
          },
          {
            "title": "Remove unused JavaScript",
            "urgency": "medium",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 62.29 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": 10,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 7,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "7 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": 168020.9332053073
        },
        "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: 164.08 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: 164.08 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": "medium",
        "transferBytes": 1707522,
        "css": {
          "unusedBytes": 83301,
          "ratio": 0.048784730152817944,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 63789,
          "duplicatedBytes": 0,
          "ratio": 0.03735764458671689,
          "auditIds": [
            "unused-javascript",
            "duplicated-javascript"
          ]
        },
        "html": {
          "estimatedPenalty": 0.25,
          "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": "high",
            "estimatedSavingsBytes": 83301,
            "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": "medium",
            "estimatedSavingsBytes": 63789,
            "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": 1707522,
        "estimatedDeferrableBytes": 230751,
        "renderBlockingMs": 1957,
        "breakdown": {
          "offscreenImageSavings": 83661,
          "unusedJavascriptSavings": 63789,
          "unusedCssSavings": 83301
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 83661,
            "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": "medium",
            "estimatedSavingsBytes": 63789,
            "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": "high",
            "estimatedSavingsBytes": 83301,
            "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": "Eliminate render-blocking resources",
            "area": "render-path",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1957,
            "strategy": "Defer scripts/styles not required for first paint and preload only truly critical assets.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-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 www.barcelona.cat",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 113410,
            "url": "https://www.barcelona.cat/sites/default/files/styles/destacat_petit/public/foment_de_ciutat_ess_ocupacio_barris_252x228_3.jpg?itok=2zKuqIvu",
            "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 www.barcelona.cat",
            "area": "font",
            "urgency": "medium",
            "estimatedSavingsBytes": 90559,
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "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": 64,
        "urgency": "high",
        "providerCount": 7,
        "requestCount": 8,
        "transferBytes": 139463,
        "notGreenCount": 5,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76426,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15565,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7151,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2860,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=E9epT2&url=https%3A%2F%2Fwww.barcelona.cat%2Fes%2Fimplicate",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "high",
            "detail": "Track 7 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."
          },
          {
            "title": "Prioritize greener alternatives for third-party providers",
            "urgency": "high",
            "detail": "5 third-party script origin(s) are not confirmed green in the Green Web Foundation dataset."
          }
        ]
      },
      "redundancy": {
        "score": 25,
        "urgency": "medium",
        "transferBytes": 1707522,
        "estimatedRedundantBytes": 147090,
        "redundancyRatio": 0.08614237473953483,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 83301,
            "displayValue": "Est savings of 81 KiB"
          },
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 63789,
            "displayValue": "Est savings of 62 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 83301,
            "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 unused javascript",
            "urgency": "medium",
            "estimatedSavingsBytes": 63789,
            "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 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": 16,
        "urgency": "medium",
        "totalTransferBytes": 1707522,
        "heavyRequestCount": 5,
        "heavyBytes": 387251,
        "heavyRatio": 0.22679122143082198,
        "heavyRequests": [
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/destacat_petit/public/foment_de_ciutat_ess_ocupacio_barris_252x228_3.jpg?itok=2zKuqIvu",
            "transferSize": 113410,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "transferSize": 90559,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "transferSize": 76426,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "cdn.matomo.cloud"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament/fonts/icoajuntament.ttf?8aaig7",
            "transferSize": 54920,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/css/css_qDD4BCxE8K-iT7MRORwp32v03DlJblP9-xrYwOBWlQo.css?delta=5&language=es&theme=barcelonacat_theme&include=eJyFz8GOwyAMBNAfCuXQD0ID8SasiI2wSZu_X6RKXa3EqidbM-8y-O5sOIgt4Mwq6l_HoeYloiUqwkiwICe1lldSP3R3JlJG_5-p2MidmR5_ge10kI8iptZQQ1p5Br7A6YrynHVbkYji1K6SeZuJnMThvWsm5FFmsUofWVCwhvsnUJssMXEYrMG_v0BPo8YoS0XDNkbu6tfWK8rtN7l1rj2WrDuti15qdPgIpR8d6Z1O&tcut5n",
            "transferSize": 51936,
            "resourceType": "stylesheet",
            "mimeType": "text/css",
            "domain": "www.barcelona.cat"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "font",
            "count": 2,
            "transferBytes": 145479
          },
          {
            "resourceType": "image",
            "count": 1,
            "transferBytes": 113410
          },
          {
            "resourceType": "script",
            "count": 1,
            "transferBytes": 76426
          },
          {
            "resourceType": "stylesheet",
            "count": 1,
            "transferBytes": 51936
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.barcelona.cat",
            "count": 4,
            "transferBytes": 310825
          },
          {
            "domain": "cdn.matomo.cloud",
            "count": 1,
            "transferBytes": 76426
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Lazy-load offscreen images and media galleries",
            "urgency": "medium",
            "estimatedSavingsBytes": 83661,
            "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": "medium",
            "estimatedSavingsBytes": 63789,
            "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": "Defer non-critical UI modules until after first render",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "strategy": "Keep only above-the-fold resources in the initial path; hydrate or import secondary modules later.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 www.barcelona.cat",
            "urgency": "medium",
            "estimatedSavingsBytes": 113410,
            "strategy": "Serve a smaller placeholder first and load this asset only when the user scrolls to or requests the component.",
            "url": "https://www.barcelona.cat/sites/default/files/styles/destacat_petit/public/foment_de_ciutat_ess_ocupacio_barris_252x228_3.jpg?itok=2zKuqIvu",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 www.barcelona.cat",
            "urgency": "medium",
            "estimatedSavingsBytes": 90559,
            "strategy": "Subset or defer this font so full font payloads are only fetched when needed.",
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 cdn.matomo.cloud",
            "urgency": "medium",
            "estimatedSavingsBytes": 76426,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.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.04,
          "displayValue": "7.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: 7.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 62 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 62 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,
          "displayValue": "Est savings of 81 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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 81 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,
          "displayValue": "Est savings of 809 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 809 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 667 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 667 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,
          "displayValue": "Est savings of 82 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 82 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": "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": 0,
          "displayValue": "Est savings of 1,960 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 Eliminate render-blocking resources\n\n- Lighthouse audit: render-blocking-resources\n- Current value: Est savings of 1,960 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\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": "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,
          "displayValue": "1,443 elements",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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: 1,443 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"
        },
        {
          "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": 0.82,
          "displayValue": "3.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 Speed Index\n\n- Lighthouse audit: speed-index\n- Current value: 3.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\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"
        }
      ]
    },
    {
      "url": "https://barcelona.cat/es/que-hacer-en-bcn",
      "status": "ok",
      "finalUrl": "https://www.barcelona.cat/es/que-hacer-en-bcn",
      "performanceScore": 0.59,
      "bestPracticesScore": 1,
      "transferBytes": 2393048,
      "co2Grams": 0.9167321781072001,
      "greenWeb": {
        "page": {
          "hostname": "www.barcelona.cat",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-13T22:38:00.231825",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.barcelona.cat",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76425,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "stylesheet",
            "requestCount": 1,
            "transferBytes": 24654,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15566,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7163,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 4112,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/css/bcn-avisos.css",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "fonts.googleapis.com",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 2461,
            "sampleUrl": "https://fonts.googleapis.com/css?family=Source+Sans+3:200,200i,300,300i,400,400i,500,500i,600,600i,700,700i,900,900i",
            "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
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=0RfsCL&url=https%3A%2F%2Fwww.barcelona.cat%2Fes%2Fque-hacer-en-bcn",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 10,
          "greenCount": 4,
          "notGreenCount": 7,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 60,
        "urgency": "high",
        "pageElementOccurrences": 1,
        "uniqueElementsAssessed": 1,
        "reusedFromCacheCount": 1,
        "components": [
          {
            "signature": "form|get|/es/|input|text|query|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "text",
            "fieldName": "query",
            "formContext": "form|get|/es/",
            "hasLabel": true,
            "hasValidationRule": false,
            "hasErrorMessagingHook": false,
            "toolingFriendly": false,
            "assessment": {
              "score": 60,
              "urgency": "high",
              "issues": [
                "No explicit validation rule",
                "No error messaging hook",
                "Missing autocomplete for tooling support"
              ],
              "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.",
                "Provide meaningful autocomplete values to support browsers and assistive tooling."
              ]
            },
            "reusedFromCache": true
          }
        ],
        "recommendations": [
          {
            "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."
          },
          {
            "title": "Missing autocomplete for tooling support",
            "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": "Qué hacer en Barcelona | Barcelona.cat | Ayuntamiento de Barcelona",
          "lang": "es",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "Consulta la agenda de actividades, los cursos, las propuestas de ocio, los parques, las playas, el comercio y todo aquello que te ofrece Barcelona.",
          "robots": "",
          "canonical": "https://www.barcelona.cat/es/que-hacer-en-bcn",
          "ogTitle": "Descubre todo lo que puedes hacer en Barcelona",
          "ogDescription": "¡No te pierdas nada! Explora la guía de actividades de la ciudad: desde cultura hasta centros deportivos y parques en Barcelona.",
          "ogType": "Web",
          "ogUrl": "https://www.barcelona.cat/es/que-hacer-en-bcn",
          "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": 34,
        "urgency": "medium",
        "checks": {
          "testedMobile": true,
          "testedTablet": true,
          "horizontalOverflowOnMobile": false,
          "horizontalOverflowOnTablet": false,
          "mobileSmallTapTargets": 46,
          "tabletSmallTapTargets": 33,
          "fixedWidthOffenders": 2,
          "oversizedMedia": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 1,
            "smallTapTargets": 46,
            "oversizedMedia": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 1,
            "smallTapTargets": 33,
            "oversizedMedia": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 46 small targets on mobile and 33 on tablet."
          },
          {
            "title": "Refactor fixed-width components",
            "urgency": "medium",
            "detail": "2 element(s) exceeded viewport width in tested layouts; use responsive component constraints."
          }
        ]
      },
      "securityLight": {
        "score": 59,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": true,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": true,
          "externalScriptCount": 7,
          "externalScriptsWithoutIntegrity": 7,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "cache-control": "max-age=300, public",
            "content-encoding": "gzip",
            "content-language": "es",
            "content-length": "14331",
            "content-type": "text/html; charset=UTF-8",
            "date": "Mon, 13 Apr 2026 22:44:47 GMT",
            "etag": "\"1776120287-gzip\"",
            "expires": "Sun, 19 Nov 1978 05:00:00 GMT",
            "last-modified": "Mon, 13 Apr 2026 22:44:47 GMT",
            "server": "nginx",
            "vary": "Cookie,Accept-Encoding",
            "via": "1.1 ca2190123e61f1744d1210c24c87c840.cloudfront.net (CloudFront)",
            "x-amz-cf-id": "vNnGVVrdBgMM3kbd2tuHi9kk2-hzpVg1Y7Tg9c1XwhtLr86UcRZWLQ==",
            "x-amz-cf-pop": "IAD12-P5",
            "x-cache": "Miss from cloudfront",
            "x-content-type-options": "nosniff",
            "x-frame-options": "SAMEORIGIN",
            "x-generator": "Drupal 10 (https://www.drupal.org)"
          },
          "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": "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": "7 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 25,
        "urgency": "low",
        "origin": "https://www.barcelona.cat",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://www.barcelona.cat/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/sitemap.xml",
            "found": true,
            "status": 200,
            "contentType": "application/xml; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/manifest.webmanifest",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/favicon.ico",
            "found": true,
            "status": 200,
            "contentType": "image/x-icon"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "low",
            "detail": "Missing beneficial file(s): /.well-known/security.txt, /manifest.webmanifest."
          }
        ]
      },
      "mediaHints": {
        "score": 20,
        "urgency": "low",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 63,
          "imagesWithLazy": 34,
          "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."
          }
        ]
      },
      "wsgCustom": {
        "score": 85,
        "urgency": "medium",
        "data": {
          "hasPrintStyles": true,
          "hasReducedMotion": true,
          "media": {
            "totalImages": 68,
            "lazyImages": 35,
            "totalIframes": 1,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "\"Source Sans Pro\", \"Helvetica Neue\", Helvetica, Arial, sans-serif",
            "usesSystemFont": true
          },
          "tracking": {
            "count": 0,
            "scripts": []
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 35/68 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": "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"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 100,
        "urgency": "high",
        "totalEstimatedSavingsBytes": 2538217.3499999996,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Use modern image compression formats",
            "urgency": "high",
            "estimatedSavingsBytes": 1380798.3499999996,
            "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": 1157419,
            "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: 1.32 MB."
          },
          {
            "title": "Improve image encoding quality/size",
            "urgency": "high",
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 1.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": 2759820.3499999996,
        "totalEstimatedBlockingMs": 1477,
        "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": 1380798.3499999996,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 1,348 KiB",
            "urgency": "high",
            "sourceAuditId": "modern-image-formats"
          },
          {
            "id": "uses-optimized-images",
            "title": "Compress oversized image assets",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss.",
            "estimatedSavingsBytes": 1157419,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 1,130 KiB",
            "urgency": "high",
            "sourceAuditId": "uses-optimized-images"
          },
          {
            "id": "render-blocking-resources",
            "title": "Eliminate render-blocking resources",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering.",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1477,
            "displayValue": "Est savings of 1,480 ms",
            "urgency": "high",
            "sourceAuditId": "render-blocking-resources"
          },
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 83661,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 82 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": 83310,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 81 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-css-rules"
          },
          {
            "id": "unused-javascript",
            "title": "Remove unused JavaScript",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code.",
            "estimatedSavingsBytes": 54632,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 53 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-javascript"
          }
        ],
        "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.32 MB."
          },
          {
            "title": "Compress oversized image assets",
            "urgency": "high",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 1.10 MB."
          },
          {
            "title": "Eliminate render-blocking resources",
            "urgency": "high",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering. Estimated render unblocking: 1477 ms."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "medium",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 81.70 KB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "medium",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 81.36 KB."
          },
          {
            "title": "Remove unused JavaScript",
            "urgency": "medium",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 53.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": 10,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 7,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "7 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": 168015.1459846369
        },
        "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: 164.08 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: 164.08 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": "medium",
        "transferBytes": 2393048,
        "css": {
          "unusedBytes": 83310,
          "ratio": 0.034813342649207206,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 54632,
          "duplicatedBytes": 0,
          "ratio": 0.022829462676887385,
          "auditIds": [
            "unused-javascript",
            "duplicated-javascript"
          ]
        },
        "html": {
          "estimatedPenalty": 0.25,
          "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": "high",
            "estimatedSavingsBytes": 83310,
            "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": "medium",
            "estimatedSavingsBytes": 54632,
            "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": 2393048,
        "estimatedDeferrableBytes": 221603,
        "renderBlockingMs": 1477,
        "breakdown": {
          "offscreenImageSavings": 83661,
          "unusedJavascriptSavings": 54632,
          "unusedCssSavings": 83310
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 83661,
            "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": "medium",
            "estimatedSavingsBytes": 54632,
            "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": "high",
            "estimatedSavingsBytes": 83310,
            "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": "Eliminate render-blocking resources",
            "area": "render-path",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1477,
            "strategy": "Defer scripts/styles not required for first paint and preload only truly critical assets.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-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 www.barcelona.cat",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 131570,
            "url": "https://www.barcelona.cat/sites/default/files/styles/distribuidora_banner_paginat/public/banner_05_2.jpg?itok=v2FZuICQ",
            "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": 64,
        "urgency": "high",
        "providerCount": 7,
        "requestCount": 8,
        "transferBytes": 139476,
        "notGreenCount": 5,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76425,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15566,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7163,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=0RfsCL&url=https%3A%2F%2Fwww.barcelona.cat%2Fes%2Fque-hacer-en-bcn",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "high",
            "detail": "Track 7 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."
          },
          {
            "title": "Prioritize greener alternatives for third-party providers",
            "urgency": "high",
            "detail": "5 third-party script origin(s) are not confirmed green in the Green Web Foundation dataset."
          }
        ]
      },
      "redundancy": {
        "score": 23,
        "urgency": "medium",
        "transferBytes": 2393048,
        "estimatedRedundantBytes": 137942,
        "redundancyRatio": 0.05764280532609459,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 83310,
            "displayValue": "Est savings of 81 KiB"
          },
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 54632,
            "displayValue": "Est savings of 53 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 83310,
            "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 unused javascript",
            "urgency": "medium",
            "estimatedSavingsBytes": 54632,
            "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 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": 21,
        "urgency": "high",
        "totalTransferBytes": 2393048,
        "heavyRequestCount": 8,
        "heavyBytes": 728457,
        "heavyRatio": 0.30440551129772575,
        "heavyRequests": [
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/distribuidora_banner_paginat/public/banner_05_2.jpg?itok=v2FZuICQ",
            "transferSize": 131570,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/distribuidora_banner_menu/public/parcs%20i%20jardins%208789.jpg?itok=uTySxKDK",
            "transferSize": 111800,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/destacat_petit/public/edifici_252x228_3.jpg?itok=lE2rUKx2",
            "transferSize": 105755,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/destacat_petit/public/tibidaboia-252x228.jpg?itok=Qv1xI3_6",
            "transferSize": 105493,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "transferSize": 90559,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "transferSize": 76425,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "cdn.matomo.cloud"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament/fonts/icoajuntament.ttf?8aaig7",
            "transferSize": 54920,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/css/css_qDD4BCxE8K-iT7MRORwp32v03DlJblP9-xrYwOBWlQo.css?delta=6&language=es&theme=barcelonacat_theme&include=eJyFz8FuxCAMBNAfCsuhH4QG4ia0DkbYpJu_L9JKW1VitSdbM-8y-OrFcFCxgDOrqH8ch5qXiJaIpSDBgpzUWl5J_dDdmQiP_pWp2MidmX7-A9vpIB9FTK2hhrSWGfhESVeU-6zbWCLYqV2cyzYTOYnDc9dMKOf07ZASqebINDXSRxYURcPHO1CbLDGVMFiDf36B7katgJeKhm0s3tWvrVfw7S-59VJ75Kw7rYteanT4CKVfKxCiTQ&tcut5n",
            "transferSize": 51935,
            "resourceType": "stylesheet",
            "mimeType": "text/css",
            "domain": "www.barcelona.cat"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "image",
            "count": 4,
            "transferBytes": 454618
          },
          {
            "resourceType": "font",
            "count": 2,
            "transferBytes": 145479
          },
          {
            "resourceType": "script",
            "count": 1,
            "transferBytes": 76425
          },
          {
            "resourceType": "stylesheet",
            "count": 1,
            "transferBytes": 51935
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.barcelona.cat",
            "count": 7,
            "transferBytes": 652032
          },
          {
            "domain": "cdn.matomo.cloud",
            "count": 1,
            "transferBytes": 76425
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Lazy-load offscreen images and media galleries",
            "urgency": "medium",
            "estimatedSavingsBytes": 83661,
            "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": "medium",
            "estimatedSavingsBytes": 54632,
            "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": "Defer non-critical UI modules until after first render",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "strategy": "Keep only above-the-fold resources in the initial path; hydrate or import secondary modules later.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 www.barcelona.cat",
            "urgency": "medium",
            "estimatedSavingsBytes": 131570,
            "strategy": "Serve a smaller placeholder first and load this asset only when the user scrolls to or requests the component.",
            "url": "https://www.barcelona.cat/sites/default/files/styles/distribuidora_banner_paginat/public/banner_05_2.jpg?itok=v2FZuICQ",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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.01,
          "displayValue": "9.0 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: 9.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,
          "displayValue": "Est savings of 53 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 53 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,
          "displayValue": "Est savings of 81 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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 81 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,
          "displayValue": "Est savings of 1,348 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,348 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 1,130 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 1,130 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,
          "displayValue": "Est savings of 82 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 82 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": "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": 0,
          "displayValue": "Est savings of 1,480 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 Eliminate render-blocking resources\n\n- Lighthouse audit: render-blocking-resources\n- Current value: Est savings of 1,480 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\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": "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,
          "displayValue": "1,493 elements",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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: 1,493 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"
        },
        {
          "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": 0.82,
          "displayValue": "3.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 Speed Index\n\n- Lighthouse audit: speed-index\n- Current value: 3.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\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"
        }
      ]
    },
    {
      "url": "https://barcelona.cat/es/trabajo-y-empresa",
      "status": "ok",
      "finalUrl": "https://www.barcelona.cat/es/trabajo-y-empresa",
      "performanceScore": 0.67,
      "bestPracticesScore": 1,
      "transferBytes": 3221177,
      "co2Grams": 1.2339729948078002,
      "greenWeb": {
        "page": {
          "hostname": "www.barcelona.cat",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-13T22:38:00.231825",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.barcelona.cat",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76425,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31745,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "stylesheet",
            "requestCount": 1,
            "transferBytes": 24654,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15566,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7143,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 4111,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/css/bcn-avisos.css",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "fonts.googleapis.com",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 2461,
            "sampleUrl": "https://fonts.googleapis.com/css?family=Source+Sans+3:200,200i,300,300i,400,400i,500,500i,600,600i,700,700i,900,900i",
            "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
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=HCANd6&url=https%3A%2F%2Fwww.barcelona.cat%2Fes%2Ftrabajo-y-empresa",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 10,
          "greenCount": 4,
          "notGreenCount": 7,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 60,
        "urgency": "high",
        "pageElementOccurrences": 1,
        "uniqueElementsAssessed": 1,
        "reusedFromCacheCount": 1,
        "components": [
          {
            "signature": "form|get|/es/|input|text|query|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "text",
            "fieldName": "query",
            "formContext": "form|get|/es/",
            "hasLabel": true,
            "hasValidationRule": false,
            "hasErrorMessagingHook": false,
            "toolingFriendly": false,
            "assessment": {
              "score": 60,
              "urgency": "high",
              "issues": [
                "No explicit validation rule",
                "No error messaging hook",
                "Missing autocomplete for tooling support"
              ],
              "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.",
                "Provide meaningful autocomplete values to support browsers and assistive tooling."
              ]
            },
            "reusedFromCache": true
          }
        ],
        "recommendations": [
          {
            "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."
          },
          {
            "title": "Missing autocomplete for tooling support",
            "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": "Trabajo y empresa | Barcelona.cat | Ayuntamiento de Barcelona",
          "lang": "es",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "Encuentra toda la información, servicios y ayudas para buscar trabajo, emprender un negocio o hacer crecer tu empresa en Barcelona.",
          "robots": "",
          "canonical": "https://www.barcelona.cat/es/trabajo-y-empresa",
          "ogTitle": "Trabajo y empresa en Barcelona",
          "ogDescription": "¿Estás buscando trabajo o quieres emprender? Descubre los servicios y ayudas económicas que ponemos a tu alcance para potenciar tu talento o tu negocio.",
          "ogType": "Web",
          "ogUrl": "https://www.barcelona.cat/es/trabajo-y-empresa",
          "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": 96,
          "tabletSmallTapTargets": 94,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 96,
            "oversizedMedia": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 94,
            "oversizedMedia": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 96 small targets on mobile and 94 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 59,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": true,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": true,
          "externalScriptCount": 7,
          "externalScriptsWithoutIntegrity": 7,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "cache-control": "max-age=300, public",
            "content-encoding": "gzip",
            "content-language": "es",
            "content-length": "17852",
            "content-type": "text/html; charset=UTF-8",
            "date": "Mon, 13 Apr 2026 22:45:02 GMT",
            "etag": "\"1776120302-gzip\"",
            "expires": "Sun, 19 Nov 1978 05:00:00 GMT",
            "last-modified": "Mon, 13 Apr 2026 22:45:02 GMT",
            "server": "nginx",
            "vary": "Cookie,Accept-Encoding",
            "via": "1.1 ca2190123e61f1744d1210c24c87c840.cloudfront.net (CloudFront)",
            "x-amz-cf-id": "ojlzW3s7UzcXkQRL_qtoPEwJ0oFK-Qsx-kFrg-RaD5smdPA_E87t8g==",
            "x-amz-cf-pop": "IAD12-P5",
            "x-cache": "Miss from cloudfront",
            "x-content-type-options": "nosniff",
            "x-frame-options": "SAMEORIGIN",
            "x-generator": "Drupal 10 (https://www.drupal.org)"
          },
          "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": "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": "7 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 25,
        "urgency": "low",
        "origin": "https://www.barcelona.cat",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://www.barcelona.cat/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/sitemap.xml",
            "found": true,
            "status": 200,
            "contentType": "application/xml; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/manifest.webmanifest",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/favicon.ico",
            "found": true,
            "status": 200,
            "contentType": "image/x-icon"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "low",
            "detail": "Missing beneficial file(s): /.well-known/security.txt, /manifest.webmanifest."
          }
        ]
      },
      "mediaHints": {
        "score": 20,
        "urgency": "low",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 48,
          "imagesWithLazy": 37,
          "imagesWithoutLazy": 11
        },
        "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."
          }
        ]
      },
      "wsgCustom": {
        "score": 85,
        "urgency": "medium",
        "data": {
          "hasPrintStyles": true,
          "hasReducedMotion": true,
          "media": {
            "totalImages": 53,
            "lazyImages": 38,
            "totalIframes": 1,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "\"Source Sans Pro\", \"Helvetica Neue\", Helvetica, Arial, sans-serif",
            "usesSystemFont": true
          },
          "tracking": {
            "count": 0,
            "scripts": []
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 38/53 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": "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"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 100,
        "urgency": "high",
        "totalEstimatedSavingsBytes": 3957876.2,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Use modern image compression formats",
            "urgency": "high",
            "estimatedSavingsBytes": 2146336.2,
            "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": 1811540,
            "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: 2.05 MB."
          },
          {
            "title": "Improve image encoding quality/size",
            "urgency": "high",
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings. 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": 4190838.2,
        "totalEstimatedBlockingMs": 1493,
        "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": 2146336.2,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 2,096 KiB",
            "urgency": "high",
            "sourceAuditId": "modern-image-formats"
          },
          {
            "id": "uses-optimized-images",
            "title": "Compress oversized image assets",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss.",
            "estimatedSavingsBytes": 1811540,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 1,769 KiB",
            "urgency": "high",
            "sourceAuditId": "uses-optimized-images"
          },
          {
            "id": "render-blocking-resources",
            "title": "Eliminate render-blocking resources",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering.",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1493,
            "displayValue": "Est savings of 1,490 ms",
            "urgency": "high",
            "sourceAuditId": "render-blocking-resources"
          },
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 91563,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 89 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": 83327,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 81 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-css-rules"
          },
          {
            "id": "unused-javascript",
            "title": "Remove unused JavaScript",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code.",
            "estimatedSavingsBytes": 58072,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 57 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-javascript"
          }
        ],
        "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: 2.05 MB."
          },
          {
            "title": "Compress oversized image assets",
            "urgency": "high",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 1.73 MB."
          },
          {
            "title": "Eliminate render-blocking resources",
            "urgency": "high",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering. Estimated render unblocking: 1493 ms."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "medium",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 89.42 KB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "medium",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 81.37 KB."
          },
          {
            "title": "Remove unused JavaScript",
            "urgency": "medium",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 56.71 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": 10,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 7,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "7 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": 167992.89598463685
        },
        "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: 164.06 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: 164.06 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": "medium",
        "transferBytes": 3221177,
        "css": {
          "unusedBytes": 83327,
          "ratio": 0.025868494652730972,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 58072,
          "duplicatedBytes": 0,
          "ratio": 0.018028192800333544,
          "auditIds": [
            "unused-javascript",
            "duplicated-javascript"
          ]
        },
        "html": {
          "estimatedPenalty": 0.25,
          "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": "high",
            "estimatedSavingsBytes": 83327,
            "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": "medium",
            "estimatedSavingsBytes": 58072,
            "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": 3221177,
        "estimatedDeferrableBytes": 232962,
        "renderBlockingMs": 1493,
        "breakdown": {
          "offscreenImageSavings": 91563,
          "unusedJavascriptSavings": 58072,
          "unusedCssSavings": 83327
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 91563,
            "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": "medium",
            "estimatedSavingsBytes": 58072,
            "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": "high",
            "estimatedSavingsBytes": 83327,
            "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": "Eliminate render-blocking resources",
            "area": "render-path",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1493,
            "strategy": "Defer scripts/styles not required for first paint and preload only truly critical assets.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-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 www.barcelona.cat",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 158268,
            "url": "https://www.barcelona.cat/sites/default/files/styles/distribuidora_central/public/cerques_feina_mercat_laboral_0256_1.jpg?itok=7K0uL1Pt",
            "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": 64,
        "urgency": "high",
        "providerCount": 7,
        "requestCount": 8,
        "transferBytes": 139455,
        "notGreenCount": 5,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76425,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31745,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15566,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7143,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=HCANd6&url=https%3A%2F%2Fwww.barcelona.cat%2Fes%2Ftrabajo-y-empresa",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "high",
            "detail": "Track 7 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."
          },
          {
            "title": "Prioritize greener alternatives for third-party providers",
            "urgency": "high",
            "detail": "5 third-party script origin(s) are not confirmed green in the Green Web Foundation dataset."
          }
        ]
      },
      "redundancy": {
        "score": 22,
        "urgency": "medium",
        "transferBytes": 3221177,
        "estimatedRedundantBytes": 141399,
        "redundancyRatio": 0.04389668745306451,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 83327,
            "displayValue": "Est savings of 81 KiB"
          },
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 58072,
            "displayValue": "Est savings of 57 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 83327,
            "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 unused javascript",
            "urgency": "medium",
            "estimatedSavingsBytes": 58072,
            "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 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": 35,
        "urgency": "high",
        "totalTransferBytes": 3221177,
        "heavyRequestCount": 17,
        "heavyBytes": 1972054,
        "heavyRatio": 0.6122153486132553,
        "heavyRequests": [
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/distribuidora_central/public/cerques_feina_mercat_laboral_0256_1.jpg?itok=7K0uL1Pt",
            "transferSize": 158268,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/distribuidora_central/public/tens%20un%20negoci-nous%20horitzons%203746.jpg?itok=uRlm3ztW",
            "transferSize": 145942,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/distribuidora_central/public/emprenedoria_social_387x223_1.jpg?itok=-8NGDyzF",
            "transferSize": 138862,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/distribuidora_central/public/190331_f_packfotos_panoramiquesnovesciutat_2056_1.jpeg?itok=KiLRcFN5",
            "transferSize": 138694,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/distribuidora_central/public/formaci%C3%B2%20continua-cibernarium%209731.jpg?itok=1IncVAns",
            "transferSize": 133941,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/distribuidora_central/public/tens_un_negoci_sector_estrategic%20_1.jpg?itok=JmsxBSH2",
            "transferSize": 132863,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/distribuidora_central/public/vols_emprendre_ubicat_9592_1.jpg?itok=gtSiB571",
            "transferSize": 132719,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/distribuidora_central/public/Cerques_feina_prestacions_3443_1.jpg?itok=Eooxl3sl",
            "transferSize": 132521,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/distribuidora_central/public/tens_un_negoci_informat_9782_1.jpg?itok=MmDSq1s4",
            "transferSize": 130956,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/distribuidora_central/public/cerques_feina_assesorat_0440_3.jpg?itok=OZiT6AVz",
            "transferSize": 121988,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/distribuidora_central/public/Emprenedoria%20Glories%20Barcelona_387x223_0.jpg?itok=cCavN4Ll",
            "transferSize": 114528,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/distribuidora_central/public/cerques_feina_eines_9597_1.jpg?itok=YbDb1I8d",
            "transferSize": 112171,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/distribuidora_central/public/20210305_presentaciofestivalsperlaculturasegura_02_1.jpeg?itok=gsoM_3vA",
            "transferSize": 104754,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "transferSize": 90560,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "transferSize": 76425,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "cdn.matomo.cloud"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament/fonts/icoajuntament.ttf?8aaig7",
            "transferSize": 54919,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/css/css_qDD4BCxE8K-iT7MRORwp32v03DlJblP9-xrYwOBWlQo.css?delta=5&language=es&theme=barcelonacat_theme&include=eJyFz8GOwyAMBNAfCuXQD0ID8SasiI2wSZu_X6RKXa3EqidbM-8y-O5sOIgt4Mwq6l_HoeYloiUqwkiwICe1lldSP3R3JlJG_5-p2MidmR5_ge10kI8iptZQQ1p5Br7A6YrynHVbkYji1K6SeZuJnMThvWsm5FFmsUofWVCwhvsnUJssMXEYrMG_v0BPo8YoS0XDNkbu6tfWK8rtN7l1rj2WrDuti15qdPgIpR8d6Z1O&tcut5n",
            "transferSize": 51943,
            "resourceType": "stylesheet",
            "mimeType": "text/css",
            "domain": "www.barcelona.cat"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "image",
            "count": 13,
            "transferBytes": 1698207
          },
          {
            "resourceType": "font",
            "count": 2,
            "transferBytes": 145479
          },
          {
            "resourceType": "script",
            "count": 1,
            "transferBytes": 76425
          },
          {
            "resourceType": "stylesheet",
            "count": 1,
            "transferBytes": 51943
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.barcelona.cat",
            "count": 16,
            "transferBytes": 1895629
          },
          {
            "domain": "cdn.matomo.cloud",
            "count": 1,
            "transferBytes": 76425
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Lazy-load offscreen images and media galleries",
            "urgency": "medium",
            "estimatedSavingsBytes": 91563,
            "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": "medium",
            "estimatedSavingsBytes": 58072,
            "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": "Defer non-critical UI modules until after first render",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "strategy": "Keep only above-the-fold resources in the initial path; hydrate or import secondary modules later.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 www.barcelona.cat",
            "urgency": "medium",
            "estimatedSavingsBytes": 158268,
            "strategy": "Serve a smaller placeholder first and load this asset only when the user scrolls to or requests the component.",
            "url": "https://www.barcelona.cat/sites/default/files/styles/distribuidora_central/public/cerques_feina_mercat_laboral_0256_1.jpg?itok=7K0uL1Pt",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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.06,
          "displayValue": "7.0 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.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-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,
          "displayValue": "Est savings of 81 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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 81 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,
          "displayValue": "Est savings of 2,096 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,096 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 1,769 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 1,769 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,
          "displayValue": "Est savings of 89 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 89 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": "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": 0,
          "displayValue": "Est savings of 1,490 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 Eliminate render-blocking resources\n\n- Lighthouse audit: render-blocking-resources\n- Current value: Est savings of 1,490 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\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": "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,
          "displayValue": "1,504 elements",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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: 1,504 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"
        },
        {
          "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": 0.81,
          "displayValue": "4.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 Speed Index\n\n- Lighthouse audit: speed-index\n- Current value: 4.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\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": 0.5,
          "displayValue": "Est savings of 57 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 57 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": "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,146 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,146 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://barcelona.cat/es/vivir-en-bcn",
      "status": "ok",
      "finalUrl": "https://www.barcelona.cat/es/vivir-en-bcn",
      "performanceScore": 0.68,
      "bestPracticesScore": 1,
      "transferBytes": 2326594,
      "co2Grams": 0.8912748867516,
      "greenWeb": {
        "page": {
          "hostname": "www.barcelona.cat",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-13T22:38:00.231825",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.barcelona.cat",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76425,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "stylesheet",
            "requestCount": 1,
            "transferBytes": 24659,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15566,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7146,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 4110,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/css/bcn-avisos.css",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "fonts.googleapis.com",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 2461,
            "sampleUrl": "https://fonts.googleapis.com/css?family=Source+Sans+3:200,200i,300,300i,400,400i,500,500i,600,600i,700,700i,900,900i",
            "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
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=ejwLke&url=https%3A%2F%2Fwww.barcelona.cat%2Fes%2Fvivir-en-bcn",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 10,
          "greenCount": 4,
          "notGreenCount": 7,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 60,
        "urgency": "high",
        "pageElementOccurrences": 1,
        "uniqueElementsAssessed": 1,
        "reusedFromCacheCount": 1,
        "components": [
          {
            "signature": "form|get|/es/|input|text|query|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "text",
            "fieldName": "query",
            "formContext": "form|get|/es/",
            "hasLabel": true,
            "hasValidationRule": false,
            "hasErrorMessagingHook": false,
            "toolingFriendly": false,
            "assessment": {
              "score": 60,
              "urgency": "high",
              "issues": [
                "No explicit validation rule",
                "No error messaging hook",
                "Missing autocomplete for tooling support"
              ],
              "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.",
                "Provide meaningful autocomplete values to support browsers and assistive tooling."
              ]
            },
            "reusedFromCache": true
          }
        ],
        "recommendations": [
          {
            "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."
          },
          {
            "title": "Missing autocomplete for tooling support",
            "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": "Vivir en la ciudad | Barcelona.cat | Ayuntamiento de Barcelona",
          "lang": "es",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "Encuentra toda la información y las ventajas de vivir en la ciudad de Barcelona, una ciudad que se preocupa del bienestar de sus ciudadanos.",
          "robots": "",
          "canonical": "https://www.barcelona.cat/es/vivir-en-bcn",
          "ogTitle": "Vivir en Barcelona",
          "ogDescription": "¡Conecta con la ciudad! Descubre los servicios y ventajas de vivir en una Barcelona que cuida a su gente.",
          "ogType": "Web",
          "ogUrl": "https://www.barcelona.cat/es/vivir-en-bcn",
          "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": 32,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 37,
            "oversizedMedia": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 32,
            "oversizedMedia": 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 32 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 59,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": true,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": true,
          "externalScriptCount": 7,
          "externalScriptsWithoutIntegrity": 7,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "cache-control": "max-age=300, public",
            "content-encoding": "gzip",
            "content-language": "es",
            "content-length": "16036",
            "content-type": "text/html; charset=UTF-8",
            "date": "Mon, 13 Apr 2026 22:45:18 GMT",
            "etag": "\"1776120318-gzip\"",
            "expires": "Sun, 19 Nov 1978 05:00:00 GMT",
            "last-modified": "Mon, 13 Apr 2026 22:45:18 GMT",
            "server": "nginx",
            "vary": "Cookie,Accept-Encoding",
            "via": "1.1 ca2190123e61f1744d1210c24c87c840.cloudfront.net (CloudFront)",
            "x-amz-cf-id": "YY2njMnLHyb16STRfBtBZFgl3vCmYaSFqGgXRrUVs8qCjrb5EpGV_w==",
            "x-amz-cf-pop": "IAD12-P5",
            "x-cache": "Miss from cloudfront",
            "x-content-type-options": "nosniff",
            "x-frame-options": "SAMEORIGIN",
            "x-generator": "Drupal 10 (https://www.drupal.org)"
          },
          "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": "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": "7 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 25,
        "urgency": "low",
        "origin": "https://www.barcelona.cat",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://www.barcelona.cat/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/sitemap.xml",
            "found": true,
            "status": 200,
            "contentType": "application/xml; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/manifest.webmanifest",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/favicon.ico",
            "found": true,
            "status": 200,
            "contentType": "image/x-icon"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "low",
            "detail": "Missing beneficial file(s): /.well-known/security.txt, /manifest.webmanifest."
          }
        ]
      },
      "mediaHints": {
        "score": 20,
        "urgency": "low",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 80,
          "imagesWithLazy": 42,
          "imagesWithoutLazy": 38
        },
        "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."
          }
        ]
      },
      "wsgCustom": {
        "score": 85,
        "urgency": "medium",
        "data": {
          "hasPrintStyles": true,
          "hasReducedMotion": true,
          "media": {
            "totalImages": 85,
            "lazyImages": 43,
            "totalIframes": 1,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "\"Source Sans Pro\", \"Helvetica Neue\", Helvetica, Arial, sans-serif",
            "usesSystemFont": true
          },
          "tracking": {
            "count": 0,
            "scripts": []
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 43/85 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": "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"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 100,
        "urgency": "high",
        "totalEstimatedSavingsBytes": 2401358.55,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Use modern image compression formats",
            "urgency": "high",
            "estimatedSavingsBytes": 1348968.5499999998,
            "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": 1052390,
            "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: 1.29 MB."
          },
          {
            "title": "Improve image encoding quality/size",
            "urgency": "high",
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 1.00 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": 2549898.55,
        "totalEstimatedBlockingMs": 1500,
        "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": 1348968.5499999998,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 1,317 KiB",
            "urgency": "high",
            "sourceAuditId": "modern-image-formats"
          },
          {
            "id": "uses-optimized-images",
            "title": "Compress oversized image assets",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss.",
            "estimatedSavingsBytes": 1052390,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 1,028 KiB",
            "urgency": "high",
            "sourceAuditId": "uses-optimized-images"
          },
          {
            "id": "render-blocking-resources",
            "title": "Eliminate render-blocking resources",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering.",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1500,
            "displayValue": "Est savings of 1,500 ms",
            "urgency": "high",
            "sourceAuditId": "render-blocking-resources"
          },
          {
            "id": "unused-css-rules",
            "title": "Remove unused CSS",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped.",
            "estimatedSavingsBytes": 83415,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 81 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-css-rules"
          },
          {
            "id": "unused-javascript",
            "title": "Remove unused JavaScript",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code.",
            "estimatedSavingsBytes": 54011,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 53 KiB",
            "urgency": "medium",
            "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": 11114,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 11 KiB",
            "urgency": "low",
            "sourceAuditId": "offscreen-images"
          }
        ],
        "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.29 MB."
          },
          {
            "title": "Compress oversized image assets",
            "urgency": "high",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 1.00 MB."
          },
          {
            "title": "Eliminate render-blocking resources",
            "urgency": "high",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering. Estimated render unblocking: 1500 ms."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "medium",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 81.46 KB."
          },
          {
            "title": "Remove unused JavaScript",
            "urgency": "medium",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 52.75 KB."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "low",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 10.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": 10,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 7,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "7 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": 168010.8397346369
        },
        "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: 164.07 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: 164.07 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": 5,
        "urgency": "medium",
        "transferBytes": 2326594,
        "css": {
          "unusedBytes": 83415,
          "ratio": 0.0358528389568614,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 54011,
          "duplicatedBytes": 0,
          "ratio": 0.023214621889336946,
          "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": "high",
            "estimatedSavingsBytes": 83415,
            "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": "medium",
            "estimatedSavingsBytes": 54011,
            "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": 2326594,
        "estimatedDeferrableBytes": 148540,
        "renderBlockingMs": 1500,
        "breakdown": {
          "offscreenImageSavings": 11114,
          "unusedJavascriptSavings": 54011,
          "unusedCssSavings": 83415
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 11114,
            "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": "medium",
            "estimatedSavingsBytes": 54011,
            "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": "high",
            "estimatedSavingsBytes": 83415,
            "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": "Eliminate render-blocking resources",
            "area": "render-path",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1500,
            "strategy": "Defer scripts/styles not required for first paint and preload only truly critical assets.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-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 www.barcelona.cat",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 103804,
            "url": "https://www.barcelona.cat/sites/default/files/styles/distribuidora_banner_menu/public/nens_nenes_paola_2.jpg?itok=uRF8gAbD",
            "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": 64,
        "urgency": "high",
        "providerCount": 7,
        "requestCount": 8,
        "transferBytes": 139459,
        "notGreenCount": 5,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76425,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15566,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7146,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=ejwLke&url=https%3A%2F%2Fwww.barcelona.cat%2Fes%2Fvivir-en-bcn",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "high",
            "detail": "Track 7 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."
          },
          {
            "title": "Prioritize greener alternatives for third-party providers",
            "urgency": "high",
            "detail": "5 third-party script origin(s) are not confirmed green in the Green Web Foundation dataset."
          }
        ]
      },
      "redundancy": {
        "score": 13,
        "urgency": "medium",
        "transferBytes": 2326594,
        "estimatedRedundantBytes": 137426,
        "redundancyRatio": 0.05906746084619835,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 83415,
            "displayValue": "Est savings of 81 KiB"
          },
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 54011,
            "displayValue": "Est savings of 53 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 83415,
            "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 unused javascript",
            "urgency": "medium",
            "estimatedSavingsBytes": 54011,
            "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 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": 12,
        "urgency": "medium",
        "totalTransferBytes": 2326594,
        "heavyRequestCount": 5,
        "heavyBytes": 377652,
        "heavyRatio": 0.16231968276373102,
        "heavyRequests": [
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/distribuidora_banner_menu/public/nens_nenes_paola_2.jpg?itok=uRF8gAbD",
            "transferSize": 103804,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "transferSize": 90561,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "transferSize": 76425,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "cdn.matomo.cloud"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament/fonts/icoajuntament.ttf?8aaig7",
            "transferSize": 54920,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/css/css_qDD4BCxE8K-iT7MRORwp32v03DlJblP9-xrYwOBWlQo.css?delta=5&language=es&theme=barcelonacat_theme&include=eJyFz0FqxTAMBNALxd-LHsiMHTVxcSQjyenP7Wso_FJI6Upi5m0GH4MdB7EnnNXE4vcJ6HXJ0EJNGAWe5CTVupLFqUdwkTb7v0zHRuGs9Pkb-E4HxSzi5oqeysp34B1crizPu25rktGC-dUqb3eiFgl47boTJmNmycCW3v4DXWXJhdNkivj6Ej2dlNGWDsU21-wWVx0d7fGTPAb3kVu1ndbFLnM6YobRF2idlFA&tcut5n",
            "transferSize": 51942,
            "resourceType": "stylesheet",
            "mimeType": "text/css",
            "domain": "www.barcelona.cat"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "font",
            "count": 2,
            "transferBytes": 145481
          },
          {
            "resourceType": "image",
            "count": 1,
            "transferBytes": 103804
          },
          {
            "resourceType": "script",
            "count": 1,
            "transferBytes": 76425
          },
          {
            "resourceType": "stylesheet",
            "count": 1,
            "transferBytes": 51942
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.barcelona.cat",
            "count": 4,
            "transferBytes": 301227
          },
          {
            "domain": "cdn.matomo.cloud",
            "count": 1,
            "transferBytes": 76425
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Split JavaScript by route or interaction",
            "urgency": "medium",
            "estimatedSavingsBytes": 54011,
            "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": "Defer non-critical UI modules until after first render",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "strategy": "Keep only above-the-fold resources in the initial path; hydrate or import secondary modules later.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 www.barcelona.cat",
            "urgency": "medium",
            "estimatedSavingsBytes": 103804,
            "strategy": "Serve a smaller placeholder first and load this asset only when the user scrolls to or requests the component.",
            "url": "https://www.barcelona.cat/sites/default/files/styles/distribuidora_banner_menu/public/nens_nenes_paola_2.jpg?itok=uRF8gAbD",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 www.barcelona.cat",
            "urgency": "medium",
            "estimatedSavingsBytes": 90561,
            "strategy": "Subset or defer this font so full font payloads are only fetched when needed.",
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 cdn.matomo.cloud",
            "urgency": "medium",
            "estimatedSavingsBytes": 76425,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.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.05,
          "displayValue": "7.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: 7.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 53 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 53 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,
          "displayValue": "Est savings of 81 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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 81 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,
          "displayValue": "Est savings of 1,317 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,317 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 1,028 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 1,028 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": "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": 0,
          "displayValue": "Est savings of 1,500 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 Eliminate render-blocking resources\n\n- Lighthouse audit: render-blocking-resources\n- Current value: Est savings of 1,500 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\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": "server-response-time",
          "title": "Reduce initial server response time",
          "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": 0,
          "displayValue": "Root document took 620 ms",
          "impact": "high",
          "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 Reduce initial server response time\n\n- Lighthouse audit: server-response-time\n- Current value: Root document took 620 ms\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": "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": 0.85,
          "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 Speed Index\n\n- Lighthouse audit: speed-index\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\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": "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 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 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": "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": "1,411 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: 1,411 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://barcelona.cat/es/aviso-legal/banoasistido",
      "status": "ok",
      "finalUrl": "https://www.barcelona.cat/es/aviso-legal/banoasistido",
      "performanceScore": 0.69,
      "bestPracticesScore": 1,
      "transferBytes": 775358,
      "co2Grams": 0.2970252281412,
      "greenWeb": {
        "page": {
          "hostname": "www.barcelona.cat",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-13T22:38:00.231825",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.barcelona.cat",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76426,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "stylesheet",
            "requestCount": 1,
            "transferBytes": 24654,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15565,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7145,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5656,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 4111,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/css/bcn-avisos.css",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "fonts.googleapis.com",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 2461,
            "sampleUrl": "https://fonts.googleapis.com/css?family=Source+Sans+3:200,200i,300,300i,400,400i,500,500i,600,600i,700,700i,900,900i",
            "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
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=tpmBgX&url=https%3A%2F%2Fwww.barcelona.cat%2Fes%2Faviso-legal%2Fbanoasistido",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 10,
          "greenCount": 4,
          "notGreenCount": 7,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 60,
        "urgency": "high",
        "pageElementOccurrences": 1,
        "uniqueElementsAssessed": 1,
        "reusedFromCacheCount": 1,
        "components": [
          {
            "signature": "form|get|/es/|input|text|query|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "text",
            "fieldName": "query",
            "formContext": "form|get|/es/",
            "hasLabel": true,
            "hasValidationRule": false,
            "hasErrorMessagingHook": false,
            "toolingFriendly": false,
            "assessment": {
              "score": 60,
              "urgency": "high",
              "issues": [
                "No explicit validation rule",
                "No error messaging hook",
                "Missing autocomplete for tooling support"
              ],
              "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.",
                "Provide meaningful autocomplete values to support browsers and assistive tooling."
              ]
            },
            "reusedFromCache": true
          }
        ],
        "recommendations": [
          {
            "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."
          },
          {
            "title": "Missing autocomplete for tooling support",
            "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": "Política de privacidad del servicio de baño asistido | Barcelona.cat | Ayuntamiento de Barcelona",
          "lang": "es",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "De acuerdo con el nuevo Reglamento europeo de protección de datos (RGPD), le informamos de que sus datos serán tratados por el Ayuntamiento de Barcelona al amparo de las competencias del tratamiento 0377 con el fin de gestionar las incidencias y el desarrollo del baño asistido, legitimado con su consentimiento.",
          "robots": "",
          "canonical": "https://www.barcelona.cat/es/aviso-legal/banoasistido",
          "ogTitle": "Política de privacidad del servicio de baño asistido",
          "ogDescription": "De acuerdo con el nuevo Reglamento europeo de protección de datos (RGPD), le informamos de que sus datos serán tratados por el Ayuntamiento de Barcelona al amparo de las competencias del tratamiento 0377 con el fin de gestionar las incidencias y el desarrollo del baño asistido, legitimado con su consentimiento.",
          "ogType": "Web",
          "ogUrl": "https://www.barcelona.cat/es/aviso-legal/banoasistido",
          "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": 33,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 35,
            "oversizedMedia": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 33,
            "oversizedMedia": 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 33 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 59,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": true,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": true,
          "externalScriptCount": 7,
          "externalScriptsWithoutIntegrity": 7,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "cache-control": "max-age=300, public",
            "content-encoding": "gzip",
            "content-language": "es",
            "content-length": "10139",
            "content-type": "text/html; charset=UTF-8",
            "date": "Mon, 13 Apr 2026 22:45:33 GMT",
            "etag": "\"1776120333-gzip\"",
            "expires": "Sun, 19 Nov 1978 05:00:00 GMT",
            "last-modified": "Mon, 13 Apr 2026 22:45:33 GMT",
            "server": "nginx",
            "vary": "Cookie,Accept-Encoding",
            "via": "1.1 ca2190123e61f1744d1210c24c87c840.cloudfront.net (CloudFront)",
            "x-amz-cf-id": "JJsrLi0imKmIKRDlrJaDdBvokp6BXzFMnaKZ1nSGyO9HRtq5jypJeg==",
            "x-amz-cf-pop": "IAD12-P5",
            "x-cache": "Miss from cloudfront",
            "x-content-type-options": "nosniff",
            "x-frame-options": "SAMEORIGIN",
            "x-generator": "Drupal 10 (https://www.drupal.org)"
          },
          "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": "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": "7 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 25,
        "urgency": "low",
        "origin": "https://www.barcelona.cat",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://www.barcelona.cat/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/sitemap.xml",
            "found": true,
            "status": 200,
            "contentType": "application/xml; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/manifest.webmanifest",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/favicon.ico",
            "found": true,
            "status": 200,
            "contentType": "image/x-icon"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "low",
            "detail": "Missing beneficial file(s): /.well-known/security.txt, /manifest.webmanifest."
          }
        ]
      },
      "mediaHints": {
        "score": 50,
        "urgency": "medium",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 11,
          "imagesWithLazy": 0,
          "imagesWithoutLazy": 11
        },
        "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": "11 of 11 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 85,
        "urgency": "medium",
        "data": {
          "hasPrintStyles": true,
          "hasReducedMotion": true,
          "media": {
            "totalImages": 16,
            "lazyImages": 1,
            "totalIframes": 1,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "\"Source Sans Pro\", \"Helvetica Neue\", Helvetica, Arial, sans-serif",
            "usesSystemFont": true
          },
          "tracking": {
            "count": 0,
            "scripts": []
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 1/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": "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"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 17,
        "urgency": "low",
        "totalEstimatedSavingsBytes": 130442.55,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Use modern image compression formats",
            "urgency": "medium",
            "estimatedSavingsBytes": 72410.55,
            "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size."
          },
          {
            "id": "uses-optimized-images",
            "title": "Improve image encoding quality/size",
            "urgency": "medium",
            "estimatedSavingsBytes": 58032,
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings."
          }
        ],
        "recommendations": [
          {
            "title": "Use modern image compression formats",
            "urgency": "medium",
            "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size. Estimated savings: 70.71 KB."
          },
          {
            "title": "Improve image encoding quality/size",
            "urgency": "medium",
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 56.67 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": 331716.55,
        "totalEstimatedBlockingMs": 1483,
        "opportunities": [
          {
            "id": "render-blocking-resources",
            "title": "Eliminate render-blocking resources",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering.",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1483,
            "displayValue": "Est savings of 1,480 ms",
            "urgency": "high",
            "sourceAuditId": "render-blocking-resources"
          },
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 87109,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 85 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": 81684,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 80 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-css-rules"
          },
          {
            "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": 72410.55,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 71 KiB",
            "urgency": "medium",
            "sourceAuditId": "modern-image-formats"
          },
          {
            "id": "uses-optimized-images",
            "title": "Compress oversized image assets",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss.",
            "estimatedSavingsBytes": 58032,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 57 KiB",
            "urgency": "medium",
            "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": 32481,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 32 KiB",
            "urgency": "low",
            "sourceAuditId": "unused-javascript"
          }
        ],
        "recommendations": [
          {
            "title": "Eliminate render-blocking resources",
            "urgency": "high",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering. Estimated render unblocking: 1483 ms."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "medium",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 85.07 KB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "medium",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 79.77 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: 70.71 KB."
          },
          {
            "title": "Compress oversized image assets",
            "urgency": "medium",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 56.67 KB."
          },
          {
            "title": "Remove unused JavaScript",
            "urgency": "low",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 31.72 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": 10,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 7,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "7 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": 167991.86445530725
        },
        "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: 164.05 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: 164.05 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": "medium",
        "transferBytes": 775358,
        "css": {
          "unusedBytes": 81684,
          "ratio": 0.1053500447535203,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 32481,
          "duplicatedBytes": 0,
          "ratio": 0.0418916165177892,
          "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": "high",
            "estimatedSavingsBytes": 81684,
            "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": "medium",
            "estimatedSavingsBytes": 32481,
            "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": 775358,
        "estimatedDeferrableBytes": 201274,
        "renderBlockingMs": 1483,
        "breakdown": {
          "offscreenImageSavings": 87109,
          "unusedJavascriptSavings": 32481,
          "unusedCssSavings": 81684
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 87109,
            "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": "medium",
            "estimatedSavingsBytes": 32481,
            "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": 81684,
            "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": "Eliminate render-blocking resources",
            "area": "render-path",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1483,
            "strategy": "Defer scripts/styles not required for first paint and preload only truly critical assets.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-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 www.barcelona.cat",
            "area": "font",
            "urgency": "medium",
            "estimatedSavingsBytes": 90559,
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "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 www.barcelona.cat",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 84136,
            "url": "https://www.barcelona.cat/themes/barcelonacat_theme/images/menu/viula.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 cdn.matomo.cloud",
            "area": "script",
            "urgency": "medium",
            "estimatedSavingsBytes": 76426,
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.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": 64,
        "urgency": "high",
        "providerCount": 7,
        "requestCount": 8,
        "transferBytes": 139668,
        "notGreenCount": 5,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76426,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15565,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7145,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5656,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=tpmBgX&url=https%3A%2F%2Fwww.barcelona.cat%2Fes%2Faviso-legal%2Fbanoasistido",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "high",
            "detail": "Track 7 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."
          },
          {
            "title": "Prioritize greener alternatives for third-party providers",
            "urgency": "high",
            "detail": "5 third-party script origin(s) are not confirmed green in the Green Web Foundation dataset."
          }
        ]
      },
      "redundancy": {
        "score": 18,
        "urgency": "low",
        "transferBytes": 775358,
        "estimatedRedundantBytes": 114165,
        "redundancyRatio": 0.1472416612713095,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 81684,
            "displayValue": "Est savings of 80 KiB"
          },
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 32481,
            "displayValue": "Est savings of 32 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 81684,
            "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 unused javascript",
            "urgency": "medium",
            "estimatedSavingsBytes": 32481,
            "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 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": 21,
        "urgency": "medium",
        "totalTransferBytes": 775358,
        "heavyRequestCount": 4,
        "heavyBytes": 271007,
        "heavyRatio": 0.34952499361585226,
        "heavyRequests": [
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "transferSize": 90559,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "transferSize": 76426,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "cdn.matomo.cloud"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament/fonts/icoajuntament.ttf?8aaig7",
            "transferSize": 54919,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/css/css_evpTRQTawGYS1Ro7RbXq3hBxwat7AU-RJm1V8ZgzeaE.css?delta=5&language=es&theme=barcelonacat_theme&include=eJyFzkEKwzAMBMAPxfjQB5m1I1IXRzKSkja_r6EQKKT0pGV3DsJjY8dK7Al7NbH4OQG9ThlaqAmjwJPspFpnsjj0Flykjf2X6Vgo7JWe38DvtFLMIm6u6KnMfAWWJhktmB-t8nIlapGA8_crYbKNLhnY0u0f6CpTLpwGU8QzJXo5KaNNdpjTGjOM3gg5eRY&tcut5n",
            "transferSize": 49103,
            "resourceType": "stylesheet",
            "mimeType": "text/css",
            "domain": "www.barcelona.cat"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "font",
            "count": 2,
            "transferBytes": 145478
          },
          {
            "resourceType": "script",
            "count": 1,
            "transferBytes": 76426
          },
          {
            "resourceType": "stylesheet",
            "count": 1,
            "transferBytes": 49103
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.barcelona.cat",
            "count": 3,
            "transferBytes": 194581
          },
          {
            "domain": "cdn.matomo.cloud",
            "count": 1,
            "transferBytes": 76426
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Lazy-load offscreen images and media galleries",
            "urgency": "medium",
            "estimatedSavingsBytes": 87109,
            "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": "Defer non-critical UI modules until after first render",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "strategy": "Keep only above-the-fold resources in the initial path; hydrate or import secondary modules later.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 www.barcelona.cat",
            "urgency": "medium",
            "estimatedSavingsBytes": 90559,
            "strategy": "Subset or defer this font so full font payloads are only fetched when needed.",
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 cdn.matomo.cloud",
            "urgency": "medium",
            "estimatedSavingsBytes": 76426,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.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.13,
          "displayValue": "6.0 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.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-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,
          "displayValue": "Est savings of 80 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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 80 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,
          "displayValue": "Est savings of 71 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 71 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 57 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 57 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,
          "displayValue": "Est savings of 85 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 85 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": "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": 0,
          "displayValue": "Est savings of 1,480 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 Eliminate render-blocking resources\n\n- Lighthouse audit: render-blocking-resources\n- Current value: Est savings of 1,480 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\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": "server-response-time",
          "title": "Reduce initial server response time",
          "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": 0,
          "displayValue": "Root document took 610 ms",
          "impact": "high",
          "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 Reduce initial server response time\n\n- Lighthouse audit: server-response-time\n- Current value: Root document took 610 ms\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": "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": 0.86,
          "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 Speed Index\n\n- Lighthouse audit: speed-index\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\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": 0.5,
          "displayValue": "Est savings of 32 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 32 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": "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": "926 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: 926 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://barcelona.cat/es/blogoteca/condiciones-uso",
      "status": "ok",
      "finalUrl": "https://www.barcelona.cat/es/blogoteca/condiciones-uso",
      "performanceScore": 0.71,
      "bestPracticesScore": 1,
      "transferBytes": 810438,
      "co2Grams": 0.3104637236532,
      "greenWeb": {
        "page": {
          "hostname": "www.barcelona.cat",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-13T22:38:00.231825",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.barcelona.cat",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76425,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31745,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "stylesheet",
            "requestCount": 1,
            "transferBytes": 24654,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15565,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7145,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 4109,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/css/bcn-avisos.css",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "fonts.googleapis.com",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 2461,
            "sampleUrl": "https://fonts.googleapis.com/css?family=Source+Sans+3:200,200i,300,300i,400,400i,500,500i,600,600i,700,700i,900,900i",
            "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
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=E91nF7&url=https%3A%2F%2Fwww.barcelona.cat%2Fes%2Fblogoteca%2Fcondiciones-uso",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 10,
          "greenCount": 4,
          "notGreenCount": 7,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 60,
        "urgency": "high",
        "pageElementOccurrences": 1,
        "uniqueElementsAssessed": 1,
        "reusedFromCacheCount": 1,
        "components": [
          {
            "signature": "form|get|/es/|input|text|query|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "text",
            "fieldName": "query",
            "formContext": "form|get|/es/",
            "hasLabel": true,
            "hasValidationRule": false,
            "hasErrorMessagingHook": false,
            "toolingFriendly": false,
            "assessment": {
              "score": 60,
              "urgency": "high",
              "issues": [
                "No explicit validation rule",
                "No error messaging hook",
                "Missing autocomplete for tooling support"
              ],
              "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.",
                "Provide meaningful autocomplete values to support browsers and assistive tooling."
              ]
            },
            "reusedFromCache": true
          }
        ],
        "recommendations": [
          {
            "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."
          },
          {
            "title": "Missing autocomplete for tooling support",
            "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": "Condiciones de uso de la Blogoteca | La meva Barcelona",
          "lang": "es",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "Información sobre la Blogoteca, la recopilación de webs y blogs de Barcelona, donde puedes encontrar qué es, cómo funciona y los requisitos para participar.",
          "robots": "",
          "canonical": "https://www.barcelona.cat/es/blogoteca/condiciones-uso",
          "ogTitle": "Condiciones de uso de la Blogoteca",
          "ogDescription": "Objetivos del espacio La Blogoteca es un espacio de participación de la web Barcelona que tiene como objetivo ofrecer una visión diversa y de interés general de lo que hay en la red vinculado a la ciudad (blogs y webs). Aceptación de las condiciones de utilización Al acceder a este espacio de participación consideramos que acepta todas las condiciones de utilización que se describen a continuación. Por ello le pedimos que las lea atentamente.",
          "ogType": "Web",
          "ogUrl": "https://www.barcelona.cat/es/blogoteca/condiciones-uso",
          "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": 32,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 34,
            "oversizedMedia": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 32,
            "oversizedMedia": 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 32 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 59,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": true,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": true,
          "externalScriptCount": 7,
          "externalScriptsWithoutIntegrity": 7,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "cache-control": "max-age=300, public",
            "content-encoding": "gzip",
            "content-language": "es",
            "content-length": "10647",
            "content-type": "text/html; charset=UTF-8",
            "date": "Mon, 13 Apr 2026 22:45:46 GMT",
            "etag": "\"1776120345-gzip\"",
            "expires": "Sun, 19 Nov 1978 05:00:00 GMT",
            "last-modified": "Mon, 13 Apr 2026 22:45:45 GMT",
            "server": "nginx",
            "vary": "Cookie,Accept-Encoding",
            "via": "1.1 ca2190123e61f1744d1210c24c87c840.cloudfront.net (CloudFront)",
            "x-amz-cf-id": "seIsjEo3Fr7gDbb_EiMUDHU7WQOky3ZXxIMNMOiHM_5kOjLnrKpuIQ==",
            "x-amz-cf-pop": "IAD12-P5",
            "x-cache": "Miss from cloudfront",
            "x-content-type-options": "nosniff",
            "x-frame-options": "SAMEORIGIN",
            "x-generator": "Drupal 10 (https://www.drupal.org)"
          },
          "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": "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": "7 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 25,
        "urgency": "low",
        "origin": "https://www.barcelona.cat",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://www.barcelona.cat/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/sitemap.xml",
            "found": true,
            "status": 200,
            "contentType": "application/xml; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/manifest.webmanifest",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/favicon.ico",
            "found": true,
            "status": 200,
            "contentType": "image/x-icon"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "low",
            "detail": "Missing beneficial file(s): /.well-known/security.txt, /manifest.webmanifest."
          }
        ]
      },
      "mediaHints": {
        "score": 50,
        "urgency": "medium",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 11,
          "imagesWithLazy": 0,
          "imagesWithoutLazy": 11
        },
        "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": "11 of 11 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 85,
        "urgency": "medium",
        "data": {
          "hasPrintStyles": true,
          "hasReducedMotion": true,
          "media": {
            "totalImages": 16,
            "lazyImages": 1,
            "totalIframes": 1,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "\"Source Sans Pro\", \"Helvetica Neue\", Helvetica, Arial, sans-serif",
            "usesSystemFont": true
          },
          "tracking": {
            "count": 0,
            "scripts": []
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 1/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": "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"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 18,
        "urgency": "low",
        "totalEstimatedSavingsBytes": 142922.55,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Use modern image compression formats",
            "urgency": "medium",
            "estimatedSavingsBytes": 72410.55,
            "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size."
          },
          {
            "id": "uses-optimized-images",
            "title": "Improve image encoding quality/size",
            "urgency": "medium",
            "estimatedSavingsBytes": 70512,
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings."
          }
        ],
        "recommendations": [
          {
            "title": "Use modern image compression formats",
            "urgency": "medium",
            "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size. Estimated savings: 70.71 KB."
          },
          {
            "title": "Improve image encoding quality/size",
            "urgency": "medium",
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 68.86 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": 344124.55,
        "totalEstimatedBlockingMs": 1487,
        "opportunities": [
          {
            "id": "render-blocking-resources",
            "title": "Eliminate render-blocking resources",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering.",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1487,
            "displayValue": "Est savings of 1,490 ms",
            "urgency": "high",
            "sourceAuditId": "render-blocking-resources"
          },
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 87108,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 85 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": 81613,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 80 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-css-rules"
          },
          {
            "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": 72410.55,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 71 KiB",
            "urgency": "medium",
            "sourceAuditId": "modern-image-formats"
          },
          {
            "id": "uses-optimized-images",
            "title": "Compress oversized image assets",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss.",
            "estimatedSavingsBytes": 70512,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 69 KiB",
            "urgency": "medium",
            "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": 32481,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 32 KiB",
            "urgency": "low",
            "sourceAuditId": "unused-javascript"
          }
        ],
        "recommendations": [
          {
            "title": "Eliminate render-blocking resources",
            "urgency": "high",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering. Estimated render unblocking: 1487 ms."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "medium",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 85.07 KB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "medium",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 79.70 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: 70.71 KB."
          },
          {
            "title": "Compress oversized image assets",
            "urgency": "medium",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 68.86 KB."
          },
          {
            "title": "Remove unused JavaScript",
            "urgency": "low",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 31.72 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": 10,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 7,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "7 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": 167993.8709846369
        },
        "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: 164.06 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: 164.06 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": "medium",
        "transferBytes": 810438,
        "css": {
          "unusedBytes": 81613,
          "ratio": 0.10070233626754915,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 32481,
          "duplicatedBytes": 0,
          "ratio": 0.0400783280152214,
          "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": "high",
            "estimatedSavingsBytes": 81613,
            "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": "medium",
            "estimatedSavingsBytes": 32481,
            "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": 810438,
        "estimatedDeferrableBytes": 201202,
        "renderBlockingMs": 1487,
        "breakdown": {
          "offscreenImageSavings": 87108,
          "unusedJavascriptSavings": 32481,
          "unusedCssSavings": 81613
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 87108,
            "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": "medium",
            "estimatedSavingsBytes": 32481,
            "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": 81613,
            "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": "Eliminate render-blocking resources",
            "area": "render-path",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1487,
            "strategy": "Defer scripts/styles not required for first paint and preload only truly critical assets.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-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 www.barcelona.cat",
            "area": "font",
            "urgency": "medium",
            "estimatedSavingsBytes": 90562,
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "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 www.barcelona.cat",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 84136,
            "url": "https://www.barcelona.cat/themes/barcelonacat_theme/images/menu/viula.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 cdn.matomo.cloud",
            "area": "script",
            "urgency": "medium",
            "estimatedSavingsBytes": 76425,
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.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": 64,
        "urgency": "high",
        "providerCount": 7,
        "requestCount": 8,
        "transferBytes": 139456,
        "notGreenCount": 5,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76425,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31745,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15565,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7145,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=E91nF7&url=https%3A%2F%2Fwww.barcelona.cat%2Fes%2Fblogoteca%2Fcondiciones-uso",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "high",
            "detail": "Track 7 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."
          },
          {
            "title": "Prioritize greener alternatives for third-party providers",
            "urgency": "high",
            "detail": "5 third-party script origin(s) are not confirmed green in the Green Web Foundation dataset."
          }
        ]
      },
      "redundancy": {
        "score": 18,
        "urgency": "low",
        "transferBytes": 810438,
        "estimatedRedundantBytes": 114094,
        "redundancyRatio": 0.14078066428277056,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 81613,
            "displayValue": "Est savings of 80 KiB"
          },
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 32481,
            "displayValue": "Est savings of 32 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 81613,
            "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 unused javascript",
            "urgency": "medium",
            "estimatedSavingsBytes": 32481,
            "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 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": 20,
        "urgency": "medium",
        "totalTransferBytes": 810438,
        "heavyRequestCount": 4,
        "heavyBytes": 271000,
        "heavyRatio": 0.3343870845147932,
        "heavyRequests": [
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "transferSize": 90562,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "transferSize": 76425,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "cdn.matomo.cloud"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament/fonts/icoajuntament.ttf?8aaig7",
            "transferSize": 54919,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/css/css_evpTRQTawGYS1Ro7RbXq3hBxwat7AU-RJm1V8ZgzeaE.css?delta=5&language=es&theme=barcelonacat_theme&include=eJyFzkEKwzAMBMAPxfjQB5m1I1IXRzKSkja_r6EQKKT0pGV3DsJjY8dK7Al7NbH4OQG9ThlaqAmjwJPspFpnsjj0Flykjf2X6Vgo7JWe38DvtFLMIm6u6KnMfAWWJhktmB-t8nIlapGA8_crYbKNLhnY0u0f6CpTLpwGU8QzJXo5KaNNdpjTGjOM3gg5eRY&tcut5n",
            "transferSize": 49094,
            "resourceType": "stylesheet",
            "mimeType": "text/css",
            "domain": "www.barcelona.cat"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "font",
            "count": 2,
            "transferBytes": 145481
          },
          {
            "resourceType": "script",
            "count": 1,
            "transferBytes": 76425
          },
          {
            "resourceType": "stylesheet",
            "count": 1,
            "transferBytes": 49094
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.barcelona.cat",
            "count": 3,
            "transferBytes": 194575
          },
          {
            "domain": "cdn.matomo.cloud",
            "count": 1,
            "transferBytes": 76425
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Lazy-load offscreen images and media galleries",
            "urgency": "medium",
            "estimatedSavingsBytes": 87108,
            "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": "Defer non-critical UI modules until after first render",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "strategy": "Keep only above-the-fold resources in the initial path; hydrate or import secondary modules later.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 www.barcelona.cat",
            "urgency": "medium",
            "estimatedSavingsBytes": 90562,
            "strategy": "Subset or defer this font so full font payloads are only fetched when needed.",
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 cdn.matomo.cloud",
            "urgency": "medium",
            "estimatedSavingsBytes": 76425,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.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.13,
          "displayValue": "6.0 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.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-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,
          "displayValue": "Est savings of 80 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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 80 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,
          "displayValue": "Est savings of 71 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 71 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 69 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 69 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,
          "displayValue": "Est savings of 85 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 85 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": "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": 0,
          "displayValue": "Est savings of 1,490 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 Eliminate render-blocking resources\n\n- Lighthouse audit: render-blocking-resources\n- Current value: Est savings of 1,490 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\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": "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 32 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 32 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": "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": "945 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: 945 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://barcelona.cat/es/conocebcn/la-ciutadella-del-conocimiento",
      "status": "ok",
      "finalUrl": "https://www.barcelona.cat/es/conocebcn/la-ciutadella-del-conocimiento",
      "performanceScore": 0.65,
      "bestPracticesScore": 1,
      "transferBytes": 2008928,
      "co2Grams": 0.7695829507392,
      "greenWeb": {
        "page": {
          "hostname": "www.barcelona.cat",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-13T22:38:00.231825",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.barcelona.cat",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76425,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "stylesheet",
            "requestCount": 1,
            "transferBytes": 24654,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15565,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "www.youtube.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 11061,
            "sampleUrl": "https://www.youtube.com/iframe_api",
            "greenCheck": {
              "hostname": "www.youtube.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2026-01-10T15:09:17",
              "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.youtube.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7143,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 4110,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/css/bcn-avisos.css",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "fonts.googleapis.com",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 2461,
            "sampleUrl": "https://fonts.googleapis.com/css?family=Source+Sans+3:200,200i,300,300i,400,400i,500,500i,600,600i,700,700i,900,900i",
            "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
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=WzX0vR&url=https%3A%2F%2Fwww.barcelona.cat%2Fes%2Fconocebcn%2Fla-ciutadella-del-conocimiento",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 11,
          "greenCount": 5,
          "notGreenCount": 7,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 60,
        "urgency": "high",
        "pageElementOccurrences": 1,
        "uniqueElementsAssessed": 1,
        "reusedFromCacheCount": 1,
        "components": [
          {
            "signature": "form|get|/es/|input|text|query|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "text",
            "fieldName": "query",
            "formContext": "form|get|/es/",
            "hasLabel": true,
            "hasValidationRule": false,
            "hasErrorMessagingHook": false,
            "toolingFriendly": false,
            "assessment": {
              "score": 60,
              "urgency": "high",
              "issues": [
                "No explicit validation rule",
                "No error messaging hook",
                "Missing autocomplete for tooling support"
              ],
              "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.",
                "Provide meaningful autocomplete values to support browsers and assistive tooling."
              ]
            },
            "reusedFromCache": true
          }
        ],
        "recommendations": [
          {
            "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."
          },
          {
            "title": "Missing autocomplete for tooling support",
            "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": "La Ciutadella del Conocimiento | Web de Barcelona | Ayuntamiento de Barcelona",
          "lang": "es",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "La Ciutadella del Conocimiento es un proyecto científico y urbanístico que convertirá al Parque de la Ciutadella en un nodo de conocimiento, divulgación, investigación e innovación puntero en Europa.",
          "robots": "",
          "canonical": "https://www.barcelona.cat/es/conocebcn/la-ciutadella-del-conocimiento",
          "ogTitle": "La Ciutadella del Conocimiento | Web de Barcelona | Ayuntamiento de Barcelona",
          "ogDescription": "La Ciutadella del Conocimiento es un proyecto científico y urbanístico que convertirá al Parque de la Ciutadella en un nodo de conocimiento, divulgación, investigación e innovación puntero en Europa.",
          "ogType": "Web",
          "ogUrl": "https://www.barcelona.cat/es/conocebcn/la-ciutadella-del-conocimiento",
          "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": 47,
          "tabletSmallTapTargets": 45,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 47,
            "oversizedMedia": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 45,
            "oversizedMedia": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 47 small targets on mobile and 45 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 59,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": true,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": true,
          "externalScriptCount": 8,
          "externalScriptsWithoutIntegrity": 8,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "cache-control": "max-age=300, public",
            "content-encoding": "gzip",
            "content-language": "es",
            "content-length": "15344",
            "content-type": "text/html; charset=UTF-8",
            "date": "Mon, 13 Apr 2026 22:45:59 GMT",
            "etag": "\"1776120358-gzip\"",
            "expires": "Sun, 19 Nov 1978 05:00:00 GMT",
            "last-modified": "Mon, 13 Apr 2026 22:45:58 GMT",
            "server": "nginx",
            "vary": "Cookie,Accept-Encoding",
            "via": "1.1 ca2190123e61f1744d1210c24c87c840.cloudfront.net (CloudFront)",
            "x-amz-cf-id": "qxEsU9467GnGve-7ga0ZC8sxhB7uef-JXZI8rQ76-xxLqIOV-pPZhg==",
            "x-amz-cf-pop": "IAD12-P5",
            "x-cache": "Miss from cloudfront",
            "x-content-type-options": "nosniff",
            "x-frame-options": "SAMEORIGIN",
            "x-generator": "Drupal 10 (https://www.drupal.org)"
          },
          "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": "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": "8 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 25,
        "urgency": "low",
        "origin": "https://www.barcelona.cat",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://www.barcelona.cat/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/sitemap.xml",
            "found": true,
            "status": 200,
            "contentType": "application/xml; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/manifest.webmanifest",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/favicon.ico",
            "found": true,
            "status": 200,
            "contentType": "image/x-icon"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "low",
            "detail": "Missing beneficial file(s): /.well-known/security.txt, /manifest.webmanifest."
          }
        ]
      },
      "mediaHints": {
        "score": 20,
        "urgency": "low",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 36,
          "imagesWithLazy": 20,
          "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."
          }
        ]
      },
      "wsgCustom": {
        "score": 85,
        "urgency": "medium",
        "data": {
          "hasPrintStyles": true,
          "hasReducedMotion": true,
          "media": {
            "totalImages": 41,
            "lazyImages": 21,
            "totalIframes": 1,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "\"Source Sans Pro\", \"Helvetica Neue\", Helvetica, Arial, sans-serif",
            "usesSystemFont": true
          },
          "tracking": {
            "count": 0,
            "scripts": []
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 21/41 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": "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"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 77,
        "urgency": "high",
        "totalEstimatedSavingsBytes": 1546908.7000000002,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Use modern image compression formats",
            "urgency": "high",
            "estimatedSavingsBytes": 900023.7000000002,
            "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": 646885,
            "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: 878.93 KB."
          },
          {
            "title": "Improve image encoding quality/size",
            "urgency": "high",
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 631.72 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": 2186475.7,
        "totalEstimatedBlockingMs": 1493,
        "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": 900023.7000000002,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 879 KiB",
            "urgency": "high",
            "sourceAuditId": "modern-image-formats"
          },
          {
            "id": "uses-optimized-images",
            "title": "Compress oversized image assets",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss.",
            "estimatedSavingsBytes": 646885,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 632 KiB",
            "urgency": "high",
            "sourceAuditId": "uses-optimized-images"
          },
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 313499,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 306 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": 185306,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 181 KiB",
            "urgency": "high",
            "sourceAuditId": "uses-responsive-images"
          },
          {
            "id": "render-blocking-resources",
            "title": "Eliminate render-blocking resources",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering.",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1493,
            "displayValue": "Est savings of 1,490 ms",
            "urgency": "high",
            "sourceAuditId": "render-blocking-resources"
          },
          {
            "id": "unused-css-rules",
            "title": "Remove unused CSS",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped.",
            "estimatedSavingsBytes": 82738,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 81 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-css-rules"
          },
          {
            "id": "unused-javascript",
            "title": "Remove unused JavaScript",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code.",
            "estimatedSavingsBytes": 58024,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 57 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-javascript"
          }
        ],
        "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: 878.93 KB."
          },
          {
            "title": "Compress oversized image assets",
            "urgency": "high",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 631.72 KB."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "high",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 306.15 KB."
          },
          {
            "title": "Right-size images for viewport",
            "urgency": "high",
            "detail": "Avoid sending larger images than the rendered size needs. Estimated byte savings: 180.96 KB."
          },
          {
            "title": "Eliminate render-blocking resources",
            "urgency": "high",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering. Estimated render unblocking: 1493 ms."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "medium",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 80.80 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": 10,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 8,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "8 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": 386828.05431797024
        },
        "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: 377.76 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: 377.76 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": "medium",
        "transferBytes": 2008928,
        "css": {
          "unusedBytes": 82738,
          "ratio": 0.04118514949266475,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 58024,
          "duplicatedBytes": 0,
          "ratio": 0.028883065993405437,
          "auditIds": [
            "unused-javascript",
            "duplicated-javascript"
          ]
        },
        "html": {
          "estimatedPenalty": 0.25,
          "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": "high",
            "estimatedSavingsBytes": 82738,
            "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": "medium",
            "estimatedSavingsBytes": 58024,
            "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": 2008928,
        "estimatedDeferrableBytes": 454261,
        "renderBlockingMs": 1493,
        "breakdown": {
          "offscreenImageSavings": 313499,
          "unusedJavascriptSavings": 58024,
          "unusedCssSavings": 82738
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "high",
            "estimatedSavingsBytes": 313499,
            "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": "medium",
            "estimatedSavingsBytes": 58024,
            "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": "high",
            "estimatedSavingsBytes": 82738,
            "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": "Eliminate render-blocking resources",
            "area": "render-path",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1493,
            "strategy": "Defer scripts/styles not required for first paint and preload only truly critical assets.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-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 www.barcelona.cat",
            "area": "image",
            "urgency": "high",
            "estimatedSavingsBytes": 213834,
            "url": "https://www.barcelona.cat/sites/default/files/styles/destacat_gran/public/ciutatvella_529x361-1001_2.jpg?itok=UZqpQj0K",
            "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": 65,
        "urgency": "high",
        "providerCount": 8,
        "requestCount": 10,
        "transferBytes": 150516,
        "notGreenCount": 5,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76425,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15565,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "www.youtube.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 11061,
            "sampleUrl": "https://www.youtube.com/iframe_api",
            "greenCheck": {
              "hostname": "www.youtube.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2026-01-10T15:09:17",
              "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.youtube.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7143,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=WzX0vR&url=https%3A%2F%2Fwww.barcelona.cat%2Fes%2Fconocebcn%2Fla-ciutadella-del-conocimiento",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "high",
            "detail": "Track 8 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."
          },
          {
            "title": "Prioritize greener alternatives for third-party providers",
            "urgency": "high",
            "detail": "5 third-party script origin(s) are not confirmed green in the Green Web Foundation dataset."
          }
        ]
      },
      "redundancy": {
        "score": 24,
        "urgency": "medium",
        "transferBytes": 2008928,
        "estimatedRedundantBytes": 140762,
        "redundancyRatio": 0.07006821548607019,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 82738,
            "displayValue": "Est savings of 81 KiB"
          },
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 58024,
            "displayValue": "Est savings of 57 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 82738,
            "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 unused javascript",
            "urgency": "medium",
            "estimatedSavingsBytes": 58024,
            "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 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": 30,
        "urgency": "high",
        "totalTransferBytes": 2008928,
        "heavyRequestCount": 8,
        "heavyBytes": 916372,
        "heavyRatio": 0.4561497475270393,
        "heavyRequests": [
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/destacat_gran/public/ciutatvella_529x361-1001_2.jpg?itok=UZqpQj0K",
            "transferSize": 213834,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/destacat_gran/public/mercatdelpeix-528x228_3.jpg?itok=AMxmDzn9",
            "transferSize": 170395,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/destacat_gran/public/oberturazoo-528x228_3.jpg?itok=WvAjPPKh",
            "transferSize": 142993,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/destacat_gran/public/biobanc-528x228_3.jpg?itok=rKSemqu7",
            "transferSize": 115307,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "transferSize": 90561,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "transferSize": 76425,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "cdn.matomo.cloud"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament/fonts/icoajuntament.ttf?8aaig7",
            "transferSize": 54920,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/css/css_qDD4BCxE8K-iT7MRORwp32v03DlJblP9-xrYwOBWlQo.css?delta=5&language=es&theme=barcelonacat_theme&include=eJyFz8FuxCAMBNAfCsuhH4QG4k2oHIywyW7-vkgrdVuJqidbM-8y-OzFcFCxgGQdnA3mV7qjs-mCH_WZVdS_jkPNS0RLxFKQYEFOai2vpH7o7kyER_-XqdjInZkev4HtdJCPIqbWUENaywzcUdIV5TnrNpYIdmoX57LNRE7i3rtmQh48i1X6yIKiaPj4D9QmS0wlDNbgv79AT6NWwEtFwzZG7urX1iv49k5uvdQeOetO66KXGh0-QukLVTypww&tcut5n",
            "transferSize": 51937,
            "resourceType": "stylesheet",
            "mimeType": "text/css",
            "domain": "www.barcelona.cat"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "image",
            "count": 4,
            "transferBytes": 642529
          },
          {
            "resourceType": "font",
            "count": 2,
            "transferBytes": 145481
          },
          {
            "resourceType": "script",
            "count": 1,
            "transferBytes": 76425
          },
          {
            "resourceType": "stylesheet",
            "count": 1,
            "transferBytes": 51937
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.barcelona.cat",
            "count": 7,
            "transferBytes": 839947
          },
          {
            "domain": "cdn.matomo.cloud",
            "count": 1,
            "transferBytes": 76425
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Lazy-load offscreen images and media galleries",
            "urgency": "high",
            "estimatedSavingsBytes": 313499,
            "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": "medium",
            "estimatedSavingsBytes": 58024,
            "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": "Defer non-critical UI modules until after first render",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "strategy": "Keep only above-the-fold resources in the initial path; hydrate or import secondary modules later.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 www.barcelona.cat",
            "urgency": "medium",
            "estimatedSavingsBytes": 213834,
            "strategy": "Serve a smaller placeholder first and load this asset only when the user scrolls to or requests the component.",
            "url": "https://www.barcelona.cat/sites/default/files/styles/destacat_gran/public/ciutatvella_529x361-1001_2.jpg?itok=UZqpQj0K",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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.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: 7.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 57 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 57 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,
          "displayValue": "Est savings of 81 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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 81 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,
          "displayValue": "Est savings of 879 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 879 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 632 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 632 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,
          "displayValue": "Est savings of 306 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 306 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": "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": 0,
          "displayValue": "Est savings of 1,490 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 Eliminate render-blocking resources\n\n- Lighthouse audit: render-blocking-resources\n- Current value: Est savings of 1,490 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\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": "server-response-time",
          "title": "Reduce initial server response time",
          "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": 0,
          "displayValue": "Root document took 800 ms",
          "impact": "high",
          "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 Reduce initial server response time\n\n- Lighthouse audit: server-response-time\n- Current value: Root document took 800 ms\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": "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,
          "displayValue": "1,155 elements",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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: 1,155 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"
        },
        {
          "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": 0.7,
          "displayValue": "4.6 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 Speed Index\n\n- Lighthouse audit: speed-index\n- Current value: 4.6 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\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"
        }
      ]
    },
    {
      "url": "https://barcelona.cat/es/que-hacer-en-bcn/banos-y-playas/actividades-deportivas-organizadas-por-deportistas-federados",
      "status": "ok",
      "finalUrl": "https://www.barcelona.cat/es/que-hacer-en-bcn/banos-y-playas/actividades-deportivas-organizadas-por-deportistas-federados",
      "performanceScore": 0.65,
      "bestPracticesScore": 1,
      "transferBytes": 1047238,
      "co2Grams": 0.40117739917320006,
      "greenWeb": {
        "page": {
          "hostname": "www.barcelona.cat",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-13T22:38:00.231825",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.barcelona.cat",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76426,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31745,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "stylesheet",
            "requestCount": 1,
            "transferBytes": 24654,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15565,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7143,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 4109,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/css/bcn-avisos.css",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "fonts.googleapis.com",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 2459,
            "sampleUrl": "https://fonts.googleapis.com/css?family=Source+Sans+3:200,200i,300,300i,400,400i,500,500i,600,600i,700,700i,900,900i",
            "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
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=LoTxuw&url=https%3A%2F%2Fwww.barcelona.cat%2Fes%2Fque-hacer-en-bcn%2Fbanos-y-playas%2Factividades-deportivas-organizadas-por-deportistas-federados",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 10,
          "greenCount": 4,
          "notGreenCount": 7,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 60,
        "urgency": "high",
        "pageElementOccurrences": 1,
        "uniqueElementsAssessed": 1,
        "reusedFromCacheCount": 1,
        "components": [
          {
            "signature": "form|get|/es/|input|text|query|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "text",
            "fieldName": "query",
            "formContext": "form|get|/es/",
            "hasLabel": true,
            "hasValidationRule": false,
            "hasErrorMessagingHook": false,
            "toolingFriendly": false,
            "assessment": {
              "score": 60,
              "urgency": "high",
              "issues": [
                "No explicit validation rule",
                "No error messaging hook",
                "Missing autocomplete for tooling support"
              ],
              "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.",
                "Provide meaningful autocomplete values to support browsers and assistive tooling."
              ]
            },
            "reusedFromCache": true
          }
        ],
        "recommendations": [
          {
            "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."
          },
          {
            "title": "Missing autocomplete for tooling support",
            "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": "Actividades deportivas sin animo de lucro | Web Barcelona | Ayuntamiento de Barcelona",
          "lang": "es",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "Actividades deportivas que se hacen en la arena organizadas para deportistas federados o entidades inscritas en el registro de federaciones o en el censo de organizadores.",
          "robots": "",
          "canonical": "https://www.barcelona.cat/es/que-hacer-en-bcn/banos-y-playas/actividades-deportivas-organizadas-por-deportistas-federados",
          "ogTitle": "Actividades deportivas sin animo de lucro | Web Barcelona | Ayuntamiento de Barcelona",
          "ogDescription": "Actividades deportivas que se hacen en la arena organizadas para deportistas federados o entidades inscritas en el registro de federaciones o en el censo de organizadores.",
          "ogType": "Web",
          "ogUrl": "https://www.barcelona.cat/es/que-hacer-en-bcn/banos-y-playas/actividades-deportivas-organizadas-por-deportistas-federados",
          "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": 34,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 36,
            "oversizedMedia": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 34,
            "oversizedMedia": 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 34 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 59,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": true,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": true,
          "externalScriptCount": 7,
          "externalScriptsWithoutIntegrity": 7,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "cache-control": "max-age=300, public",
            "content-encoding": "gzip",
            "content-language": "es",
            "content-length": "10494",
            "content-type": "text/html; charset=UTF-8",
            "date": "Mon, 13 Apr 2026 22:46:14 GMT",
            "etag": "\"1776120374-gzip\"",
            "expires": "Sun, 19 Nov 1978 05:00:00 GMT",
            "last-modified": "Mon, 13 Apr 2026 22:46:14 GMT",
            "server": "nginx",
            "vary": "Cookie,Accept-Encoding",
            "via": "1.1 ca2190123e61f1744d1210c24c87c840.cloudfront.net (CloudFront)",
            "x-amz-cf-id": "N_ErBC38ZJ89JsR5HGDmD_HmBz7XRwKCd2_mZEQFdQ1vCFnZmHWbjQ==",
            "x-amz-cf-pop": "IAD12-P5",
            "x-cache": "Miss from cloudfront",
            "x-content-type-options": "nosniff",
            "x-frame-options": "SAMEORIGIN",
            "x-generator": "Drupal 10 (https://www.drupal.org)"
          },
          "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": "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": "7 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 25,
        "urgency": "low",
        "origin": "https://www.barcelona.cat",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://www.barcelona.cat/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/sitemap.xml",
            "found": true,
            "status": 200,
            "contentType": "application/xml; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/manifest.webmanifest",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/favicon.ico",
            "found": true,
            "status": 200,
            "contentType": "image/x-icon"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "low",
            "detail": "Missing beneficial file(s): /.well-known/security.txt, /manifest.webmanifest."
          }
        ]
      },
      "mediaHints": {
        "score": 45,
        "urgency": "medium",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 12,
          "imagesWithLazy": 1,
          "imagesWithoutLazy": 11
        },
        "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": "11 of 12 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 85,
        "urgency": "medium",
        "data": {
          "hasPrintStyles": true,
          "hasReducedMotion": true,
          "media": {
            "totalImages": 17,
            "lazyImages": 2,
            "totalIframes": 1,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "\"Source Sans Pro\", \"Helvetica Neue\", Helvetica, Arial, sans-serif",
            "usesSystemFont": true
          },
          "tracking": {
            "count": 0,
            "scripts": []
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 2/17 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": "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"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 51,
        "urgency": "medium",
        "totalEstimatedSavingsBytes": 531361.75,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Use modern image compression formats",
            "urgency": "high",
            "estimatedSavingsBytes": 296882.75,
            "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": 234479,
            "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: 289.92 KB."
          },
          {
            "title": "Improve image encoding quality/size",
            "urgency": "high",
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 228.98 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": 762390.75,
        "totalEstimatedBlockingMs": 878,
        "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": 296882.75,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 290 KiB",
            "urgency": "high",
            "sourceAuditId": "modern-image-formats"
          },
          {
            "id": "uses-optimized-images",
            "title": "Compress oversized image assets",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss.",
            "estimatedSavingsBytes": 234479,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 229 KiB",
            "urgency": "high",
            "sourceAuditId": "uses-optimized-images"
          },
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 87110,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 85 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": 81415,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 80 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-css-rules"
          },
          {
            "id": "render-blocking-resources",
            "title": "Eliminate render-blocking resources",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering.",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 878,
            "displayValue": "Est savings of 880 ms",
            "urgency": "medium",
            "sourceAuditId": "render-blocking-resources"
          },
          {
            "id": "unused-javascript",
            "title": "Remove unused JavaScript",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code.",
            "estimatedSavingsBytes": 31867,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 31 KiB",
            "urgency": "low",
            "sourceAuditId": "unused-javascript"
          },
          {
            "id": "uses-responsive-images",
            "title": "Right-size images for viewport",
            "detail": "Avoid sending larger images than the rendered size needs.",
            "estimatedSavingsBytes": 30637,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 30 KiB",
            "urgency": "low",
            "sourceAuditId": "uses-responsive-images"
          }
        ],
        "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: 289.92 KB."
          },
          {
            "title": "Compress oversized image assets",
            "urgency": "high",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 228.98 KB."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "medium",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 85.07 KB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "medium",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 79.51 KB."
          },
          {
            "title": "Eliminate render-blocking resources",
            "urgency": "medium",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering. Estimated render unblocking: 878 ms."
          },
          {
            "title": "Remove unused JavaScript",
            "urgency": "low",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 31.12 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": 10,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 7,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "7 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": 167994.70195530725
        },
        "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: 164.06 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: 164.06 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": "medium",
        "transferBytes": 1047238,
        "css": {
          "unusedBytes": 81415,
          "ratio": 0.07774259528397556,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 31867,
          "duplicatedBytes": 0,
          "ratio": 0.030429568063802117,
          "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": "high",
            "estimatedSavingsBytes": 81415,
            "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": "medium",
            "estimatedSavingsBytes": 31867,
            "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": 14,
        "urgency": "medium",
        "transferBytes": 1047238,
        "estimatedDeferrableBytes": 200392,
        "renderBlockingMs": 878,
        "breakdown": {
          "offscreenImageSavings": 87110,
          "unusedJavascriptSavings": 31867,
          "unusedCssSavings": 81415
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 87110,
            "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": "medium",
            "estimatedSavingsBytes": 31867,
            "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": 81415,
            "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": "Eliminate render-blocking resources",
            "area": "render-path",
            "urgency": "medium",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 878,
            "strategy": "Defer scripts/styles not required for first paint and preload only truly critical assets.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-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 www.barcelona.cat",
            "area": "image",
            "urgency": "high",
            "estimatedSavingsBytes": 271637,
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_medium/public/Activitats%20Esportives%20organitzades_0.jpg?itok=jUBp2eIx",
            "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 www.barcelona.cat",
            "area": "font",
            "urgency": "medium",
            "estimatedSavingsBytes": 90560,
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "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 cdn.matomo.cloud",
            "area": "script",
            "urgency": "medium",
            "estimatedSavingsBytes": 76426,
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.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": 64,
        "urgency": "high",
        "providerCount": 7,
        "requestCount": 8,
        "transferBytes": 139455,
        "notGreenCount": 5,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76426,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31745,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15565,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7143,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=LoTxuw&url=https%3A%2F%2Fwww.barcelona.cat%2Fes%2Fque-hacer-en-bcn%2Fbanos-y-playas%2Factividades-deportivas-organizadas-por-deportistas-federados",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "high",
            "detail": "Track 7 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."
          },
          {
            "title": "Prioritize greener alternatives for third-party providers",
            "urgency": "high",
            "detail": "5 third-party script origin(s) are not confirmed green in the Green Web Foundation dataset."
          }
        ]
      },
      "redundancy": {
        "score": 16,
        "urgency": "low",
        "transferBytes": 1047238,
        "estimatedRedundantBytes": 113282,
        "redundancyRatio": 0.10817216334777768,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 81415,
            "displayValue": "Est savings of 80 KiB"
          },
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 31867,
            "displayValue": "Est savings of 31 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 81415,
            "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 unused javascript",
            "urgency": "medium",
            "estimatedSavingsBytes": 31867,
            "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 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": 28,
        "urgency": "medium",
        "totalTransferBytes": 1047238,
        "heavyRequestCount": 5,
        "heavyBytes": 542658,
        "heavyRatio": 0.518180203544944,
        "heavyRequests": [
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_medium/public/Activitats%20Esportives%20organitzades_0.jpg?itok=jUBp2eIx",
            "transferSize": 271637,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "transferSize": 90560,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "transferSize": 76426,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "cdn.matomo.cloud"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament/fonts/icoajuntament.ttf?8aaig7",
            "transferSize": 54921,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/css/css_evpTRQTawGYS1Ro7RbXq3hBxwat7AU-RJm1V8ZgzeaE.css?delta=5&language=es&theme=barcelonacat_theme&include=eJyFzsGKwzAMBNAfiuvDfpAZOyJxcSQjydn272sodFnIsieJmXcY3Ac7DmJPOKuJxfcJ6HXJ0EJNGAWe5CTVupLFqUdwkTb7v0zHRuGs9P0b-E4HxSzi5oqeyspXYGuS0YL5s1XerkQtEvDZfiVMxsySgS19_Qe6ypILp8kU8fMlejgpoy0dim0u3i2uOjra7Se5De4jt2o7rYs9zemIGUYvwgyJSg&tcut5n",
            "transferSize": 49114,
            "resourceType": "stylesheet",
            "mimeType": "text/css",
            "domain": "www.barcelona.cat"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "image",
            "count": 1,
            "transferBytes": 271637
          },
          {
            "resourceType": "font",
            "count": 2,
            "transferBytes": 145481
          },
          {
            "resourceType": "script",
            "count": 1,
            "transferBytes": 76426
          },
          {
            "resourceType": "stylesheet",
            "count": 1,
            "transferBytes": 49114
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.barcelona.cat",
            "count": 4,
            "transferBytes": 466232
          },
          {
            "domain": "cdn.matomo.cloud",
            "count": 1,
            "transferBytes": 76426
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Lazy-load offscreen images and media galleries",
            "urgency": "medium",
            "estimatedSavingsBytes": 87110,
            "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": "Defer non-critical UI modules until after first render",
            "urgency": "medium",
            "estimatedSavingsBytes": 0,
            "strategy": "Keep only above-the-fold resources in the initial path; hydrate or import secondary modules later.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 www.barcelona.cat",
            "urgency": "high",
            "estimatedSavingsBytes": 271637,
            "strategy": "Serve a smaller placeholder first and load this asset only when the user scrolls to or requests the component.",
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_medium/public/Activitats%20Esportives%20organitzades_0.jpg?itok=jUBp2eIx",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 www.barcelona.cat",
            "urgency": "medium",
            "estimatedSavingsBytes": 90560,
            "strategy": "Subset or defer this font so full font payloads are only fetched when needed.",
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 cdn.matomo.cloud",
            "urgency": "medium",
            "estimatedSavingsBytes": 76426,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.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": "9.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: 9.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,
          "displayValue": "Est savings of 80 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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 80 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,
          "displayValue": "Est savings of 290 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 290 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 229 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 229 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,
          "displayValue": "Est savings of 85 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 85 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": "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": 0,
          "displayValue": "Est savings of 880 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 Eliminate render-blocking resources\n\n- Lighthouse audit: render-blocking-resources\n- Current value: Est savings of 880 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\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": "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": 0.85,
          "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 Speed Index\n\n- Lighthouse audit: speed-index\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\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": 0.5,
          "displayValue": "Est savings of 31 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 31 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": "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": "942 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: 942 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://barcelona.cat/en/what-to-do-in-bcn/montjuic-park/news",
      "status": "ok",
      "finalUrl": "https://www.barcelona.cat/en/what-to-do-in-bcn/montjuic-park/news",
      "performanceScore": 0.65,
      "bestPracticesScore": 1,
      "transferBytes": 1943859,
      "co2Grams": 0.7446562271226,
      "greenWeb": {
        "page": {
          "hostname": "www.barcelona.cat",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-13T22:38:00.231825",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.barcelona.cat",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76425,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "stylesheet",
            "requestCount": 1,
            "transferBytes": 24659,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15566,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "www.youtube.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 11061,
            "sampleUrl": "https://www.youtube.com/iframe_api",
            "greenCheck": {
              "hostname": "www.youtube.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2026-01-10T15:09:17",
              "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.youtube.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7145,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 4108,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/css/bcn-avisos.css",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "fonts.googleapis.com",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 2461,
            "sampleUrl": "https://fonts.googleapis.com/css?family=Source+Sans+3:200,200i,300,300i,400,400i,500,500i,600,600i,700,700i,900,900i",
            "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
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=NpBbac&url=https%3A%2F%2Fwww.barcelona.cat%2Fen%2Fwhat-to-do-in-bcn%2Fmontjuic-park%2Fnews",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 11,
          "greenCount": 5,
          "notGreenCount": 7,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 37.5,
        "urgency": "medium",
        "pageElementOccurrences": 4,
        "uniqueElementsAssessed": 4,
        "reusedFromCacheCount": 1,
        "components": [
          {
            "signature": "form|get|/en|input|text|query|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "text",
            "fieldName": "query",
            "formContext": "form|get|/en",
            "hasLabel": true,
            "hasValidationRule": false,
            "hasErrorMessagingHook": false,
            "toolingFriendly": false,
            "assessment": {
              "score": 60,
              "urgency": "high",
              "issues": [
                "No explicit validation rule",
                "No error messaging hook",
                "Missing autocomplete for tooling support"
              ],
              "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.",
                "Provide meaningful autocomplete values to support browsers and assistive tooling."
              ]
            },
            "reusedFromCache": true
          },
          {
            "signature": "region|get|self|input|date|datefrom|off|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "date",
            "fieldName": "datefrom",
            "formContext": "region|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": "region|get|self|input|date|dateto|off|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "date",
            "fieldName": "dateto",
            "formContext": "region|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": "region|get|self|select|select|actualitat-nr|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "select",
            "fieldName": "actualitat-nr",
            "formContext": "region|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
          }
        ],
        "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": "2 unique form control signature(s) on this page include this issue."
          },
          {
            "title": "Missing autocomplete for tooling support",
            "urgency": "medium",
            "detail": "1 unique form control signature(s) on this page include this issue."
          }
        ]
      },
      "metadata": {
        "score": 25,
        "urgency": "low",
        "checks": {
          "hasTitle": true,
          "hasLang": true,
          "hasDescription": false,
          "hasCanonical": true,
          "hasOpenGraphCore": false,
          "hasTwitterCard": true,
          "hasViewport": true,
          "hasCharset": true,
          "hasValidStructuredData": true,
          "hasInvalidStructuredData": false
        },
        "observed": {
          "title": "News | Barcelona.cat | Ajuntament de Barcelona",
          "lang": "en",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "",
          "robots": "",
          "canonical": "https://www.barcelona.cat/en/what-to-do-in-bcn/montjuic-park/news",
          "ogTitle": "News",
          "ogDescription": "",
          "ogType": "Web",
          "ogUrl": "https://www.barcelona.cat/en/what-to-do-in-bcn/montjuic-park/news",
          "twitterCard": "summary_large_image",
          "ldJsonCount": 0,
          "validLdJsonCount": 0,
          "invalidLdJsonCount": 0
        },
        "recommendations": [
          {
            "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."
          }
        ]
      },
      "layoutAdaptation": {
        "score": 30,
        "urgency": "medium",
        "checks": {
          "testedMobile": true,
          "testedTablet": true,
          "horizontalOverflowOnMobile": false,
          "horizontalOverflowOnTablet": false,
          "mobileSmallTapTargets": 47,
          "tabletSmallTapTargets": 45,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 47,
            "oversizedMedia": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 45,
            "oversizedMedia": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 47 small targets on mobile and 45 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 59,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": true,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": true,
          "externalScriptCount": 8,
          "externalScriptsWithoutIntegrity": 8,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "cache-control": "max-age=300, public",
            "content-encoding": "gzip",
            "content-language": "en",
            "content-length": "12390",
            "content-type": "text/html; charset=UTF-8",
            "date": "Mon, 13 Apr 2026 22:46:28 GMT",
            "etag": "\"1776120387-gzip\"",
            "expires": "Sun, 19 Nov 1978 05:00:00 GMT",
            "last-modified": "Mon, 13 Apr 2026 22:46:27 GMT",
            "server": "nginx",
            "vary": "Cookie,Accept-Encoding",
            "via": "1.1 ca2190123e61f1744d1210c24c87c840.cloudfront.net (CloudFront)",
            "x-amz-cf-id": "AX-oYbmOhhQLXbGRd3SlqZ6MzWsvHxTcs7Ab-ErlzKiulO8Lyosz1A==",
            "x-amz-cf-pop": "IAD12-P5",
            "x-cache": "Miss from cloudfront",
            "x-content-type-options": "nosniff",
            "x-frame-options": "SAMEORIGIN",
            "x-generator": "Drupal 10 (https://www.drupal.org)"
          },
          "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": "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": "8 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 25,
        "urgency": "low",
        "origin": "https://www.barcelona.cat",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://www.barcelona.cat/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/sitemap.xml",
            "found": true,
            "status": 200,
            "contentType": "application/xml; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/manifest.webmanifest",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/favicon.ico",
            "found": true,
            "status": 200,
            "contentType": "image/x-icon"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "low",
            "detail": "Missing beneficial file(s): /.well-known/security.txt, /manifest.webmanifest."
          }
        ]
      },
      "mediaHints": {
        "score": 50,
        "urgency": "medium",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 21,
          "imagesWithLazy": 0,
          "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 21 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 85,
        "urgency": "medium",
        "data": {
          "hasPrintStyles": true,
          "hasReducedMotion": true,
          "media": {
            "totalImages": 26,
            "lazyImages": 1,
            "totalIframes": 1,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "\"Source Sans Pro\", \"Helvetica Neue\", Helvetica, Arial, sans-serif",
            "usesSystemFont": true
          },
          "tracking": {
            "count": 0,
            "scripts": []
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 1/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": "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"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 50,
        "urgency": "medium",
        "totalEstimatedSavingsBytes": 980128.75,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Use modern image compression formats",
            "urgency": "high",
            "estimatedSavingsBytes": 888512.75,
            "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size."
          },
          {
            "id": "uses-optimized-images",
            "title": "Improve image encoding quality/size",
            "urgency": "medium",
            "estimatedSavingsBytes": 91616,
            "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: 867.69 KB."
          },
          {
            "title": "Improve image encoding quality/size",
            "urgency": "medium",
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 89.47 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": 2114187.75,
        "totalEstimatedBlockingMs": 1631,
        "opportunities": [
          {
            "id": "uses-responsive-images",
            "title": "Right-size images for viewport",
            "detail": "Avoid sending larger images than the rendered size needs.",
            "estimatedSavingsBytes": 933711,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 912 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": 888512.75,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 868 KiB",
            "urgency": "high",
            "sourceAuditId": "modern-image-formats"
          },
          {
            "id": "render-blocking-resources",
            "title": "Eliminate render-blocking resources",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering.",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1631,
            "displayValue": "Est savings of 1,630 ms",
            "urgency": "high",
            "sourceAuditId": "render-blocking-resources"
          },
          {
            "id": "uses-optimized-images",
            "title": "Compress oversized image assets",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss.",
            "estimatedSavingsBytes": 91616,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 89 KiB",
            "urgency": "medium",
            "sourceAuditId": "uses-optimized-images"
          },
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 87109,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 85 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": 81391,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 79 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-css-rules"
          },
          {
            "id": "unused-javascript",
            "title": "Remove unused JavaScript",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code.",
            "estimatedSavingsBytes": 31848,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 31 KiB",
            "urgency": "low",
            "sourceAuditId": "unused-javascript"
          }
        ],
        "recommendations": [
          {
            "title": "Right-size images for viewport",
            "urgency": "high",
            "detail": "Avoid sending larger images than the rendered size needs. Estimated byte savings: 911.83 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: 867.69 KB."
          },
          {
            "title": "Eliminate render-blocking resources",
            "urgency": "high",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering. Estimated render unblocking: 1631 ms."
          },
          {
            "title": "Compress oversized image assets",
            "urgency": "medium",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 89.47 KB."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "medium",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 85.07 KB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "medium",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 79.48 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": 10,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 8,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "8 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": 1266537.839734637
        },
        "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.21 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.21 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": 5,
        "urgency": "medium",
        "transferBytes": 1943859,
        "css": {
          "unusedBytes": 81391,
          "ratio": 0.041870835281777125,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 31848,
          "duplicatedBytes": 0,
          "ratio": 0.016383904388126917,
          "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": "high",
            "estimatedSavingsBytes": 81391,
            "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": "medium",
            "estimatedSavingsBytes": 31848,
            "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": 1943859,
        "estimatedDeferrableBytes": 200348,
        "renderBlockingMs": 1631,
        "breakdown": {
          "offscreenImageSavings": 87109,
          "unusedJavascriptSavings": 31848,
          "unusedCssSavings": 81391
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 87109,
            "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": "medium",
            "estimatedSavingsBytes": 31848,
            "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": 81391,
            "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": "Eliminate render-blocking resources",
            "area": "render-path",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1631,
            "strategy": "Defer scripts/styles not required for first paint and preload only truly critical assets.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-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 media-edg.barcelona.cat",
            "area": "image",
            "urgency": "high",
            "estimatedSavingsBytes": 440153,
            "url": "https://media-edg.barcelona.cat/wp-content/uploads/2026/03/26182455/Obres-Endesa-Miramar-Tarongers-570x321.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 font from www.barcelona.cat",
            "area": "font",
            "urgency": "medium",
            "estimatedSavingsBytes": 90560,
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "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 www.barcelona.cat",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 84136,
            "url": "https://www.barcelona.cat/themes/barcelonacat_theme/images/menu/viula.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": 65,
        "urgency": "high",
        "providerCount": 8,
        "requestCount": 10,
        "transferBytes": 150519,
        "notGreenCount": 5,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76425,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15566,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "www.youtube.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 11061,
            "sampleUrl": "https://www.youtube.com/iframe_api",
            "greenCheck": {
              "hostname": "www.youtube.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2026-01-10T15:09:17",
              "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.youtube.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7145,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=NpBbac&url=https%3A%2F%2Fwww.barcelona.cat%2Fen%2Fwhat-to-do-in-bcn%2Fmontjuic-park%2Fnews",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "high",
            "detail": "Track 8 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."
          },
          {
            "title": "Prioritize greener alternatives for third-party providers",
            "urgency": "high",
            "detail": "5 third-party script origin(s) are not confirmed green in the Green Web Foundation dataset."
          }
        ]
      },
      "redundancy": {
        "score": 13,
        "urgency": "low",
        "transferBytes": 1943859,
        "estimatedRedundantBytes": 113239,
        "redundancyRatio": 0.05825473966990404,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 81391,
            "displayValue": "Est savings of 79 KiB"
          },
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 31848,
            "displayValue": "Est savings of 31 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 81391,
            "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 unused javascript",
            "urgency": "medium",
            "estimatedSavingsBytes": 31848,
            "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 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": 28,
        "urgency": "medium",
        "totalTransferBytes": 1943859,
        "heavyRequestCount": 6,
        "heavyBytes": 988944,
        "heavyRatio": 0.5087529496738189,
        "heavyRequests": [
          {
            "url": "https://media-edg.barcelona.cat/wp-content/uploads/2026/03/26182455/Obres-Endesa-Miramar-Tarongers-570x321.png",
            "transferSize": 440153,
            "resourceType": "image",
            "mimeType": "image/png",
            "domain": "media-edg.barcelona.cat"
          },
          {
            "url": "https://media-edg.barcelona.cat/wp-content/uploads/2026/03/09145120/MNAC-570x321.png",
            "transferSize": 277780,
            "resourceType": "image",
            "mimeType": "image/png",
            "domain": "media-edg.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "transferSize": 90560,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "transferSize": 76425,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "cdn.matomo.cloud"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament/fonts/icoajuntament.ttf?8aaig7",
            "transferSize": 54920,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/css/css_evpTRQTawGYS1Ro7RbXq3hBxwat7AU-RJm1V8ZgzeaE.css?delta=5&language=en&theme=barcelonacat_theme&include=eJyFzksKwzAMBNAL2XjRA5mxo6YuimUsOW1u30ChH0jpSsPMWwjXUQ0LVYvINsDFYGGiMwabOnzMa1HR8DwerbiEnomlIsOirNR7mUjDroc3Ed73X6ZhJr8Wun0Du9BCIYmYWkeLeapHYGZJYK-2canzkShZ_Pv3I6Ey9i4qqsbTP9C6uJRr3FlHeKVId6NewU43NVpCgtIDxTWFiw&tcut5n",
            "transferSize": 49106,
            "resourceType": "stylesheet",
            "mimeType": "text/css",
            "domain": "www.barcelona.cat"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "image",
            "count": 2,
            "transferBytes": 717933
          },
          {
            "resourceType": "font",
            "count": 2,
            "transferBytes": 145480
          },
          {
            "resourceType": "script",
            "count": 1,
            "transferBytes": 76425
          },
          {
            "resourceType": "stylesheet",
            "count": 1,
            "transferBytes": 49106
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "media-edg.barcelona.cat",
            "count": 2,
            "transferBytes": 717933
          },
          {
            "domain": "www.barcelona.cat",
            "count": 3,
            "transferBytes": 194586
          },
          {
            "domain": "cdn.matomo.cloud",
            "count": 1,
            "transferBytes": 76425
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Lazy-load offscreen images and media galleries",
            "urgency": "medium",
            "estimatedSavingsBytes": 87109,
            "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": "Defer non-critical UI modules until after first render",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "strategy": "Keep only above-the-fold resources in the initial path; hydrate or import secondary modules later.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 media-edg.barcelona.cat",
            "urgency": "high",
            "estimatedSavingsBytes": 440153,
            "strategy": "Serve a smaller placeholder first and load this asset only when the user scrolls to or requests the component.",
            "url": "https://media-edg.barcelona.cat/wp-content/uploads/2026/03/26182455/Obres-Endesa-Miramar-Tarongers-570x321.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 font asset from www.barcelona.cat",
            "urgency": "medium",
            "estimatedSavingsBytes": 90560,
            "strategy": "Subset or defer this font so full font payloads are only fetched when needed.",
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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.1,
          "displayValue": "6.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: 6.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-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,
          "displayValue": "Est savings of 79 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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 79 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,
          "displayValue": "Est savings of 868 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 868 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 89 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 89 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,
          "displayValue": "Est savings of 85 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 85 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": "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": 0,
          "displayValue": "Est savings of 1,630 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 Eliminate render-blocking resources\n\n- Lighthouse audit: render-blocking-resources\n- Current value: Est savings of 1,630 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\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": "server-response-time",
          "title": "Reduce initial server response time",
          "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": 0,
          "displayValue": "Root document took 1,150 ms",
          "impact": "high",
          "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 Reduce initial server response time\n\n- Lighthouse audit: server-response-time\n- Current value: Root document took 1,150 ms\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": "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": 0.66,
          "displayValue": "4.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 Speed Index\n\n- Lighthouse audit: speed-index\n- Current value: 4.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\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": 0.5,
          "displayValue": "Est savings of 31 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 31 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": "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": "1,031 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: 1,031 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://barcelona.cat/en/what-to-do-in-bcn/parks-and-gardens/belvederes",
      "status": "ok",
      "finalUrl": "https://www.barcelona.cat/en/what-to-do-in-bcn/parks-and-gardens/belvederes",
      "performanceScore": 0.65,
      "bestPracticesScore": 1,
      "transferBytes": 1082001,
      "co2Grams": 0.41449445788140005,
      "greenWeb": {
        "page": {
          "hostname": "www.barcelona.cat",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-13T22:38:00.231825",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.barcelona.cat",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76426,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "stylesheet",
            "requestCount": 1,
            "transferBytes": 24654,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "cdnjs.cloudflare.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15910,
            "sampleUrl": "https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js",
            "greenCheck": {
              "hostname": "cdnjs.cloudflare.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:34",
              "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/cdnjs.cloudflare.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15566,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7142,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 4112,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/css/bcn-avisos.css",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "fonts.googleapis.com",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 2459,
            "sampleUrl": "https://fonts.googleapis.com/css?family=Source+Sans+3:200,200i,300,300i,400,400i,500,500i,600,600i,700,700i,900,900i",
            "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
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=eiinuR&url=https%3A%2F%2Fwww.barcelona.cat%2Fen%2Fwhat-to-do-in-bcn%2Fparks-and-gardens%2Fbelvederes",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 11,
          "greenCount": 5,
          "notGreenCount": 7,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 75,
        "urgency": "high",
        "pageElementOccurrences": 5,
        "uniqueElementsAssessed": 2,
        "reusedFromCacheCount": 1,
        "components": [
          {
            "signature": "form|get|/en|input|text|query|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "text",
            "fieldName": "query",
            "formContext": "form|get|/en",
            "hasLabel": true,
            "hasValidationRule": false,
            "hasErrorMessagingHook": false,
            "toolingFriendly": false,
            "assessment": {
              "score": 60,
              "urgency": "high",
              "issues": [
                "No explicit validation rule",
                "No error messaging hook",
                "Missing autocomplete for tooling support"
              ],
              "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.",
                "Provide meaningful autocomplete values to support browsers and assistive tooling."
              ]
            },
            "reusedFromCache": true
          },
          {
            "signature": "no-form|select|select|anonymous|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "select",
            "fieldName": null,
            "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": "No explicit validation rule",
            "urgency": "medium",
            "detail": "2 unique form control signature(s) on this page include this issue."
          },
          {
            "title": "No error messaging hook",
            "urgency": "medium",
            "detail": "2 unique form control signature(s) on this page include this issue."
          },
          {
            "title": "Missing autocomplete for tooling support",
            "urgency": "medium",
            "detail": "1 unique form control signature(s) on this page include this issue."
          },
          {
            "title": "Missing associated label",
            "urgency": "high",
            "detail": "1 unique form control signature(s) on this page include this issue."
          }
        ]
      },
      "metadata": {
        "score": 25,
        "urgency": "low",
        "checks": {
          "hasTitle": true,
          "hasLang": true,
          "hasDescription": false,
          "hasCanonical": true,
          "hasOpenGraphCore": false,
          "hasTwitterCard": true,
          "hasViewport": true,
          "hasCharset": true,
          "hasValidStructuredData": true,
          "hasInvalidStructuredData": false
        },
        "observed": {
          "title": "Belvederes | Barcelona.cat | Ajuntament de Barcelona",
          "lang": "en",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "",
          "robots": "",
          "canonical": "https://www.barcelona.cat/en/what-to-do-in-bcn/parks-and-gardens/belvederes",
          "ogTitle": "Belvederes",
          "ogDescription": "",
          "ogType": "Web",
          "ogUrl": "https://www.barcelona.cat/en/what-to-do-in-bcn/parks-and-gardens/belvederes",
          "twitterCard": "summary_large_image",
          "ldJsonCount": 0,
          "validLdJsonCount": 0,
          "invalidLdJsonCount": 0
        },
        "recommendations": [
          {
            "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."
          }
        ]
      },
      "layoutAdaptation": {
        "score": 30,
        "urgency": "medium",
        "checks": {
          "testedMobile": true,
          "testedTablet": true,
          "horizontalOverflowOnMobile": false,
          "horizontalOverflowOnTablet": false,
          "mobileSmallTapTargets": 51,
          "tabletSmallTapTargets": 49,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 51,
            "oversizedMedia": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 49,
            "oversizedMedia": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 51 small targets on mobile and 49 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 59,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": true,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": true,
          "externalScriptCount": 8,
          "externalScriptsWithoutIntegrity": 8,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "cache-control": "max-age=300, public",
            "content-encoding": "gzip",
            "content-language": "en",
            "content-length": "11347",
            "content-type": "text/html; charset=UTF-8",
            "date": "Mon, 13 Apr 2026 22:46:42 GMT",
            "etag": "\"1776120402-gzip\"",
            "expires": "Sun, 19 Nov 1978 05:00:00 GMT",
            "last-modified": "Mon, 13 Apr 2026 22:46:42 GMT",
            "server": "nginx",
            "vary": "Cookie,Accept-Encoding",
            "via": "1.1 ca2190123e61f1744d1210c24c87c840.cloudfront.net (CloudFront)",
            "x-amz-cf-id": "EDUzCC_OhUwXfk6k1EEAqF3DsURZTOZZRS1EEKj-aNVw-cyLAb9qhw==",
            "x-amz-cf-pop": "IAD12-P5",
            "x-cache": "Miss from cloudfront",
            "x-content-type-options": "nosniff",
            "x-frame-options": "SAMEORIGIN",
            "x-generator": "Drupal 10 (https://www.drupal.org)"
          },
          "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": "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": "8 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 25,
        "urgency": "low",
        "origin": "https://www.barcelona.cat",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://www.barcelona.cat/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/sitemap.xml",
            "found": true,
            "status": 200,
            "contentType": "application/xml; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/manifest.webmanifest",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/favicon.ico",
            "found": true,
            "status": 200,
            "contentType": "image/x-icon"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "low",
            "detail": "Missing beneficial file(s): /.well-known/security.txt, /manifest.webmanifest."
          }
        ]
      },
      "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": 85,
        "urgency": "medium",
        "data": {
          "hasPrintStyles": true,
          "hasReducedMotion": true,
          "media": {
            "totalImages": 22,
            "lazyImages": 1,
            "totalIframes": 1,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "\"Source Sans Pro\", \"Helvetica Neue\", Helvetica, Arial, sans-serif",
            "usesSystemFont": true
          },
          "tracking": {
            "count": 0,
            "scripts": []
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 1/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": "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"
          }
        ]
      },
      "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": 425756.3,
        "checks": {
          "hasEffectiveTextCompression": false
        },
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Use modern image compression formats",
            "urgency": "high",
            "estimatedSavingsBytes": 235152.3,
            "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": 172133,
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings."
          },
          {
            "id": "uses-text-compression",
            "title": "Enable Brotli/gzip for text assets",
            "urgency": "low",
            "estimatedSavingsBytes": 18471,
            "detail": "Compress HTML, CSS, JS, JSON, SVG, and XML responses with Brotli or gzip."
          }
        ],
        "recommendations": [
          {
            "title": "Use modern image compression formats",
            "urgency": "high",
            "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size. Estimated savings: 229.64 KB."
          },
          {
            "title": "Improve image encoding quality/size",
            "urgency": "high",
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 168.10 KB."
          },
          {
            "title": "Enable Brotli/gzip for text assets",
            "urgency": "low",
            "detail": "Compress HTML, CSS, JS, JSON, SVG, and XML responses with Brotli or gzip. Estimated savings: 18.04 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": 802509.3,
        "totalEstimatedBlockingMs": 1634,
        "opportunities": [
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 252246,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 246 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": 235152.3,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 230 KiB",
            "urgency": "high",
            "sourceAuditId": "modern-image-formats"
          },
          {
            "id": "render-blocking-resources",
            "title": "Eliminate render-blocking resources",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering.",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1634,
            "displayValue": "Est savings of 1,630 ms",
            "urgency": "high",
            "sourceAuditId": "render-blocking-resources"
          },
          {
            "id": "uses-optimized-images",
            "title": "Compress oversized image assets",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss.",
            "estimatedSavingsBytes": 172133,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 168 KiB",
            "urgency": "medium",
            "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": 92026,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 90 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-css-rules"
          },
          {
            "id": "unused-javascript",
            "title": "Remove unused JavaScript",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code.",
            "estimatedSavingsBytes": 32481,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 32 KiB",
            "urgency": "low",
            "sourceAuditId": "unused-javascript"
          },
          {
            "id": "uses-text-compression",
            "title": "Enable text compression",
            "detail": "Serve text assets with Brotli or gzip to remove avoidable transfer bloat.",
            "estimatedSavingsBytes": 18471,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 18 KiB",
            "urgency": "low",
            "sourceAuditId": "uses-text-compression"
          }
        ],
        "recommendations": [
          {
            "title": "Lazy-load offscreen images",
            "urgency": "high",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 246.33 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: 229.64 KB."
          },
          {
            "title": "Eliminate render-blocking resources",
            "urgency": "high",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering. Estimated render unblocking: 1634 ms."
          },
          {
            "title": "Compress oversized image assets",
            "urgency": "medium",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 168.10 KB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "medium",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 89.87 KB."
          },
          {
            "title": "Remove unused JavaScript",
            "urgency": "low",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 31.72 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": 10,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 8,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "8 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": 391815.34570530726
        },
        "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: 382.63 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: 382.63 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": "medium",
        "transferBytes": 1082001,
        "css": {
          "unusedBytes": 92026,
          "ratio": 0.0850516774014072,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 32481,
          "duplicatedBytes": 0,
          "ratio": 0.030019380758428135,
          "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": "high",
            "estimatedSavingsBytes": 92026,
            "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": "medium",
            "estimatedSavingsBytes": 32481,
            "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": 1082001,
        "estimatedDeferrableBytes": 376753,
        "renderBlockingMs": 1634,
        "breakdown": {
          "offscreenImageSavings": 252246,
          "unusedJavascriptSavings": 32481,
          "unusedCssSavings": 92026
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 252246,
            "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": "medium",
            "estimatedSavingsBytes": 32481,
            "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": "high",
            "estimatedSavingsBytes": 92026,
            "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": "Eliminate render-blocking resources",
            "area": "render-path",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1634,
            "strategy": "Defer scripts/styles not required for first paint and preload only truly critical assets.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-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 www.barcelona.cat",
            "area": "font",
            "urgency": "medium",
            "estimatedSavingsBytes": 90560,
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "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 www.barcelona.cat",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 84136,
            "url": "https://www.barcelona.cat/themes/barcelonacat_theme/images/menu/viula.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 cdn.matomo.cloud",
            "area": "script",
            "urgency": "medium",
            "estimatedSavingsBytes": 76426,
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.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 estatics-nasia.dtibcn.cat",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 65967,
            "url": "https://estatics-nasia.dtibcn.cat/nasia-pro/media/99400062408-DISE-Torre%20de%20les%20Aigues%20del%20Poblenou-8-1-10-lc%20(03).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": 65,
        "urgency": "high",
        "providerCount": 8,
        "requestCount": 9,
        "transferBytes": 155366,
        "notGreenCount": 5,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76426,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "cdnjs.cloudflare.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15910,
            "sampleUrl": "https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js",
            "greenCheck": {
              "hostname": "cdnjs.cloudflare.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:34",
              "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/cdnjs.cloudflare.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15566,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7142,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=eiinuR&url=https%3A%2F%2Fwww.barcelona.cat%2Fen%2Fwhat-to-do-in-bcn%2Fparks-and-gardens%2Fbelvederes",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "high",
            "detail": "Track 8 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."
          },
          {
            "title": "Prioritize greener alternatives for third-party providers",
            "urgency": "high",
            "detail": "5 third-party script origin(s) are not confirmed green in the Green Web Foundation dataset."
          }
        ]
      },
      "redundancy": {
        "score": 24,
        "urgency": "low",
        "transferBytes": 1082001,
        "estimatedRedundantBytes": 124507,
        "redundancyRatio": 0.11507105815983534,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 92026,
            "displayValue": "Est savings of 90 KiB"
          },
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 32481,
            "displayValue": "Est savings of 32 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 92026,
            "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 unused javascript",
            "urgency": "medium",
            "estimatedSavingsBytes": 32481,
            "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": "Enable and verify text compression",
            "urgency": "medium",
            "estimatedSavingsBytes": 18471,
            "auditId": "uses-text-compression",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "2",
              "title": "Remove unnecessary or redundant information",
              "url": "https://www.w3.org/TR/web-sustainability-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": 19,
        "urgency": "medium",
        "totalTransferBytes": 1082001,
        "heavyRequestCount": 4,
        "heavyBytes": 271010,
        "heavyRatio": 0.25047111786403153,
        "heavyRequests": [
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "transferSize": 90560,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "transferSize": 76426,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "cdn.matomo.cloud"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament/fonts/icoajuntament.ttf?8aaig7",
            "transferSize": 54919,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/css/css_evpTRQTawGYS1Ro7RbXq3hBxwat7AU-RJm1V8ZgzeaE.css?delta=5&language=en&theme=barcelonacat_theme&include=eJyFztEOwiAMheEXgnDhA5EDq4gySmiZ7u1dYuJinPGqTf_voriOqpipqseShcW9hkXLBntMI8NNUGo53qh_JzpjFBUT0CMVrohQzwv1nicSt8lhlbls_ZdpSGSXTPdPoBeayQVmFe1oPk71CKTCAcWKriXXdCRyZLv_fSSEx3bzgir-9A-0zibE6jfW4d6bp4dSryhGVlGaXYDQE_H9jbg&tcut5n",
            "transferSize": 49105,
            "resourceType": "stylesheet",
            "mimeType": "text/css",
            "domain": "www.barcelona.cat"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "font",
            "count": 2,
            "transferBytes": 145479
          },
          {
            "resourceType": "script",
            "count": 1,
            "transferBytes": 76426
          },
          {
            "resourceType": "stylesheet",
            "count": 1,
            "transferBytes": 49105
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.barcelona.cat",
            "count": 3,
            "transferBytes": 194584
          },
          {
            "domain": "cdn.matomo.cloud",
            "count": 1,
            "transferBytes": 76426
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Lazy-load offscreen images and media galleries",
            "urgency": "high",
            "estimatedSavingsBytes": 252246,
            "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": "Defer non-critical UI modules until after first render",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "strategy": "Keep only above-the-fold resources in the initial path; hydrate or import secondary modules later.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 www.barcelona.cat",
            "urgency": "medium",
            "estimatedSavingsBytes": 90560,
            "strategy": "Subset or defer this font so full font payloads are only fetched when needed.",
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 cdn.matomo.cloud",
            "urgency": "medium",
            "estimatedSavingsBytes": 76426,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.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": "9.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: 9.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 32 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 32 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,
          "displayValue": "Est savings of 90 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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 90 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,
          "displayValue": "Est savings of 230 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 230 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 168 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 168 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,
          "displayValue": "Est savings of 246 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 246 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": "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": 0,
          "displayValue": "Est savings of 1,630 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 Eliminate render-blocking resources\n\n- Lighthouse audit: render-blocking-resources\n- Current value: Est savings of 1,630 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\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": "server-response-time",
          "title": "Reduce initial server response time",
          "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": 0,
          "displayValue": "Root document took 850 ms",
          "impact": "high",
          "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 Reduce initial server response time\n\n- Lighthouse audit: server-response-time\n- Current value: Root document took 850 ms\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": "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": 0.72,
          "displayValue": "4.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 Speed Index\n\n- Lighthouse audit: speed-index\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\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": "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": 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 Enable text compression\n\n- Lighthouse audit: uses-text-compression\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\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": "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": "1,000 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: 1,000 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://barcelona.cat/en/discoverbcn/pics",
      "status": "ok",
      "finalUrl": "https://www.barcelona.cat/en/discoverbcn/pics",
      "performanceScore": 0.6,
      "bestPracticesScore": 0.96,
      "transferBytes": 2165099,
      "co2Grams": 0.8294091560586002,
      "greenWeb": {
        "page": {
          "hostname": "www.barcelona.cat",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-13T22:38:00.231825",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.barcelona.cat",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "cdn.jsdelivr.net",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 163898,
            "sampleUrl": "https://cdn.jsdelivr.net/gh/openlayers/openlayers.github.io@master/en/v5.3.0/build/ol.js",
            "greenCheck": {
              "hostname": "cdn.jsdelivr.net",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:39",
              "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/cdn.jsdelivr.net",
              "error": null
            }
          },
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76425,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "stylesheet",
            "requestCount": 1,
            "transferBytes": 24654,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "cdnjs.cloudflare.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 20756,
            "sampleUrl": "https://cdnjs.cloudflare.com/ajax/libs/proj4js/2.2.1/proj4.js",
            "greenCheck": {
              "hostname": "cdnjs.cloudflare.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:34",
              "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/cdnjs.cloudflare.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15566,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7146,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5656,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 4113,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/css/bcn-avisos.css",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "fonts.googleapis.com",
            "resourceType": "stylesheet",
            "requestCount": 3,
            "transferBytes": 3320,
            "sampleUrl": "https://fonts.googleapis.com/css?family=Source+Sans+3:200,200i,300,300i,400,400i,500,500i,600,600i,700,700i,900,900i",
            "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
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=4TSCBP&url=https%3A%2F%2Fwww.barcelona.cat%2Fen%2Fdiscoverbcn%2Fpics",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 12,
          "greenCount": 6,
          "notGreenCount": 7,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 55,
        "urgency": "medium",
        "pageElementOccurrences": 24,
        "uniqueElementsAssessed": 4,
        "reusedFromCacheCount": 2,
        "components": [
          {
            "signature": "form|get|/en|input|text|query|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "text",
            "fieldName": "query",
            "formContext": "form|get|/en",
            "hasLabel": true,
            "hasValidationRule": false,
            "hasErrorMessagingHook": false,
            "toolingFriendly": false,
            "assessment": {
              "score": 60,
              "urgency": "high",
              "issues": [
                "No explicit validation rule",
                "No error messaging hook",
                "Missing autocomplete for tooling support"
              ],
              "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.",
                "Provide meaningful autocomplete values to support browsers and assistive tooling."
              ]
            },
            "reusedFromCache": true
          },
          {
            "signature": "no-form|input|search|ajuntament-maps-cercador-mapa|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "search",
            "fieldName": "ajuntament-maps-cercador-mapa",
            "formContext": "no-form",
            "hasLabel": true,
            "hasValidationRule": false,
            "hasErrorMessagingHook": false,
            "toolingFriendly": false,
            "assessment": {
              "score": 60,
              "urgency": "high",
              "issues": [
                "No explicit validation rule",
                "No error messaging hook",
                "Missing autocomplete for tooling support"
              ],
              "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.",
                "Provide meaningful autocomplete values to support browsers and assistive tooling."
              ]
            },
            "reusedFromCache": false
          },
          {
            "signature": "form|get|self|input|checkbox|anonymous|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "checkbox",
            "fieldName": null,
            "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": true
          },
          {
            "signature": "form|get|self|input|checkbox|districte|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "checkbox",
            "fieldName": "districte",
            "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
          }
        ],
        "recommendations": [
          {
            "title": "No explicit validation rule",
            "urgency": "medium",
            "detail": "4 unique form control signature(s) on this page include this issue."
          },
          {
            "title": "No error messaging hook",
            "urgency": "medium",
            "detail": "4 unique form control signature(s) on this page include this issue."
          },
          {
            "title": "Missing autocomplete for tooling support",
            "urgency": "medium",
            "detail": "2 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": "Points of interest | Barcelona.cat | Barcelona City Council",
          "lang": "en",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "Explore the main points of interest in Barcelona’s districts: from museums and heritage sites to natural and urban spaces.",
          "robots": "",
          "canonical": "https://www.barcelona.cat/en/discoverbcn/pics",
          "ogTitle": "Points of interest in the city",
          "ogDescription": "Discover Barcelona! Check the main points of interest in the city: museums, cultural heritage sites, activities, urban spaces and much more.",
          "ogType": "Web",
          "ogUrl": "https://www.barcelona.cat/en/discoverbcn/pics",
          "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": 65,
          "tabletSmallTapTargets": 63,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 65,
            "oversizedMedia": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 63,
            "oversizedMedia": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 65 small targets on mobile and 63 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 59,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": true,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": true,
          "externalScriptCount": 9,
          "externalScriptsWithoutIntegrity": 9,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "cache-control": "max-age=300, public",
            "content-encoding": "gzip",
            "content-language": "en",
            "content-length": "13587",
            "content-type": "text/html; charset=UTF-8",
            "date": "Mon, 13 Apr 2026 22:46:57 GMT",
            "etag": "\"1776120416-gzip\"",
            "expires": "Sun, 19 Nov 1978 05:00:00 GMT",
            "last-modified": "Mon, 13 Apr 2026 22:46:56 GMT",
            "server": "nginx",
            "vary": "Cookie,Accept-Encoding",
            "via": "1.1 ca2190123e61f1744d1210c24c87c840.cloudfront.net (CloudFront)",
            "x-amz-cf-id": "IEycoiF40ut0PKc4m3rotPsVPl0bDL8urqIyFV68LtKu-ZogAkvE7w==",
            "x-amz-cf-pop": "IAD12-P5",
            "x-cache": "Miss from cloudfront",
            "x-content-type-options": "nosniff",
            "x-frame-options": "SAMEORIGIN",
            "x-generator": "Drupal 10 (https://www.drupal.org)"
          },
          "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": "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": "9 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 25,
        "urgency": "low",
        "origin": "https://www.barcelona.cat",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://www.barcelona.cat/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/sitemap.xml",
            "found": true,
            "status": 200,
            "contentType": "application/xml; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/manifest.webmanifest",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/favicon.ico",
            "found": true,
            "status": 200,
            "contentType": "image/x-icon"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "low",
            "detail": "Missing beneficial file(s): /.well-known/security.txt, /manifest.webmanifest."
          }
        ]
      },
      "mediaHints": {
        "score": 29,
        "urgency": "low",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 32,
          "imagesWithLazy": 11,
          "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 32 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 85,
        "urgency": "medium",
        "data": {
          "hasPrintStyles": true,
          "hasReducedMotion": true,
          "media": {
            "totalImages": 42,
            "lazyImages": 12,
            "totalIframes": 1,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "\"Source Sans Pro\", \"Helvetica Neue\", Helvetica, Arial, sans-serif",
            "usesSystemFont": true
          },
          "tracking": {
            "count": 0,
            "scripts": []
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 12/42 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": "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"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 52,
        "urgency": "medium",
        "totalEstimatedSavingsBytes": 1132386.1000000003,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Use modern image compression formats",
            "urgency": "high",
            "estimatedSavingsBytes": 823899.1000000003,
            "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": 302412,
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings."
          },
          {
            "id": "unminified-javascript",
            "title": "Minify JavaScript before transfer",
            "urgency": "low",
            "estimatedSavingsBytes": 6075,
            "detail": "Minify JS bundles so transport compression produces better results with fewer bytes."
          }
        ],
        "recommendations": [
          {
            "title": "Use modern image compression formats",
            "urgency": "high",
            "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size. Estimated savings: 804.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: 295.32 KB."
          },
          {
            "title": "Minify JavaScript before transfer",
            "urgency": "low",
            "detail": "Minify JS bundles so transport compression produces better results with fewer bytes. Estimated savings: 5.93 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": 1797881.1000000003,
        "totalEstimatedBlockingMs": 1767,
        "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": 823899.1000000003,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 805 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": 339778,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 332 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": 302412,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 295 KiB",
            "urgency": "high",
            "sourceAuditId": "uses-optimized-images"
          },
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 244375,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 239 KiB",
            "urgency": "high",
            "sourceAuditId": "offscreen-images"
          },
          {
            "id": "render-blocking-resources",
            "title": "Eliminate render-blocking resources",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering.",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1767,
            "displayValue": "Est savings of 1,770 ms",
            "urgency": "high",
            "sourceAuditId": "render-blocking-resources"
          },
          {
            "id": "unused-css-rules",
            "title": "Remove unused CSS",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped.",
            "estimatedSavingsBytes": 81342,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 79 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-css-rules"
          },
          {
            "id": "unminified-javascript",
            "title": "Minify JavaScript",
            "detail": "Use minified production JS output to reduce payload size.",
            "estimatedSavingsBytes": 6075,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 6 KiB",
            "urgency": "low",
            "sourceAuditId": "unminified-javascript"
          }
        ],
        "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: 804.59 KB."
          },
          {
            "title": "Remove unused JavaScript",
            "urgency": "high",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 331.81 KB."
          },
          {
            "title": "Compress oversized image assets",
            "urgency": "high",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 295.32 KB."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "high",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 238.65 KB."
          },
          {
            "title": "Eliminate render-blocking resources",
            "urgency": "high",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering. Estimated render unblocking: 1767 ms."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "medium",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 79.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": 10,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 9,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "9 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": 852298.8397346365
        },
        "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: 832.32 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: 832.32 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": 13,
        "urgency": "high",
        "transferBytes": 2165099,
        "css": {
          "unusedBytes": 81342,
          "ratio": 0.0375696446213314,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 339778,
          "duplicatedBytes": 0,
          "ratio": 0.1569341632876834,
          "auditIds": [
            "unused-javascript",
            "duplicated-javascript"
          ]
        },
        "html": {
          "estimatedPenalty": 0.25,
          "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": "high",
            "estimatedSavingsBytes": 81342,
            "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": 339778,
            "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": 24,
        "urgency": "high",
        "transferBytes": 2165099,
        "estimatedDeferrableBytes": 665495,
        "renderBlockingMs": 1767,
        "breakdown": {
          "offscreenImageSavings": 244375,
          "unusedJavascriptSavings": 339778,
          "unusedCssSavings": 81342
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 244375,
            "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": 339778,
            "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": 81342,
            "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": "Eliminate render-blocking resources",
            "area": "render-path",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1767,
            "strategy": "Defer scripts/styles not required for first paint and preload only truly critical assets.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-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.barcelona.cat",
            "area": "script",
            "urgency": "high",
            "estimatedSavingsBytes": 275915,
            "url": "https://www.barcelona.cat/estatics/geobcn/1.0/api-full-ca.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 www.barcelona.cat",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 176223,
            "url": "https://www.barcelona.cat/sites/default/files/styles/distribuidora_central/public/2x_127121114063014-387x223_0.jpg?itok=EBJeLvHr",
            "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 cdn.jsdelivr.net",
            "area": "script",
            "urgency": "medium",
            "estimatedSavingsBytes": 163898,
            "url": "https://cdn.jsdelivr.net/gh/openlayers/openlayers.github.io@master/en/v5.3.0/build/ol.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 cdn-geo.bcn.cat",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 95596,
            "url": "https://cdn-geo.bcn.cat/tilecache/planolbcnweb_cache_EPSG25831//01/000/000/003/000/000/003.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": 82,
        "urgency": "high",
        "providerCount": 9,
        "requestCount": 10,
        "transferBytes": 324323,
        "notGreenCount": 5,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "cdn.jsdelivr.net",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 163898,
            "sampleUrl": "https://cdn.jsdelivr.net/gh/openlayers/openlayers.github.io@master/en/v5.3.0/build/ol.js",
            "greenCheck": {
              "hostname": "cdn.jsdelivr.net",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:39",
              "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/cdn.jsdelivr.net",
              "error": null
            }
          },
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76425,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "cdnjs.cloudflare.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 20756,
            "sampleUrl": "https://cdnjs.cloudflare.com/ajax/libs/proj4js/2.2.1/proj4.js",
            "greenCheck": {
              "hostname": "cdnjs.cloudflare.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:34",
              "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/cdnjs.cloudflare.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15566,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7146,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5656,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=4TSCBP&url=https%3A%2F%2Fwww.barcelona.cat%2Fen%2Fdiscoverbcn%2Fpics",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "high",
            "detail": "Track 9 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."
          },
          {
            "title": "Prioritize greener alternatives for third-party providers",
            "urgency": "high",
            "detail": "5 third-party script origin(s) are not confirmed green in the Green Web Foundation dataset."
          }
        ]
      },
      "redundancy": {
        "score": 33,
        "urgency": "medium",
        "transferBytes": 2165099,
        "estimatedRedundantBytes": 421120,
        "redundancyRatio": 0.19450380790901478,
        "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": 339778,
            "displayValue": "Est savings of 332 KiB"
          },
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 81342,
            "displayValue": "Est savings of 79 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused javascript",
            "urgency": "high",
            "estimatedSavingsBytes": 339778,
            "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": 81342,
            "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": 29,
        "urgency": "medium",
        "totalTransferBytes": 2165099,
        "heavyRequestCount": 7,
        "heavyBytes": 887049,
        "heavyRatio": 0.4097036671302328,
        "heavyRequests": [
          {
            "url": "https://www.barcelona.cat/estatics/geobcn/1.0/api-full-ca.js",
            "transferSize": 275915,
            "resourceType": "script",
            "mimeType": "text/javascript",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/distribuidora_central/public/2x_127121114063014-387x223_0.jpg?itok=EBJeLvHr",
            "transferSize": 176223,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://cdn.jsdelivr.net/gh/openlayers/openlayers.github.io@master/en/v5.3.0/build/ol.js",
            "transferSize": 163898,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "cdn.jsdelivr.net"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "transferSize": 90560,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "transferSize": 76425,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "cdn.matomo.cloud"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament/fonts/icoajuntament.ttf?8aaig7",
            "transferSize": 54922,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/css/css_evpTRQTawGYS1Ro7RbXq3hBxwat7AU-RJm1V8ZgzeaE.css?delta=5&language=en&theme=barcelonacat_theme&include=eJyFz0GOwyAMBdALQVn0QOhDrISRgxE26fT2w6hSo5Ey6sr4_7cw-BrVsFO1iKOoaHgNj1YcznJHm9V797-7S-iZWCoyLMpBvZeFNEwwvInw7P8zDSv5o9DjL7CNdgpJxNQ6WsxLvQIrSwJ7tSeXul6JksWf514JefBVrDJmFhVV4_0TaF1cyjVO1hHer0jfRr2CXUPHOj-yaVj6aODbmdxGbSNx0Y0Wp0812kOC0g--_57_&tcut5n",
            "transferSize": 49106,
            "resourceType": "stylesheet",
            "mimeType": "text/css",
            "domain": "www.barcelona.cat"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "script",
            "count": 3,
            "transferBytes": 516238
          },
          {
            "resourceType": "image",
            "count": 1,
            "transferBytes": 176223
          },
          {
            "resourceType": "font",
            "count": 2,
            "transferBytes": 145482
          },
          {
            "resourceType": "stylesheet",
            "count": 1,
            "transferBytes": 49106
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.barcelona.cat",
            "count": 5,
            "transferBytes": 646726
          },
          {
            "domain": "cdn.jsdelivr.net",
            "count": 1,
            "transferBytes": 163898
          },
          {
            "domain": "cdn.matomo.cloud",
            "count": 1,
            "transferBytes": 76425
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Lazy-load offscreen images and media galleries",
            "urgency": "high",
            "estimatedSavingsBytes": 244375,
            "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": 339778,
            "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": "Defer non-critical UI modules until after first render",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "strategy": "Keep only above-the-fold resources in the initial path; hydrate or import secondary modules later.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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.barcelona.cat",
            "urgency": "high",
            "estimatedSavingsBytes": 275915,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://www.barcelona.cat/estatics/geobcn/1.0/api-full-ca.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 www.barcelona.cat",
            "urgency": "medium",
            "estimatedSavingsBytes": 176223,
            "strategy": "Serve a smaller placeholder first and load this asset only when the user scrolls to or requests the component.",
            "url": "https://www.barcelona.cat/sites/default/files/styles/distribuidora_central/public/2x_127121114063014-387x223_0.jpg?itok=EBJeLvHr",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 cdn.jsdelivr.net",
            "urgency": "medium",
            "estimatedSavingsBytes": 163898,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://cdn.jsdelivr.net/gh/openlayers/openlayers.github.io@master/en/v5.3.0/build/ol.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.02,
          "displayValue": "8.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: 8.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 332 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 332 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,
          "displayValue": "Est savings of 79 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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 79 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,
          "displayValue": "Est savings of 805 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 805 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 295 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 295 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,
          "displayValue": "Est savings of 239 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 239 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": "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": 0,
          "displayValue": "Est savings of 1,770 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 Eliminate render-blocking resources\n\n- Lighthouse audit: render-blocking-resources\n- Current value: Est savings of 1,770 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\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": "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,
          "displayValue": "1,115 elements",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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: 1,115 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"
        },
        {
          "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": 0.58,
          "displayValue": "5.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 Speed Index\n\n- Lighthouse audit: speed-index\n- Current value: 5.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\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"
        }
      ]
    },
    {
      "url": "https://barcelona.cat/es/vivir-en-bcn/vive-el-barrio",
      "status": "ok",
      "finalUrl": "https://www.barcelona.cat/es/vivir-en-bcn/vive-el-barrio",
      "performanceScore": 0.6,
      "bestPracticesScore": 0.82,
      "transferBytes": 2919509,
      "co2Grams": 1.1184095950326003,
      "greenWeb": {
        "page": {
          "hostname": "www.barcelona.cat",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-13T22:38:00.231825",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.barcelona.cat",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76426,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31745,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "stylesheet",
            "requestCount": 1,
            "transferBytes": 24654,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15566,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7146,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 4113,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/css/bcn-avisos.css",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "fonts.googleapis.com",
            "resourceType": "stylesheet",
            "requestCount": 3,
            "transferBytes": 3415,
            "sampleUrl": "https://fonts.googleapis.com/css?family=Source+Sans+3:200,200i,300,300i,400,400i,500,500i,600,600i,700,700i,900,900i",
            "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
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=tShEYB&url=https%3A%2F%2Fwww.barcelona.cat%2Fes%2Fvivir-en-bcn%2Fvive-el-barrio",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 10,
          "greenCount": 4,
          "notGreenCount": 7,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 60,
        "urgency": "high",
        "pageElementOccurrences": 1,
        "uniqueElementsAssessed": 1,
        "reusedFromCacheCount": 1,
        "components": [
          {
            "signature": "form|get|/es/|input|text|query|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "text",
            "fieldName": "query",
            "formContext": "form|get|/es/",
            "hasLabel": true,
            "hasValidationRule": false,
            "hasErrorMessagingHook": false,
            "toolingFriendly": false,
            "assessment": {
              "score": 60,
              "urgency": "high",
              "issues": [
                "No explicit validation rule",
                "No error messaging hook",
                "Missing autocomplete for tooling support"
              ],
              "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.",
                "Provide meaningful autocomplete values to support browsers and assistive tooling."
              ]
            },
            "reusedFromCache": true
          }
        ],
        "recommendations": [
          {
            "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."
          },
          {
            "title": "Missing autocomplete for tooling support",
            "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": "Hagamos barrio | Barcelona.cat | Ayuntamiento de Barcelona",
          "lang": "es",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "Explora los distritos y barrios de Barcelona con el mapa interactivo.",
          "robots": "",
          "canonical": "https://www.barcelona.cat/es/vivir-en-bcn/vive-el-barrio",
          "ogTitle": "Hagamos barrio: Mapa de barrios y distritos de Barcelona",
          "ogDescription": "Explora los distritos y barrios de la ciudad a través del mapa interactivo. Encuentra fácilmente los servicios y la información de tu entorno más cercano.",
          "ogType": "Web",
          "ogUrl": "https://www.barcelona.cat/es/vivir-en-bcn/vive-el-barrio",
          "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": 32,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 34,
            "oversizedMedia": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 32,
            "oversizedMedia": 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 32 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 59,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": true,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": true,
          "externalScriptCount": 7,
          "externalScriptsWithoutIntegrity": 7,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "cache-control": "max-age=300, public",
            "content-encoding": "gzip",
            "content-language": "es",
            "content-length": "9834",
            "content-type": "text/html; charset=UTF-8",
            "date": "Mon, 13 Apr 2026 22:47:18 GMT",
            "etag": "\"1776120438-gzip\"",
            "expires": "Sun, 19 Nov 1978 05:00:00 GMT",
            "last-modified": "Mon, 13 Apr 2026 22:47:18 GMT",
            "server": "nginx",
            "vary": "Cookie,Accept-Encoding",
            "via": "1.1 ca2190123e61f1744d1210c24c87c840.cloudfront.net (CloudFront)",
            "x-amz-cf-id": "3b74fEnMLtMrOo3FMFHWi0vq0KP35lLZsh9Qs8MP4XNBHuxzR3Wd4g==",
            "x-amz-cf-pop": "IAD12-P5",
            "x-cache": "Miss from cloudfront",
            "x-content-type-options": "nosniff",
            "x-frame-options": "SAMEORIGIN",
            "x-generator": "Drupal 10 (https://www.drupal.org)"
          },
          "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": "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": "7 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 25,
        "urgency": "low",
        "origin": "https://www.barcelona.cat",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://www.barcelona.cat/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/sitemap.xml",
            "found": true,
            "status": 200,
            "contentType": "application/xml; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/manifest.webmanifest",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/favicon.ico",
            "found": true,
            "status": 200,
            "contentType": "image/x-icon"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "low",
            "detail": "Missing beneficial file(s): /.well-known/security.txt, /manifest.webmanifest."
          }
        ]
      },
      "mediaHints": {
        "score": 50,
        "urgency": "medium",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 11,
          "imagesWithLazy": 0,
          "imagesWithoutLazy": 11
        },
        "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": "11 of 11 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 85,
        "urgency": "medium",
        "data": {
          "hasPrintStyles": true,
          "hasReducedMotion": true,
          "media": {
            "totalImages": 16,
            "lazyImages": 1,
            "totalIframes": 2,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "\"Source Sans Pro\", \"Helvetica Neue\", Helvetica, Arial, sans-serif",
            "usesSystemFont": true
          },
          "tracking": {
            "count": 0,
            "scripts": []
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 1/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": "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"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 77,
        "urgency": "high",
        "totalEstimatedSavingsBytes": 2256627,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Use modern image compression formats",
            "urgency": "high",
            "estimatedSavingsBytes": 1490906.0000000002,
            "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": 765721,
            "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: 1.42 MB."
          },
          {
            "title": "Improve image encoding quality/size",
            "urgency": "high",
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 747.77 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": 2431009,
        "totalEstimatedBlockingMs": 1538,
        "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": 1490906.0000000002,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 1,456 KiB",
            "urgency": "high",
            "sourceAuditId": "modern-image-formats"
          },
          {
            "id": "uses-optimized-images",
            "title": "Compress oversized image assets",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss.",
            "estimatedSavingsBytes": 765721,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 748 KiB",
            "urgency": "high",
            "sourceAuditId": "uses-optimized-images"
          },
          {
            "id": "render-blocking-resources",
            "title": "Eliminate render-blocking resources",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering.",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1538,
            "displayValue": "Est savings of 1,540 ms",
            "urgency": "high",
            "sourceAuditId": "render-blocking-resources"
          },
          {
            "id": "unused-javascript",
            "title": "Remove unused JavaScript",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code.",
            "estimatedSavingsBytes": 89309,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 87 KiB",
            "urgency": "medium",
            "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": 81625,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 80 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-css-rules"
          },
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 3448,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 3 KiB",
            "urgency": "low",
            "sourceAuditId": "offscreen-images"
          }
        ],
        "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.42 MB."
          },
          {
            "title": "Compress oversized image assets",
            "urgency": "high",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 747.77 KB."
          },
          {
            "title": "Eliminate render-blocking resources",
            "urgency": "high",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering. Estimated render unblocking: 1538 ms."
          },
          {
            "title": "Remove unused JavaScript",
            "urgency": "medium",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 87.22 KB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "medium",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 79.71 KB."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "low",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 3.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": 10,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 7,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "7 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": 168001.13945530728
        },
        "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: 164.06 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: 164.06 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": "medium",
        "transferBytes": 2919509,
        "css": {
          "unusedBytes": 81625,
          "ratio": 0.027958468358891854,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 89309,
          "duplicatedBytes": 0,
          "ratio": 0.030590417772303494,
          "auditIds": [
            "unused-javascript",
            "duplicated-javascript"
          ]
        },
        "html": {
          "estimatedPenalty": 0.25,
          "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": "high",
            "estimatedSavingsBytes": 81625,
            "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": 89309,
            "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": 2919509,
        "estimatedDeferrableBytes": 174382,
        "renderBlockingMs": 1538,
        "breakdown": {
          "offscreenImageSavings": 3448,
          "unusedJavascriptSavings": 89309,
          "unusedCssSavings": 81625
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 3448,
            "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": "medium",
            "estimatedSavingsBytes": 89309,
            "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": 81625,
            "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": "Eliminate render-blocking resources",
            "area": "render-path",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1538,
            "strategy": "Defer scripts/styles not required for first paint and preload only truly critical assets.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-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 www.barcelona.cat",
            "area": "image",
            "urgency": "high",
            "estimatedSavingsBytes": 913937,
            "url": "https://www.barcelona.cat/themes/barcelonacat_theme/includes/fembarri/img/selection_map_es.jpg?v=20260401-1",
            "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 www.barcelona.cat",
            "area": "font",
            "urgency": "medium",
            "estimatedSavingsBytes": 90561,
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "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": 64,
        "urgency": "high",
        "providerCount": 7,
        "requestCount": 8,
        "transferBytes": 139459,
        "notGreenCount": 5,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76426,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31745,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15566,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7146,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=tShEYB&url=https%3A%2F%2Fwww.barcelona.cat%2Fes%2Fvivir-en-bcn%2Fvive-el-barrio",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "high",
            "detail": "Track 7 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."
          },
          {
            "title": "Prioritize greener alternatives for third-party providers",
            "urgency": "high",
            "detail": "5 third-party script origin(s) are not confirmed green in the Green Web Foundation dataset."
          }
        ]
      },
      "redundancy": {
        "score": 23,
        "urgency": "medium",
        "transferBytes": 2919509,
        "estimatedRedundantBytes": 170934,
        "redundancyRatio": 0.05854888613119535,
        "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": 89309,
            "displayValue": "Est savings of 87 KiB"
          },
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 81625,
            "displayValue": "Est savings of 80 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused javascript",
            "urgency": "medium",
            "estimatedSavingsBytes": 89309,
            "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": 81625,
            "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": 35,
        "urgency": "high",
        "totalTransferBytes": 2919509,
        "heavyRequestCount": 6,
        "heavyBytes": 2089985,
        "heavyRatio": 0.7158686614769812,
        "heavyRequests": [
          {
            "url": "https://www.barcelona.cat/themes/barcelonacat_theme/includes/fembarri/img/selection_map_es.jpg?v=20260401-1",
            "transferSize": 913937,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/themes/barcelonacat_theme/includes/fembarri/img/0_map_es.jpg?v=20260401-1",
            "transferSize": 905047,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "transferSize": 90561,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "transferSize": 76426,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "cdn.matomo.cloud"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament/fonts/icoajuntament.ttf?8aaig7",
            "transferSize": 54919,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/css/css_evpTRQTawGYS1Ro7RbXq3hBxwat7AU-RJm1V8ZgzeaE.css?delta=5&language=es&theme=barcelonacat_theme&include=eJyFzkEKwzAMBMAPxfjQB5m1I1IXRzKSkja_r6EQKKT0pGV3DsJjY8dK7Al7NbH4OQG9ThlaqAmjwJPspFpnsjj0Flykjf2X6Vgo7JWe38DvtFLMIm6u6KnMfAWWJhktmB-t8nIlapGA8_crYbKNLhnY0u0f6CpTLpwGU8QzJXo5KaNNdpjTGjOM3gg5eRY&tcut5n",
            "transferSize": 49095,
            "resourceType": "stylesheet",
            "mimeType": "text/css",
            "domain": "www.barcelona.cat"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "image",
            "count": 2,
            "transferBytes": 1818984
          },
          {
            "resourceType": "font",
            "count": 2,
            "transferBytes": 145480
          },
          {
            "resourceType": "script",
            "count": 1,
            "transferBytes": 76426
          },
          {
            "resourceType": "stylesheet",
            "count": 1,
            "transferBytes": 49095
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.barcelona.cat",
            "count": 5,
            "transferBytes": 2013559
          },
          {
            "domain": "cdn.matomo.cloud",
            "count": 1,
            "transferBytes": 76426
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Split JavaScript by route or interaction",
            "urgency": "medium",
            "estimatedSavingsBytes": 89309,
            "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": "Defer non-critical UI modules until after first render",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "strategy": "Keep only above-the-fold resources in the initial path; hydrate or import secondary modules later.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 www.barcelona.cat",
            "urgency": "high",
            "estimatedSavingsBytes": 913937,
            "strategy": "Serve a smaller placeholder first and load this asset only when the user scrolls to or requests the component.",
            "url": "https://www.barcelona.cat/themes/barcelonacat_theme/includes/fembarri/img/selection_map_es.jpg?v=20260401-1",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 www.barcelona.cat",
            "urgency": "medium",
            "estimatedSavingsBytes": 90561,
            "strategy": "Subset or defer this font so full font payloads are only fetched when needed.",
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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": "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,
          "displayValue": "Est savings of 80 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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 80 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,
          "displayValue": "Est savings of 1,456 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,456 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 748 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 748 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,
          "displayValue": "Est savings of 3 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 3 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": "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": 0,
          "displayValue": "Est savings of 1,540 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 Eliminate render-blocking resources\n\n- Lighthouse audit: render-blocking-resources\n- Current value: Est savings of 1,540 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\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": "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,
          "displayValue": "918 elements",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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: 918 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"
        },
        {
          "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": 0.79,
          "displayValue": "4.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 Speed Index\n\n- Lighthouse audit: speed-index\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\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": 0.5,
          "displayValue": "Est savings of 87 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 87 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": "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,851 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,851 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://barcelona.cat/ca/viure-a-bcn/diada/transports-publics-durant-la-diada-2024",
      "status": "ok",
      "finalUrl": "https://www.barcelona.cat/ca/viure-a-bcn/diada/transports-publics-durant-la-diada-2024",
      "performanceScore": 0.6,
      "bestPracticesScore": 0.79,
      "transferBytes": 2013794,
      "co2Grams": 0.7714470248316,
      "greenWeb": {
        "page": {
          "hostname": "www.barcelona.cat",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-13T22:38:00.231825",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.barcelona.cat",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "maps.googleapis.com",
            "resourceType": "script",
            "requestCount": 13,
            "transferBytes": 422820,
            "sampleUrl": "https://maps.googleapis.com/maps/api/js?v=3.63&client=google-maps-pro&language=en_US&region=US&libraries=places,visualization,geometry,search",
            "greenCheck": {
              "hostname": "maps.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:28",
              "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/maps.googleapis.com",
              "error": null
            }
          },
          {
            "hostname": "www.gstatic.com",
            "resourceType": "script",
            "requestCount": 4,
            "transferBytes": 293623,
            "sampleUrl": "https://www.gstatic.com/mapspro/_/js/k=mapspro.gmeviewer.en_US._bcd-18objU.O/am=AAAI/d=0/rs=ABjfnFX7nFuJKtfQMyEDOV9llYzRUuRsKg/m=gmeviewer_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": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76425,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "www.gstatic.com",
            "resourceType": "stylesheet",
            "requestCount": 1,
            "transferBytes": 51969,
            "sampleUrl": "https://www.gstatic.com/mapspro/_/ss/k=mapspro.gmeviewer._T3iEl8Rf-Y.L.W.O/am=AAAI/d=0/rs=ABjfnFUmhIKackrXoBnPPtvjVyCpHm-ZBw",
            "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": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "stylesheet",
            "requestCount": 1,
            "transferBytes": 24654,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15565,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "fonts.googleapis.com",
            "resourceType": "stylesheet",
            "requestCount": 5,
            "transferBytes": 8812,
            "sampleUrl": "https://fonts.googleapis.com/css?family=Source+Sans+3:200,200i,300,300i,400,400i,500,500i,600,600i,700,700i,900,900i",
            "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
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7151,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 4128,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/css/bcn-avisos.css",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=zDycLx&url=https%3A%2F%2Fwww.barcelona.cat%2Fca%2Fviure-a-bcn%2Fdiada%2Ftransports-publics-durant-la-diada-2024",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 13,
          "greenCount": 7,
          "notGreenCount": 7,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 60,
        "urgency": "high",
        "pageElementOccurrences": 1,
        "uniqueElementsAssessed": 1,
        "reusedFromCacheCount": 1,
        "components": [
          {
            "signature": "form|get|/ca|input|text|query|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "text",
            "fieldName": "query",
            "formContext": "form|get|/ca",
            "hasLabel": true,
            "hasValidationRule": false,
            "hasErrorMessagingHook": false,
            "toolingFriendly": false,
            "assessment": {
              "score": 60,
              "urgency": "high",
              "issues": [
                "No explicit validation rule",
                "No error messaging hook",
                "Missing autocomplete for tooling support"
              ],
              "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.",
                "Provide meaningful autocomplete values to support browsers and assistive tooling."
              ]
            },
            "reusedFromCache": true
          }
        ],
        "recommendations": [
          {
            "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."
          },
          {
            "title": "Missing autocomplete for tooling support",
            "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": "Transport públic Diada 2024 | Ajuntament Barcelona",
          "lang": "ca",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "Informació sobre el funcionament i les alteracions del transport públic i la xarxa de bus i metro a Barcelona durant l’11 de setembre, Diada Nacional de Catalunya 2024.",
          "robots": "",
          "canonical": "https://www.barcelona.cat/ca/viure-a-bcn/diada/transports-publics-durant-la-diada-2024",
          "ogTitle": "Transport públic Diada 2024 | Ajuntament Barcelona",
          "ogDescription": "Informació sobre el funcionament i ús del transport públic i la xarxa de bus i metro a Barcelona durant l’11 de Setembre, Diada Nacional de Catalunya 2024.",
          "ogType": "Web",
          "ogUrl": "https://www.barcelona.cat/ca/viure-a-bcn/diada/transports-publics-durant-la-diada-2024",
          "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": 54,
          "tabletSmallTapTargets": 53,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 54,
            "oversizedMedia": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 53,
            "oversizedMedia": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 54 small targets on mobile and 53 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 59,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": true,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": true,
          "externalScriptCount": 8,
          "externalScriptsWithoutIntegrity": 8,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "cache-control": "max-age=300, public",
            "content-encoding": "gzip",
            "content-language": "ca",
            "content-length": "10869",
            "content-type": "text/html; charset=UTF-8",
            "date": "Mon, 13 Apr 2026 22:47:34 GMT",
            "etag": "\"1776120453-gzip\"",
            "expires": "Sun, 19 Nov 1978 05:00:00 GMT",
            "last-modified": "Mon, 13 Apr 2026 22:47:33 GMT",
            "server": "nginx",
            "vary": "Cookie,Accept-Encoding",
            "via": "1.1 ca2190123e61f1744d1210c24c87c840.cloudfront.net (CloudFront)",
            "x-amz-cf-id": "4V8YwkiBKA74qmShd5klMJMtLTj5bb5IVNcUmUSsgO7p5uaFlorwQQ==",
            "x-amz-cf-pop": "IAD12-P5",
            "x-cache": "Miss from cloudfront",
            "x-content-type-options": "nosniff",
            "x-frame-options": "SAMEORIGIN",
            "x-generator": "Drupal 10 (https://www.drupal.org)"
          },
          "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": "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": "8 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 25,
        "urgency": "low",
        "origin": "https://www.barcelona.cat",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://www.barcelona.cat/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/sitemap.xml",
            "found": true,
            "status": 200,
            "contentType": "application/xml; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/manifest.webmanifest",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/favicon.ico",
            "found": true,
            "status": 200,
            "contentType": "image/x-icon"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "low",
            "detail": "Missing beneficial file(s): /.well-known/security.txt, /manifest.webmanifest."
          }
        ]
      },
      "mediaHints": {
        "score": 46,
        "urgency": "medium",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 16,
          "imagesWithLazy": 1,
          "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 16 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 85,
        "urgency": "medium",
        "data": {
          "hasPrintStyles": true,
          "hasReducedMotion": true,
          "media": {
            "totalImages": 16,
            "lazyImages": 1,
            "totalIframes": 2,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "\"Source Sans Pro\", \"Helvetica Neue\", Helvetica, Arial, sans-serif",
            "usesSystemFont": true
          },
          "tracking": {
            "count": 0,
            "scripts": []
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 1/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": "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"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 6,
        "urgency": "low",
        "totalEstimatedSavingsBytes": 130442.55,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Use modern image compression formats",
            "urgency": "medium",
            "estimatedSavingsBytes": 72410.55,
            "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size."
          },
          {
            "id": "uses-optimized-images",
            "title": "Improve image encoding quality/size",
            "urgency": "medium",
            "estimatedSavingsBytes": 58032,
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings."
          }
        ],
        "recommendations": [
          {
            "title": "Use modern image compression formats",
            "urgency": "medium",
            "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size. Estimated savings: 70.71 KB."
          },
          {
            "title": "Improve image encoding quality/size",
            "urgency": "medium",
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 56.67 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": 247178.55,
        "totalEstimatedBlockingMs": 766,
        "opportunities": [
          {
            "id": "unused-css-rules",
            "title": "Remove unused CSS",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped.",
            "estimatedSavingsBytes": 81421,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 80 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-css-rules"
          },
          {
            "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": 72410.55,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 71 KiB",
            "urgency": "medium",
            "sourceAuditId": "modern-image-formats"
          },
          {
            "id": "uses-optimized-images",
            "title": "Compress oversized image assets",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss.",
            "estimatedSavingsBytes": 58032,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 57 KiB",
            "urgency": "medium",
            "sourceAuditId": "uses-optimized-images"
          },
          {
            "id": "render-blocking-resources",
            "title": "Eliminate render-blocking resources",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering.",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 766,
            "displayValue": "Est savings of 770 ms",
            "urgency": "medium",
            "sourceAuditId": "render-blocking-resources"
          },
          {
            "id": "unused-javascript",
            "title": "Remove unused JavaScript",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code.",
            "estimatedSavingsBytes": 31867,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 31 KiB",
            "urgency": "low",
            "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": 3448,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 3 KiB",
            "urgency": "low",
            "sourceAuditId": "offscreen-images"
          }
        ],
        "recommendations": [
          {
            "title": "Remove unused CSS",
            "urgency": "medium",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 79.51 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: 70.71 KB."
          },
          {
            "title": "Compress oversized image assets",
            "urgency": "medium",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 56.67 KB."
          },
          {
            "title": "Eliminate render-blocking resources",
            "urgency": "medium",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering. Estimated render unblocking: 766 ms."
          },
          {
            "title": "Remove unused JavaScript",
            "urgency": "low",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 31.12 KB."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "low",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 3.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": 10,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 8,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "8 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": 220630.23140130355
        },
        "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: 215.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: 215.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": "medium",
        "transferBytes": 2013794,
        "css": {
          "unusedBytes": 81421,
          "ratio": 0.04043164295851512,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 31867,
          "duplicatedBytes": 0,
          "ratio": 0.015824359393264653,
          "auditIds": [
            "unused-javascript",
            "duplicated-javascript"
          ]
        },
        "html": {
          "estimatedPenalty": 0.25,
          "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": "high",
            "estimatedSavingsBytes": 81421,
            "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": "medium",
            "estimatedSavingsBytes": 31867,
            "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": 2013794,
        "estimatedDeferrableBytes": 116736,
        "renderBlockingMs": 766,
        "breakdown": {
          "offscreenImageSavings": 3448,
          "unusedJavascriptSavings": 31867,
          "unusedCssSavings": 81421
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 3448,
            "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": "medium",
            "estimatedSavingsBytes": 31867,
            "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": 81421,
            "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": "Eliminate render-blocking resources",
            "area": "render-path",
            "urgency": "medium",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 766,
            "strategy": "Defer scripts/styles not required for first paint and preload only truly critical assets.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-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": 251720,
            "url": "https://www.gstatic.com/mapspro/_/js/k=mapspro.gmeviewer.en_US._bcd-18objU.O/am=AAAI/d=0/rs=ABjfnFX7nFuJKtfQMyEDOV9llYzRUuRsKg/m=gmeviewer_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 script from maps.googleapis.com",
            "area": "script",
            "urgency": "medium",
            "estimatedSavingsBytes": 181504,
            "url": "https://maps.googleapis.com/maps/api/js?v=3.63&client=google-maps-pro&language=en_US&region=US&libraries=places,visualization,geometry,search",
            "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 www.barcelona.cat",
            "area": "font",
            "urgency": "medium",
            "estimatedSavingsBytes": 90560,
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "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 www.barcelona.cat",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 84138,
            "url": "https://www.barcelona.cat/themes/barcelonacat_theme/images/menu/viula.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": 90,
        "urgency": "high",
        "providerCount": 9,
        "requestCount": 25,
        "transferBytes": 855906,
        "notGreenCount": 5,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "maps.googleapis.com",
            "resourceType": "script",
            "requestCount": 13,
            "transferBytes": 422820,
            "sampleUrl": "https://maps.googleapis.com/maps/api/js?v=3.63&client=google-maps-pro&language=en_US&region=US&libraries=places,visualization,geometry,search",
            "greenCheck": {
              "hostname": "maps.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:28",
              "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/maps.googleapis.com",
              "error": null
            }
          },
          {
            "hostname": "www.gstatic.com",
            "resourceType": "script",
            "requestCount": 4,
            "transferBytes": 293623,
            "sampleUrl": "https://www.gstatic.com/mapspro/_/js/k=mapspro.gmeviewer.en_US._bcd-18objU.O/am=AAAI/d=0/rs=ABjfnFX7nFuJKtfQMyEDOV9llYzRUuRsKg/m=gmeviewer_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": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76425,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15565,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7151,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=zDycLx&url=https%3A%2F%2Fwww.barcelona.cat%2Fca%2Fviure-a-bcn%2Fdiada%2Ftransports-publics-durant-la-diada-2024",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "high",
            "detail": "Track 9 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."
          },
          {
            "title": "Prioritize greener alternatives for third-party providers",
            "urgency": "high",
            "detail": "5 third-party script origin(s) are not confirmed green in the Green Web Foundation dataset."
          }
        ]
      },
      "redundancy": {
        "score": 23,
        "urgency": "low",
        "transferBytes": 2013794,
        "estimatedRedundantBytes": 113288,
        "redundancyRatio": 0.05625600235177978,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 81421,
            "displayValue": "Est savings of 80 KiB"
          },
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 31867,
            "displayValue": "Est savings of 31 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 81421,
            "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 unused javascript",
            "urgency": "medium",
            "estimatedSavingsBytes": 31867,
            "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 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": 28,
        "urgency": "high",
        "totalTransferBytes": 2013794,
        "heavyRequestCount": 9,
        "heavyBytes": 947866,
        "heavyRatio": 0.4706866740093575,
        "heavyRequests": [
          {
            "url": "https://www.gstatic.com/mapspro/_/js/k=mapspro.gmeviewer.en_US._bcd-18objU.O/am=AAAI/d=0/rs=ABjfnFX7nFuJKtfQMyEDOV9llYzRUuRsKg/m=gmeviewer_base",
            "transferSize": 251720,
            "resourceType": "script",
            "mimeType": "text/javascript",
            "domain": "www.gstatic.com"
          },
          {
            "url": "https://maps.googleapis.com/maps/api/js?v=3.63&client=google-maps-pro&language=en_US&region=US&libraries=places,visualization,geometry,search",
            "transferSize": 181504,
            "resourceType": "script",
            "mimeType": "text/javascript",
            "domain": "maps.googleapis.com"
          },
          {
            "url": "https://www.google.com/maps/d/embed?mid=1VaSGODz5xqqjcZGSbOu42wrfhJo0ulA&ehbc=2E312F",
            "transferSize": 119272,
            "resourceType": "document",
            "mimeType": "text/html",
            "domain": "www.google.com"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "transferSize": 90560,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "transferSize": 76425,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "cdn.matomo.cloud"
          },
          {
            "url": "https://maps.googleapis.com/maps-api-v3/api/js/63/14d/util.js",
            "transferSize": 72403,
            "resourceType": "script",
            "mimeType": "text/javascript",
            "domain": "maps.googleapis.com"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament/fonts/icoajuntament.ttf?8aaig7",
            "transferSize": 54920,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.gstatic.com/mapspro/_/ss/k=mapspro.gmeviewer._T3iEl8Rf-Y.L.W.O/am=AAAI/d=0/rs=ABjfnFUmhIKackrXoBnPPtvjVyCpHm-ZBw",
            "transferSize": 51969,
            "resourceType": "stylesheet",
            "mimeType": "text/css",
            "domain": "www.gstatic.com"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/css/css_evpTRQTawGYS1Ro7RbXq3hBxwat7AU-RJm1V8ZgzeaE.css?delta=5&language=ca&theme=barcelonacat_theme&include=eJyFzsGKwzAMBNAfiuvDfpAZOyJxcSQjydn272sodFnIsieJmXcY3Ac7DmJPOKuJxfcJ6HXJ0EJNGAWe5CTVupLFqUdwkTb7v0zHRuGs9P0b-E4HxSzi5oqeyspXYGuS0YL5s1XerkQtEvDZfiVMxsySgS19_Qe6ypILp8kU8fMlejgpoy0dim0u3i2uOjra7Se5De4jt2o7rYs9zemIGUYvwgyJSg&tcut5n",
            "transferSize": 49093,
            "resourceType": "stylesheet",
            "mimeType": "text/css",
            "domain": "www.barcelona.cat"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "script",
            "count": 4,
            "transferBytes": 582052
          },
          {
            "resourceType": "font",
            "count": 2,
            "transferBytes": 145480
          },
          {
            "resourceType": "document",
            "count": 1,
            "transferBytes": 119272
          },
          {
            "resourceType": "stylesheet",
            "count": 2,
            "transferBytes": 101062
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.gstatic.com",
            "count": 2,
            "transferBytes": 303689
          },
          {
            "domain": "maps.googleapis.com",
            "count": 2,
            "transferBytes": 253907
          },
          {
            "domain": "www.barcelona.cat",
            "count": 3,
            "transferBytes": 194573
          },
          {
            "domain": "www.google.com",
            "count": 1,
            "transferBytes": 119272
          },
          {
            "domain": "cdn.matomo.cloud",
            "count": 1,
            "transferBytes": 76425
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Defer non-critical UI modules until after first render",
            "urgency": "medium",
            "estimatedSavingsBytes": 0,
            "strategy": "Keep only above-the-fold resources in the initial path; hydrate or import secondary modules later.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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": "medium",
            "estimatedSavingsBytes": 251720,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://www.gstatic.com/mapspro/_/js/k=mapspro.gmeviewer.en_US._bcd-18objU.O/am=AAAI/d=0/rs=ABjfnFX7nFuJKtfQMyEDOV9llYzRUuRsKg/m=gmeviewer_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 script asset from maps.googleapis.com",
            "urgency": "medium",
            "estimatedSavingsBytes": 181504,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://maps.googleapis.com/maps/api/js?v=3.63&client=google-maps-pro&language=en_US&region=US&libraries=places,visualization,geometry,search",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 document asset from www.google.com",
            "urgency": "medium",
            "estimatedSavingsBytes": 119272,
            "strategy": "Move this asset behind an explicit interaction, route boundary, or lazy-loading trigger.",
            "url": "https://www.google.com/maps/d/embed?mid=1VaSGODz5xqqjcZGSbOu42wrfhJo0ulA&ehbc=2E312F",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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.08,
          "displayValue": "6.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: 6.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,
          "displayValue": "Est savings of 80 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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 80 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,
          "displayValue": "Est savings of 71 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 71 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 57 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 57 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,
          "displayValue": "Est savings of 3 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 3 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": "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": 0,
          "displayValue": "Est savings of 770 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 Eliminate render-blocking resources\n\n- Lighthouse audit: render-blocking-resources\n- Current value: Est savings of 770 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\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": "server-response-time",
          "title": "Reduce initial server response time",
          "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": 0,
          "displayValue": "Root document took 910 ms",
          "impact": "high",
          "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 Reduce initial server response time\n\n- Lighthouse audit: server-response-time\n- Current value: Root document took 910 ms\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": "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,
          "displayValue": "1,017 elements",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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: 1,017 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"
        },
        {
          "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": 0.61,
          "displayValue": "5.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 Speed Index\n\n- Lighthouse audit: speed-index\n- Current value: 5.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\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": 0.5,
          "displayValue": "Est savings of 31 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 31 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"
        }
      ]
    },
    {
      "url": "https://barcelona.cat/en/what-to-do-in-bcn/magic-fountain/history",
      "status": "ok",
      "finalUrl": "https://www.barcelona.cat/en/what-to-do-in-bcn/magic-fountain/history",
      "performanceScore": 0.39,
      "bestPracticesScore": 1,
      "transferBytes": 2137227,
      "co2Grams": 0.8187319112778,
      "greenWeb": {
        "page": {
          "hostname": "www.barcelona.cat",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-13T22:38:00.231825",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.barcelona.cat",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76425,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "stylesheet",
            "requestCount": 1,
            "transferBytes": 24654,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15565,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7162,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 4108,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/css/bcn-avisos.css",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "fonts.googleapis.com",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 2479,
            "sampleUrl": "https://fonts.googleapis.com/css?family=Source+Sans+3:200,200i,300,300i,400,400i,500,500i,600,600i,700,700i,900,900i",
            "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
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=rI1kNE&url=https%3A%2F%2Fwww.barcelona.cat%2Fen%2Fwhat-to-do-in-bcn%2Fmagic-fountain%2Fhistory",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 10,
          "greenCount": 4,
          "notGreenCount": 7,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 60,
        "urgency": "high",
        "pageElementOccurrences": 1,
        "uniqueElementsAssessed": 1,
        "reusedFromCacheCount": 1,
        "components": [
          {
            "signature": "form|get|/en|input|text|query|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "text",
            "fieldName": "query",
            "formContext": "form|get|/en",
            "hasLabel": true,
            "hasValidationRule": false,
            "hasErrorMessagingHook": false,
            "toolingFriendly": false,
            "assessment": {
              "score": 60,
              "urgency": "high",
              "issues": [
                "No explicit validation rule",
                "No error messaging hook",
                "Missing autocomplete for tooling support"
              ],
              "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.",
                "Provide meaningful autocomplete values to support browsers and assistive tooling."
              ]
            },
            "reusedFromCache": true
          }
        ],
        "recommendations": [
          {
            "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."
          },
          {
            "title": "Missing autocomplete for tooling support",
            "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": "Magic Fountain's History | Barcelona | Barcelona City Council",
          "lang": "en",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "Discover the history of the Magic Fountain in Montjuïc, designed by Carles Buigas for the 1929 Universal Expo and one of Barcelona’s symbols.",
          "robots": "",
          "canonical": "https://www.barcelona.cat/en/what-to-do-in-bcn/magic-fountain/history",
          "ogTitle": "History",
          "ogDescription": "Discover all of the curious facts and details from over eighty years of history relating to the Magic Fountain, a witness to and central part of unique moments such as the 1929 Universal Expo, the 1992 Olympic Games and the music and fireworks shows for La Mercè.",
          "ogType": "Web",
          "ogUrl": "https://www.barcelona.cat/en/what-to-do-in-bcn/magic-fountain/history",
          "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": 34,
        "urgency": "medium",
        "checks": {
          "testedMobile": true,
          "testedTablet": true,
          "horizontalOverflowOnMobile": false,
          "horizontalOverflowOnTablet": false,
          "mobileSmallTapTargets": 43,
          "tabletSmallTapTargets": 33,
          "fixedWidthOffenders": 2,
          "oversizedMedia": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 1,
            "smallTapTargets": 43,
            "oversizedMedia": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 1,
            "smallTapTargets": 33,
            "oversizedMedia": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 43 small targets on mobile and 33 on tablet."
          },
          {
            "title": "Refactor fixed-width components",
            "urgency": "medium",
            "detail": "2 element(s) exceeded viewport width in tested layouts; use responsive component constraints."
          }
        ]
      },
      "securityLight": {
        "score": 59,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": true,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": true,
          "externalScriptCount": 7,
          "externalScriptsWithoutIntegrity": 7,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "cache-control": "max-age=300, public",
            "content-encoding": "gzip",
            "content-language": "en",
            "content-length": "12800",
            "content-type": "text/html; charset=UTF-8",
            "date": "Mon, 13 Apr 2026 22:47:50 GMT",
            "etag": "\"1776120470-gzip\"",
            "expires": "Sun, 19 Nov 1978 05:00:00 GMT",
            "last-modified": "Mon, 13 Apr 2026 22:47:50 GMT",
            "server": "nginx",
            "vary": "Cookie,Accept-Encoding",
            "via": "1.1 ca2190123e61f1744d1210c24c87c840.cloudfront.net (CloudFront)",
            "x-amz-cf-id": "fmSKo7G1H0aXcbaKKDbinr-UwAd69_q2MNXIpp60Y8p96qQZYetbBQ==",
            "x-amz-cf-pop": "IAD12-P5",
            "x-cache": "Miss from cloudfront",
            "x-content-type-options": "nosniff",
            "x-frame-options": "SAMEORIGIN",
            "x-generator": "Drupal 10 (https://www.drupal.org)"
          },
          "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": "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": "7 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 25,
        "urgency": "low",
        "origin": "https://www.barcelona.cat",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://www.barcelona.cat/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/sitemap.xml",
            "found": true,
            "status": 200,
            "contentType": "application/xml; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/manifest.webmanifest",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/favicon.ico",
            "found": true,
            "status": 200,
            "contentType": "image/x-icon"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "low",
            "detail": "Missing beneficial file(s): /.well-known/security.txt, /manifest.webmanifest."
          }
        ]
      },
      "mediaHints": {
        "score": 20,
        "urgency": "low",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 27,
          "imagesWithLazy": 16,
          "imagesWithoutLazy": 11
        },
        "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."
          }
        ]
      },
      "wsgCustom": {
        "score": 85,
        "urgency": "medium",
        "data": {
          "hasPrintStyles": true,
          "hasReducedMotion": true,
          "media": {
            "totalImages": 32,
            "lazyImages": 17,
            "totalIframes": 1,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "\"Source Sans Pro\", \"Helvetica Neue\", Helvetica, Arial, sans-serif",
            "usesSystemFont": true
          },
          "tracking": {
            "count": 0,
            "scripts": []
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 17/32 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": "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"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 94,
        "urgency": "high",
        "totalEstimatedSavingsBytes": 2012008.95,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Use modern image compression formats",
            "urgency": "high",
            "estimatedSavingsBytes": 1138219.95,
            "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": 873789,
            "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: 1.09 MB."
          },
          {
            "title": "Improve image encoding quality/size",
            "urgency": "high",
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 853.31 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": 2387666.95,
        "totalEstimatedBlockingMs": 1038,
        "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": 1138219.95,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 1,112 KiB",
            "urgency": "high",
            "sourceAuditId": "modern-image-formats"
          },
          {
            "id": "uses-optimized-images",
            "title": "Compress oversized image assets",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss.",
            "estimatedSavingsBytes": 873789,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 853 KiB",
            "urgency": "high",
            "sourceAuditId": "uses-optimized-images"
          },
          {
            "id": "render-blocking-resources",
            "title": "Eliminate render-blocking resources",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering.",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1038,
            "displayValue": "Est savings of 1,040 ms",
            "urgency": "high",
            "sourceAuditId": "render-blocking-resources"
          },
          {
            "id": "uses-responsive-images",
            "title": "Right-size images for viewport",
            "detail": "Avoid sending larger images than the rendered size needs.",
            "estimatedSavingsBytes": 150092,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 147 KiB",
            "urgency": "medium",
            "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": 87107,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 85 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": 83553,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 82 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-css-rules"
          },
          {
            "id": "unused-javascript",
            "title": "Remove unused JavaScript",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code.",
            "estimatedSavingsBytes": 54906,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 54 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-javascript"
          }
        ],
        "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.09 MB."
          },
          {
            "title": "Compress oversized image assets",
            "urgency": "high",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 853.31 KB."
          },
          {
            "title": "Eliminate render-blocking resources",
            "urgency": "high",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering. Estimated render unblocking: 1038 ms."
          },
          {
            "title": "Right-size images for viewport",
            "urgency": "medium",
            "detail": "Avoid sending larger images than the rendered size needs. Estimated byte savings: 146.57 KB."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "medium",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 85.07 KB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "medium",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 81.59 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": 10,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 7,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "7 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": 168009.1647346369
        },
        "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: 164.07 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: 164.07 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": "medium",
        "transferBytes": 2137227,
        "css": {
          "unusedBytes": 83553,
          "ratio": 0.03909411588006328,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 54906,
          "duplicatedBytes": 0,
          "ratio": 0.025690298690780156,
          "auditIds": [
            "unused-javascript",
            "duplicated-javascript"
          ]
        },
        "html": {
          "estimatedPenalty": 0.25,
          "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": "high",
            "estimatedSavingsBytes": 83553,
            "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": "medium",
            "estimatedSavingsBytes": 54906,
            "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": 2137227,
        "estimatedDeferrableBytes": 225566,
        "renderBlockingMs": 1038,
        "breakdown": {
          "offscreenImageSavings": 87107,
          "unusedJavascriptSavings": 54906,
          "unusedCssSavings": 83553
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 87107,
            "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": "medium",
            "estimatedSavingsBytes": 54906,
            "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": "high",
            "estimatedSavingsBytes": 83553,
            "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": "Eliminate render-blocking resources",
            "area": "render-path",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1038,
            "strategy": "Defer scripts/styles not required for first paint and preload only truly critical assets.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-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 www.barcelona.cat",
            "area": "image",
            "urgency": "high",
            "estimatedSavingsBytes": 263720,
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_medium/public/_dsc0029.jpg?itok=l_18eVWx",
            "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": 64,
        "urgency": "high",
        "providerCount": 7,
        "requestCount": 8,
        "transferBytes": 139474,
        "notGreenCount": 5,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76425,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15565,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7162,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=rI1kNE&url=https%3A%2F%2Fwww.barcelona.cat%2Fen%2Fwhat-to-do-in-bcn%2Fmagic-fountain%2Fhistory",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "high",
            "detail": "Track 7 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."
          },
          {
            "title": "Prioritize greener alternatives for third-party providers",
            "urgency": "high",
            "detail": "5 third-party script origin(s) are not confirmed green in the Green Web Foundation dataset."
          }
        ]
      },
      "redundancy": {
        "score": 24,
        "urgency": "medium",
        "transferBytes": 2137227,
        "estimatedRedundantBytes": 138459,
        "redundancyRatio": 0.06478441457084344,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 83553,
            "displayValue": "Est savings of 82 KiB"
          },
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 54906,
            "displayValue": "Est savings of 54 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 83553,
            "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 unused javascript",
            "urgency": "medium",
            "estimatedSavingsBytes": 54906,
            "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 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": 41,
        "urgency": "high",
        "totalTransferBytes": 2137227,
        "heavyRequestCount": 12,
        "heavyBytes": 1605776,
        "heavyRatio": 0.7513361940495792,
        "heavyRequests": [
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_medium/public/_dsc0029.jpg?itok=l_18eVWx",
            "transferSize": 263720,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_medium/public/fontmagica_009.jpg?itok=t_gg19h7",
            "transferSize": 220328,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_medium/public/fontmagica1929_autordesconegut.jpg?itok=IynYuWYZ",
            "transferSize": 205476,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_medium/public/fontmagica1929_estevepuig.jpg?itok=Bzi-466i",
            "transferSize": 184781,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_medium/public/avmcristina002.jpg?itok=CAO6-H_c",
            "transferSize": 125879,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_medium/public/cascada3_002.jpg?itok=SPFVHGs1",
            "transferSize": 115261,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_medium/public/avmcristina005.jpg?itok=nknBGQQr",
            "transferSize": 113913,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_medium/public/plbuigas-006.jpg?itok=szJaBoFj",
            "transferSize": 102570,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "transferSize": 90561,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "transferSize": 76425,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "cdn.matomo.cloud"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament/fonts/icoajuntament.ttf?8aaig7",
            "transferSize": 54920,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/css/css_qDD4BCxE8K-iT7MRORwp32v03DlJblP9-xrYwOBWlQo.css?delta=6&language=en&theme=barcelonacat_theme&include=eJyFz8FuxCAMBNAfCsuhH4QG4ia0DkbYpJu_L9JKW1VitSdbM-8y-OrFcFCxgDOrqH8ch5qXiJaIpSDBgpzUWl5J_dDdmQiP_pWp2MidmX7-A9vpIB9FTK2hhrSWGfhESVeU-6zbWCLYqV2cyzYTOYnDc9dMKOf07ZASqebINDXSRxYURcPHO1CbLDGVMFiDf36B7katgJeKhm0s3tWvrVfw7S-59VJ75Kw7rYteanT4CKVfKxCiTQ&tcut5n",
            "transferSize": 51942,
            "resourceType": "stylesheet",
            "mimeType": "text/css",
            "domain": "www.barcelona.cat"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "image",
            "count": 8,
            "transferBytes": 1331928
          },
          {
            "resourceType": "font",
            "count": 2,
            "transferBytes": 145481
          },
          {
            "resourceType": "script",
            "count": 1,
            "transferBytes": 76425
          },
          {
            "resourceType": "stylesheet",
            "count": 1,
            "transferBytes": 51942
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.barcelona.cat",
            "count": 11,
            "transferBytes": 1529351
          },
          {
            "domain": "cdn.matomo.cloud",
            "count": 1,
            "transferBytes": 76425
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Lazy-load offscreen images and media galleries",
            "urgency": "medium",
            "estimatedSavingsBytes": 87107,
            "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": "medium",
            "estimatedSavingsBytes": 54906,
            "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": "Defer non-critical UI modules until after first render",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "strategy": "Keep only above-the-fold resources in the initial path; hydrate or import secondary modules later.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 www.barcelona.cat",
            "urgency": "high",
            "estimatedSavingsBytes": 263720,
            "strategy": "Serve a smaller placeholder first and load this asset only when the user scrolls to or requests the component.",
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_medium/public/_dsc0029.jpg?itok=l_18eVWx",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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": "9.9 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: 9.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,
          "displayValue": "Est savings of 54 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 54 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,
          "displayValue": "Est savings of 82 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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 82 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,
          "displayValue": "Est savings of 1,112 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,112 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 853 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 853 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,
          "displayValue": "Est savings of 85 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 85 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": "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": 0,
          "displayValue": "Est savings of 1,040 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 Eliminate render-blocking resources\n\n- Lighthouse audit: render-blocking-resources\n- Current value: Est savings of 1,040 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\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": "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,
          "displayValue": "1,076 elements",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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: 1,076 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"
        },
        {
          "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": 0.84,
          "displayValue": "3.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 Speed Index\n\n- Lighthouse audit: speed-index\n- Current value: 3.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\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"
        }
      ]
    },
    {
      "url": "https://barcelona.cat/es/conocebcn/ciutadelladelconocimiento/biblioteca-central",
      "status": "ok",
      "finalUrl": "https://www.barcelona.cat/es/conocebcn/ciutadelladelconocimiento/biblioteca-central",
      "performanceScore": 0.54,
      "bestPracticesScore": 1,
      "transferBytes": 1036717,
      "co2Grams": 0.3971469997638,
      "greenWeb": {
        "page": {
          "hostname": "www.barcelona.cat",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-13T22:38:00.231825",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.barcelona.cat",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76424,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "stylesheet",
            "requestCount": 1,
            "transferBytes": 24654,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15565,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7144,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 4110,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/css/bcn-avisos.css",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "fonts.googleapis.com",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 2479,
            "sampleUrl": "https://fonts.googleapis.com/css?family=Source+Sans+3:200,200i,300,300i,400,400i,500,500i,600,600i,700,700i,900,900i",
            "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
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=vhhy1W&url=https%3A%2F%2Fwww.barcelona.cat%2Fes%2Fconocebcn%2Fciutadelladelconocimiento%2Fbiblioteca-central",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 10,
          "greenCount": 4,
          "notGreenCount": 7,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 60,
        "urgency": "high",
        "pageElementOccurrences": 1,
        "uniqueElementsAssessed": 1,
        "reusedFromCacheCount": 1,
        "components": [
          {
            "signature": "form|get|/es/|input|text|query|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "text",
            "fieldName": "query",
            "formContext": "form|get|/es/",
            "hasLabel": true,
            "hasValidationRule": false,
            "hasErrorMessagingHook": false,
            "toolingFriendly": false,
            "assessment": {
              "score": 60,
              "urgency": "high",
              "issues": [
                "No explicit validation rule",
                "No error messaging hook",
                "Missing autocomplete for tooling support"
              ],
              "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.",
                "Provide meaningful autocomplete values to support browsers and assistive tooling."
              ]
            },
            "reusedFromCache": true
          }
        ],
        "recommendations": [
          {
            "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."
          },
          {
            "title": "Missing autocomplete for tooling support",
            "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": "Biblioteca central | La Ciutadella del Conocimiento | Ayuntamiento de Barcelona",
          "lang": "es",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "La futura Biblioteca Pública del Estado en Barcelona se ubicará al lado de la Estación de Francia y tendrá la función de biblioteca central urbana de la ciudad, con dimensión metropolitana.",
          "robots": "",
          "canonical": "https://www.barcelona.cat/es/conocebcn/ciutadelladelconocimiento/biblioteca-central",
          "ogTitle": "Biblioteca central | La Ciutadella del Conocimiento | Ayuntamiento de Barcelona",
          "ogDescription": "La futura Biblioteca Pública del Estado en Barcelona se ubicará al lado de la Estación de Francia y tendrá la función de biblioteca central urbana de la ciudad, con dimensión metropolitana.",
          "ogType": "Web",
          "ogUrl": "https://www.barcelona.cat/es/conocebcn/ciutadelladelconocimiento/biblioteca-central",
          "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": 34,
        "urgency": "medium",
        "checks": {
          "testedMobile": true,
          "testedTablet": true,
          "horizontalOverflowOnMobile": false,
          "horizontalOverflowOnTablet": false,
          "mobileSmallTapTargets": 37,
          "tabletSmallTapTargets": 33,
          "fixedWidthOffenders": 2,
          "oversizedMedia": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 1,
            "smallTapTargets": 37,
            "oversizedMedia": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 1,
            "smallTapTargets": 33,
            "oversizedMedia": 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 33 on tablet."
          },
          {
            "title": "Refactor fixed-width components",
            "urgency": "medium",
            "detail": "2 element(s) exceeded viewport width in tested layouts; use responsive component constraints."
          }
        ]
      },
      "securityLight": {
        "score": 59,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": true,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": true,
          "externalScriptCount": 7,
          "externalScriptsWithoutIntegrity": 7,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "cache-control": "max-age=300, public",
            "content-encoding": "gzip",
            "content-language": "es",
            "content-length": "11368",
            "content-type": "text/html; charset=UTF-8",
            "date": "Mon, 13 Apr 2026 22:48:04 GMT",
            "etag": "\"1776120484-gzip\"",
            "expires": "Sun, 19 Nov 1978 05:00:00 GMT",
            "last-modified": "Mon, 13 Apr 2026 22:48:04 GMT",
            "server": "nginx",
            "vary": "Cookie,Accept-Encoding",
            "via": "1.1 ca2190123e61f1744d1210c24c87c840.cloudfront.net (CloudFront)",
            "x-amz-cf-id": "ZfIWNP-dJ4zecCxe95zIGdm9o58q2xVNC4rfzb22PoUAa9PoFI4s1A==",
            "x-amz-cf-pop": "IAD12-P5",
            "x-cache": "Miss from cloudfront",
            "x-content-type-options": "nosniff",
            "x-frame-options": "SAMEORIGIN",
            "x-generator": "Drupal 10 (https://www.drupal.org)"
          },
          "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": "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": "7 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 25,
        "urgency": "low",
        "origin": "https://www.barcelona.cat",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://www.barcelona.cat/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/sitemap.xml",
            "found": true,
            "status": 200,
            "contentType": "application/xml; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/manifest.webmanifest",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/favicon.ico",
            "found": true,
            "status": 200,
            "contentType": "image/x-icon"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "low",
            "detail": "Missing beneficial file(s): /.well-known/security.txt, /manifest.webmanifest."
          }
        ]
      },
      "mediaHints": {
        "score": 20,
        "urgency": "low",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 25,
          "imagesWithLazy": 14,
          "imagesWithoutLazy": 11
        },
        "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."
          }
        ]
      },
      "wsgCustom": {
        "score": 85,
        "urgency": "medium",
        "data": {
          "hasPrintStyles": true,
          "hasReducedMotion": true,
          "media": {
            "totalImages": 30,
            "lazyImages": 15,
            "totalIframes": 1,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "\"Source Sans Pro\", \"Helvetica Neue\", Helvetica, Arial, sans-serif",
            "usesSystemFont": true
          },
          "tracking": {
            "count": 0,
            "scripts": []
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 15/30 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": "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"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 38,
        "urgency": "medium",
        "totalEstimatedSavingsBytes": 393314.05,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Use modern image compression formats",
            "urgency": "high",
            "estimatedSavingsBytes": 217369.05,
            "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": 175945,
            "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: 212.27 KB."
          },
          {
            "title": "Improve image encoding quality/size",
            "urgency": "high",
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 171.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": 638800.05,
        "totalEstimatedBlockingMs": 1637,
        "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": 217369.05,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 212 KiB",
            "urgency": "high",
            "sourceAuditId": "modern-image-formats"
          },
          {
            "id": "render-blocking-resources",
            "title": "Eliminate render-blocking resources",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering.",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1637,
            "displayValue": "Est savings of 1,640 ms",
            "urgency": "high",
            "sourceAuditId": "render-blocking-resources"
          },
          {
            "id": "uses-optimized-images",
            "title": "Compress oversized image assets",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss.",
            "estimatedSavingsBytes": 175945,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 172 KiB",
            "urgency": "medium",
            "sourceAuditId": "uses-optimized-images"
          },
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 87109,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 85 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": 83565,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 82 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-css-rules"
          },
          {
            "id": "unused-javascript",
            "title": "Remove unused JavaScript",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code.",
            "estimatedSavingsBytes": 55527,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 54 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-javascript"
          },
          {
            "id": "uses-responsive-images",
            "title": "Right-size images for viewport",
            "detail": "Avoid sending larger images than the rendered size needs.",
            "estimatedSavingsBytes": 19285,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 19 KiB",
            "urgency": "low",
            "sourceAuditId": "uses-responsive-images"
          }
        ],
        "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: 212.27 KB."
          },
          {
            "title": "Eliminate render-blocking resources",
            "urgency": "high",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering. Estimated render unblocking: 1637 ms."
          },
          {
            "title": "Compress oversized image assets",
            "urgency": "medium",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 171.82 KB."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "medium",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 85.07 KB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "medium",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 81.61 KB."
          },
          {
            "title": "Remove unused JavaScript",
            "urgency": "medium",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 54.23 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": 10,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 7,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "7 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": 167992.4900139665
        },
        "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: 164.06 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: 164.06 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": "medium",
        "transferBytes": 1036717,
        "css": {
          "unusedBytes": 83565,
          "ratio": 0.08060541111991025,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 55527,
          "duplicatedBytes": 0,
          "ratio": 0.05356042198594216,
          "auditIds": [
            "unused-javascript",
            "duplicated-javascript"
          ]
        },
        "html": {
          "estimatedPenalty": 0.25,
          "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": "high",
            "estimatedSavingsBytes": 83565,
            "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": "medium",
            "estimatedSavingsBytes": 55527,
            "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": 1036717,
        "estimatedDeferrableBytes": 226201,
        "renderBlockingMs": 1637,
        "breakdown": {
          "offscreenImageSavings": 87109,
          "unusedJavascriptSavings": 55527,
          "unusedCssSavings": 83565
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 87109,
            "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": "medium",
            "estimatedSavingsBytes": 55527,
            "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": "high",
            "estimatedSavingsBytes": 83565,
            "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": "Eliminate render-blocking resources",
            "area": "render-path",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1637,
            "strategy": "Defer scripts/styles not required for first paint and preload only truly critical assets.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-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 www.barcelona.cat",
            "area": "font",
            "urgency": "medium",
            "estimatedSavingsBytes": 90559,
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "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 www.barcelona.cat",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 86592,
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_medium/public/maqueta_biblioteca-710x379.jpg?itok=Wy5uEtH2",
            "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": 64,
        "urgency": "high",
        "providerCount": 7,
        "requestCount": 8,
        "transferBytes": 139455,
        "notGreenCount": 5,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76424,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15565,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7144,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=vhhy1W&url=https%3A%2F%2Fwww.barcelona.cat%2Fes%2Fconocebcn%2Fciutadelladelconocimiento%2Fbiblioteca-central",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "high",
            "detail": "Track 7 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."
          },
          {
            "title": "Prioritize greener alternatives for third-party providers",
            "urgency": "high",
            "detail": "5 third-party script origin(s) are not confirmed green in the Green Web Foundation dataset."
          }
        ]
      },
      "redundancy": {
        "score": 27,
        "urgency": "medium",
        "transferBytes": 1036717,
        "estimatedRedundantBytes": 139092,
        "redundancyRatio": 0.13416583310585242,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 83565,
            "displayValue": "Est savings of 82 KiB"
          },
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 55527,
            "displayValue": "Est savings of 54 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 83565,
            "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 unused javascript",
            "urgency": "medium",
            "estimatedSavingsBytes": 55527,
            "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 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": 17,
        "urgency": "medium",
        "totalTransferBytes": 1036717,
        "heavyRequestCount": 4,
        "heavyBytes": 273846,
        "heavyRatio": 0.2641473034588996,
        "heavyRequests": [
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "transferSize": 90559,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "transferSize": 76424,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "cdn.matomo.cloud"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament/fonts/icoajuntament.ttf?8aaig7",
            "transferSize": 54920,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/css/css_qDD4BCxE8K-iT7MRORwp32v03DlJblP9-xrYwOBWlQo.css?delta=6&language=es&theme=barcelonacat_theme&include=eJyFz8FuxCAMBNAfCsuhH4QG4ia0DkbYpJu_L9JKW1VitSdbM-8y-OrFcFCxgDOrqH8ch5qXiJaIpSDBgpzUWl5J_dDdmQiP_pWp2MidmX7-A9vpIB9FTK2hhrSWGfhESVeU-6zbWCLYqV2cyzYTOYnDc9dMKOf07ZASqebINDXSRxYURcPHO1CbLDGVMFiDf36B7katgJeKhm0s3tWvrVfw7S-59VJ75Kw7rYteanT4CKVfKxCiTQ&tcut5n",
            "transferSize": 51943,
            "resourceType": "stylesheet",
            "mimeType": "text/css",
            "domain": "www.barcelona.cat"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "font",
            "count": 2,
            "transferBytes": 145479
          },
          {
            "resourceType": "script",
            "count": 1,
            "transferBytes": 76424
          },
          {
            "resourceType": "stylesheet",
            "count": 1,
            "transferBytes": 51943
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.barcelona.cat",
            "count": 3,
            "transferBytes": 197422
          },
          {
            "domain": "cdn.matomo.cloud",
            "count": 1,
            "transferBytes": 76424
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Lazy-load offscreen images and media galleries",
            "urgency": "medium",
            "estimatedSavingsBytes": 87109,
            "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": "medium",
            "estimatedSavingsBytes": 55527,
            "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": "Defer non-critical UI modules until after first render",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "strategy": "Keep only above-the-fold resources in the initial path; hydrate or import secondary modules later.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 www.barcelona.cat",
            "urgency": "medium",
            "estimatedSavingsBytes": 90559,
            "strategy": "Subset or defer this font so full font payloads are only fetched when needed.",
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 cdn.matomo.cloud",
            "urgency": "medium",
            "estimatedSavingsBytes": 76424,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.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.02,
          "displayValue": "8.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: 8.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 54 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 54 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,
          "displayValue": "Est savings of 82 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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 82 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,
          "displayValue": "Est savings of 212 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 212 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 172 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 172 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,
          "displayValue": "Est savings of 85 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 85 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": "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": 0,
          "displayValue": "Est savings of 1,640 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 Eliminate render-blocking resources\n\n- Lighthouse audit: render-blocking-resources\n- Current value: Est savings of 1,640 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\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": "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,
          "displayValue": "1,006 elements",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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: 1,006 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"
        },
        {
          "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": 0.84,
          "displayValue": "3.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 Speed Index\n\n- Lighthouse audit: speed-index\n- Current value: 3.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\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"
        }
      ]
    },
    {
      "url": "https://barcelona.cat/en/what-to-do-in-bcn/festes-majors",
      "status": "ok",
      "finalUrl": "https://www.barcelona.cat/en/what-to-do-in-bcn/festes-majors",
      "performanceScore": 0.67,
      "bestPracticesScore": 1,
      "transferBytes": 1071353,
      "co2Grams": 0.4104154071342,
      "greenWeb": {
        "page": {
          "hostname": "www.barcelona.cat",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-13T22:38:00.231825",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.barcelona.cat",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76426,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31745,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "stylesheet",
            "requestCount": 1,
            "transferBytes": 24654,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "cdnjs.cloudflare.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15864,
            "sampleUrl": "https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js",
            "greenCheck": {
              "hostname": "cdnjs.cloudflare.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:34",
              "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/cdnjs.cloudflare.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15565,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7144,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 4110,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/css/bcn-avisos.css",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "fonts.googleapis.com",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 2481,
            "sampleUrl": "https://fonts.googleapis.com/css?family=Source+Sans+3:200,200i,300,300i,400,400i,500,500i,600,600i,700,700i,900,900i",
            "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
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=9bBbdc&url=https%3A%2F%2Fwww.barcelona.cat%2Fen%2Fwhat-to-do-in-bcn%2Ffestes-majors",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 11,
          "greenCount": 5,
          "notGreenCount": 7,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 75,
        "urgency": "high",
        "pageElementOccurrences": 8,
        "uniqueElementsAssessed": 2,
        "reusedFromCacheCount": 2,
        "components": [
          {
            "signature": "form|get|/en|input|text|query|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "text",
            "fieldName": "query",
            "formContext": "form|get|/en",
            "hasLabel": true,
            "hasValidationRule": false,
            "hasErrorMessagingHook": false,
            "toolingFriendly": false,
            "assessment": {
              "score": 60,
              "urgency": "high",
              "issues": [
                "No explicit validation rule",
                "No error messaging hook",
                "Missing autocomplete for tooling support"
              ],
              "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.",
                "Provide meaningful autocomplete values to support browsers and assistive tooling."
              ]
            },
            "reusedFromCache": true
          },
          {
            "signature": "no-form|select|select|anonymous|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "select",
            "fieldName": null,
            "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": "No explicit validation rule",
            "urgency": "medium",
            "detail": "2 unique form control signature(s) on this page include this issue."
          },
          {
            "title": "No error messaging hook",
            "urgency": "medium",
            "detail": "2 unique form control signature(s) on this page include this issue."
          },
          {
            "title": "Missing autocomplete for tooling support",
            "urgency": "medium",
            "detail": "1 unique form control signature(s) on this page include this issue."
          },
          {
            "title": "Missing associated label",
            "urgency": "high",
            "detail": "1 unique form control signature(s) on this page include this issue."
          }
        ]
      },
      "metadata": {
        "score": 25,
        "urgency": "low",
        "checks": {
          "hasTitle": true,
          "hasLang": true,
          "hasDescription": false,
          "hasCanonical": true,
          "hasOpenGraphCore": false,
          "hasTwitterCard": true,
          "hasViewport": true,
          "hasCharset": true,
          "hasValidStructuredData": true,
          "hasInvalidStructuredData": false
        },
        "observed": {
          "title": "Festes majors | Barcelona.cat | Ajuntament de Barcelona",
          "lang": "en",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "",
          "robots": "",
          "canonical": "https://www.barcelona.cat/en/what-to-do-in-bcn/festes-majors",
          "ogTitle": "Festes majors",
          "ogDescription": "",
          "ogType": "Web",
          "ogUrl": "https://www.barcelona.cat/en/what-to-do-in-bcn/festes-majors",
          "twitterCard": "summary_large_image",
          "ldJsonCount": 0,
          "validLdJsonCount": 0,
          "invalidLdJsonCount": 0
        },
        "recommendations": [
          {
            "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."
          }
        ]
      },
      "layoutAdaptation": {
        "score": 30,
        "urgency": "medium",
        "checks": {
          "testedMobile": true,
          "testedTablet": true,
          "horizontalOverflowOnMobile": false,
          "horizontalOverflowOnTablet": false,
          "mobileSmallTapTargets": 59,
          "tabletSmallTapTargets": 60,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 59,
            "oversizedMedia": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 60,
            "oversizedMedia": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 59 small targets on mobile and 60 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 59,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": true,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": true,
          "externalScriptCount": 8,
          "externalScriptsWithoutIntegrity": 8,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "cache-control": "max-age=300, public",
            "content-encoding": "gzip",
            "content-language": "en",
            "content-length": "12535",
            "content-type": "text/html; charset=UTF-8",
            "date": "Mon, 13 Apr 2026 22:48:19 GMT",
            "etag": "\"1776120498-gzip\"",
            "expires": "Sun, 19 Nov 1978 05:00:00 GMT",
            "last-modified": "Mon, 13 Apr 2026 22:48:18 GMT",
            "server": "nginx",
            "vary": "Cookie,Accept-Encoding",
            "via": "1.1 ca2190123e61f1744d1210c24c87c840.cloudfront.net (CloudFront)",
            "x-amz-cf-id": "r6IN9sKHK2HKx2xRXiD4mBZ8xS17EE1bEtFaHignpYcv4gfNF-SJ6A==",
            "x-amz-cf-pop": "IAD12-P5",
            "x-cache": "Miss from cloudfront",
            "x-content-type-options": "nosniff",
            "x-frame-options": "SAMEORIGIN",
            "x-generator": "Drupal 10 (https://www.drupal.org)"
          },
          "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": "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": "8 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 25,
        "urgency": "low",
        "origin": "https://www.barcelona.cat",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://www.barcelona.cat/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/sitemap.xml",
            "found": true,
            "status": 200,
            "contentType": "application/xml; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/manifest.webmanifest",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/favicon.ico",
            "found": true,
            "status": 200,
            "contentType": "image/x-icon"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "low",
            "detail": "Missing beneficial file(s): /.well-known/security.txt, /manifest.webmanifest."
          }
        ]
      },
      "mediaHints": {
        "score": 50,
        "urgency": "medium",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 21,
          "imagesWithLazy": 0,
          "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 21 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 85,
        "urgency": "medium",
        "data": {
          "hasPrintStyles": true,
          "hasReducedMotion": true,
          "media": {
            "totalImages": 26,
            "lazyImages": 1,
            "totalIframes": 1,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "\"Source Sans Pro\", \"Helvetica Neue\", Helvetica, Arial, sans-serif",
            "usesSystemFont": true
          },
          "tracking": {
            "count": 0,
            "scripts": []
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 1/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": "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"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 28,
        "urgency": "low",
        "totalEstimatedSavingsBytes": 300025.30000000005,
        "checks": {
          "hasEffectiveTextCompression": false
        },
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Use modern image compression formats",
            "urgency": "medium",
            "estimatedSavingsBytes": 185134.30000000002,
            "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size."
          },
          {
            "id": "uses-optimized-images",
            "title": "Improve image encoding quality/size",
            "urgency": "medium",
            "estimatedSavingsBytes": 81127,
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings."
          },
          {
            "id": "uses-text-compression",
            "title": "Enable Brotli/gzip for text assets",
            "urgency": "medium",
            "estimatedSavingsBytes": 33764,
            "detail": "Compress HTML, CSS, JS, JSON, SVG, and XML responses with Brotli or gzip."
          }
        ],
        "recommendations": [
          {
            "title": "Use modern image compression formats",
            "urgency": "medium",
            "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size. Estimated savings: 180.80 KB."
          },
          {
            "title": "Improve image encoding quality/size",
            "urgency": "medium",
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 79.23 KB."
          },
          {
            "title": "Enable Brotli/gzip for text assets",
            "urgency": "medium",
            "detail": "Compress HTML, CSS, JS, JSON, SVG, and XML responses with Brotli or gzip. Estimated savings: 32.97 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": 609213.3,
        "totalEstimatedBlockingMs": 1595,
        "opportunities": [
          {
            "id": "render-blocking-resources",
            "title": "Eliminate render-blocking resources",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering.",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1595,
            "displayValue": "Est savings of 1,600 ms",
            "urgency": "high",
            "sourceAuditId": "render-blocking-resources"
          },
          {
            "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": 185134.30000000002,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 181 KiB",
            "urgency": "medium",
            "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": 184788,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 180 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": 91919,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 90 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-css-rules"
          },
          {
            "id": "uses-optimized-images",
            "title": "Compress oversized image assets",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss.",
            "estimatedSavingsBytes": 81127,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 79 KiB",
            "urgency": "medium",
            "sourceAuditId": "uses-optimized-images"
          },
          {
            "id": "uses-text-compression",
            "title": "Enable text compression",
            "detail": "Serve text assets with Brotli or gzip to remove avoidable transfer bloat.",
            "estimatedSavingsBytes": 33764,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 33 KiB",
            "urgency": "medium",
            "sourceAuditId": "uses-text-compression"
          },
          {
            "id": "unused-javascript",
            "title": "Remove unused JavaScript",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code.",
            "estimatedSavingsBytes": 32481,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 32 KiB",
            "urgency": "low",
            "sourceAuditId": "unused-javascript"
          }
        ],
        "recommendations": [
          {
            "title": "Eliminate render-blocking resources",
            "urgency": "high",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering. Estimated render unblocking: 1595 ms."
          },
          {
            "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: 180.80 KB."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "medium",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 180.46 KB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "medium",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 89.76 KB."
          },
          {
            "title": "Compress oversized image assets",
            "urgency": "medium",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 79.23 KB."
          },
          {
            "title": "Enable text compression",
            "urgency": "medium",
            "detail": "Serve text assets with Brotli or gzip to remove avoidable transfer bloat. Estimated byte savings: 32.97 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": 10,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 8,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "8 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": 364516.06028864055
        },
        "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: 355.97 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: 355.97 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": "medium",
        "transferBytes": 1071353,
        "css": {
          "unusedBytes": 91919,
          "ratio": 0.08579711822340536,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 32481,
          "duplicatedBytes": 0,
          "ratio": 0.030317738411149268,
          "auditIds": [
            "unused-javascript",
            "duplicated-javascript"
          ]
        },
        "html": {
          "estimatedPenalty": 0.25,
          "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": "high",
            "estimatedSavingsBytes": 91919,
            "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": "medium",
            "estimatedSavingsBytes": 32481,
            "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": 24,
        "urgency": "high",
        "transferBytes": 1071353,
        "estimatedDeferrableBytes": 309188,
        "renderBlockingMs": 1595,
        "breakdown": {
          "offscreenImageSavings": 184788,
          "unusedJavascriptSavings": 32481,
          "unusedCssSavings": 91919
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 184788,
            "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": "medium",
            "estimatedSavingsBytes": 32481,
            "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": "high",
            "estimatedSavingsBytes": 91919,
            "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": "Eliminate render-blocking resources",
            "area": "render-path",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1595,
            "strategy": "Defer scripts/styles not required for first paint and preload only truly critical assets.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-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 estatics-nasia.dtibcn.cat",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 105362,
            "url": "https://estatics-nasia.dtibcn.cat/nasia-pro/media/primavera_barceloneta.570x321.962515dd.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 font from www.barcelona.cat",
            "area": "font",
            "urgency": "medium",
            "estimatedSavingsBytes": 90561,
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "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 www.barcelona.cat",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 84136,
            "url": "https://www.barcelona.cat/themes/barcelonacat_theme/images/menu/viula.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 cdn.matomo.cloud",
            "area": "script",
            "urgency": "medium",
            "estimatedSavingsBytes": 76426,
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.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": 65,
        "urgency": "high",
        "providerCount": 8,
        "requestCount": 9,
        "transferBytes": 155320,
        "notGreenCount": 5,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76426,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31745,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "cdnjs.cloudflare.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15864,
            "sampleUrl": "https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js",
            "greenCheck": {
              "hostname": "cdnjs.cloudflare.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:34",
              "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/cdnjs.cloudflare.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15565,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7144,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=9bBbdc&url=https%3A%2F%2Fwww.barcelona.cat%2Fen%2Fwhat-to-do-in-bcn%2Ffestes-majors",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "high",
            "detail": "Track 8 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."
          },
          {
            "title": "Prioritize greener alternatives for third-party providers",
            "urgency": "high",
            "detail": "5 third-party script origin(s) are not confirmed green in the Green Web Foundation dataset."
          }
        ]
      },
      "redundancy": {
        "score": 34,
        "urgency": "medium",
        "transferBytes": 1071353,
        "estimatedRedundantBytes": 124400,
        "redundancyRatio": 0.11611485663455462,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 91919,
            "displayValue": "Est savings of 90 KiB"
          },
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 32481,
            "displayValue": "Est savings of 32 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 91919,
            "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 unused javascript",
            "urgency": "medium",
            "estimatedSavingsBytes": 32481,
            "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": "Enable and verify text compression",
            "urgency": "medium",
            "estimatedSavingsBytes": 33764,
            "auditId": "uses-text-compression",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "2",
              "title": "Remove unnecessary or redundant information",
              "url": "https://www.w3.org/TR/web-sustainability-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": 23,
        "urgency": "medium",
        "totalTransferBytes": 1071353,
        "heavyRequestCount": 5,
        "heavyBytes": 376372,
        "heavyRatio": 0.3513053120680112,
        "heavyRequests": [
          {
            "url": "https://estatics-nasia.dtibcn.cat/nasia-pro/media/primavera_barceloneta.570x321.962515dd.jpg",
            "transferSize": 105362,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "estatics-nasia.dtibcn.cat"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "transferSize": 90561,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "transferSize": 76426,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "cdn.matomo.cloud"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament/fonts/icoajuntament.ttf?8aaig7",
            "transferSize": 54919,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/css/css_evpTRQTawGYS1Ro7RbXq3hBxwat7AU-RJm1V8ZgzeaE.css?delta=5&language=en&theme=barcelonacat_theme&include=eJyFztEOwiAMheEXgnDhA5EDq4gySmiZ7u1dYuJinPGqTf_voriOqpipqseShcW9hkXLBntMI8NNUGo53qh_JzpjFBUT0CMVrohQzwv1nicSt8lhlbls_ZdpSGSXTPdPoBeayQVmFe1oPk71CKTCAcWKriXXdCRyZLv_fSSEx3bzgir-9A-0zibE6jfW4d6bp4dSryhGVlGaXYDQE_H9jbg&tcut5n",
            "transferSize": 49104,
            "resourceType": "stylesheet",
            "mimeType": "text/css",
            "domain": "www.barcelona.cat"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "font",
            "count": 2,
            "transferBytes": 145480
          },
          {
            "resourceType": "image",
            "count": 1,
            "transferBytes": 105362
          },
          {
            "resourceType": "script",
            "count": 1,
            "transferBytes": 76426
          },
          {
            "resourceType": "stylesheet",
            "count": 1,
            "transferBytes": 49104
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.barcelona.cat",
            "count": 3,
            "transferBytes": 194584
          },
          {
            "domain": "estatics-nasia.dtibcn.cat",
            "count": 1,
            "transferBytes": 105362
          },
          {
            "domain": "cdn.matomo.cloud",
            "count": 1,
            "transferBytes": 76426
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Lazy-load offscreen images and media galleries",
            "urgency": "high",
            "estimatedSavingsBytes": 184788,
            "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": "Defer non-critical UI modules until after first render",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "strategy": "Keep only above-the-fold resources in the initial path; hydrate or import secondary modules later.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 estatics-nasia.dtibcn.cat",
            "urgency": "medium",
            "estimatedSavingsBytes": 105362,
            "strategy": "Serve a smaller placeholder first and load this asset only when the user scrolls to or requests the component.",
            "url": "https://estatics-nasia.dtibcn.cat/nasia-pro/media/primavera_barceloneta.570x321.962515dd.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 font asset from www.barcelona.cat",
            "urgency": "medium",
            "estimatedSavingsBytes": 90561,
            "strategy": "Subset or defer this font so full font payloads are only fetched when needed.",
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 cdn.matomo.cloud",
            "urgency": "medium",
            "estimatedSavingsBytes": 76426,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.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.07,
          "displayValue": "6.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: 6.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-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,
          "displayValue": "Est savings of 90 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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 90 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,
          "displayValue": "Est savings of 181 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 181 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 79 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 79 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,
          "displayValue": "Est savings of 180 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 180 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": "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": 0,
          "displayValue": "Est savings of 1,600 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 Eliminate render-blocking resources\n\n- Lighthouse audit: render-blocking-resources\n- Current value: Est savings of 1,600 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\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": "server-response-time",
          "title": "Reduce initial server response time",
          "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": 0,
          "displayValue": "Root document took 980 ms",
          "impact": "high",
          "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 Reduce initial server response time\n\n- Lighthouse audit: server-response-time\n- Current value: Root document took 980 ms\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": "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,
          "displayValue": "1,094 elements",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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: 1,094 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"
        },
        {
          "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": 0.76,
          "displayValue": "4.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 Speed Index\n\n- Lighthouse audit: speed-index\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\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": 0.5,
          "displayValue": "Est savings of 32 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 32 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": "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": 0.5,
          "displayValue": "Est savings of 33 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 Enable text compression\n\n- Lighthouse audit: uses-text-compression\n- Current value: Est savings of 33 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\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"
        }
      ]
    },
    {
      "url": "https://barcelona.cat/ca/viure-a-bcn/amb-nens-i-nenes/lleure/llistat-de-ludotecas",
      "status": "ok",
      "finalUrl": "https://www.barcelona.cat/ca/viure-a-bcn/amb-nens-i-nenes/lleure/llistat-de-ludotecas",
      "performanceScore": 0.64,
      "bestPracticesScore": 1,
      "transferBytes": 1244584,
      "co2Grams": 0.4767769811376,
      "greenWeb": {
        "page": {
          "hostname": "www.barcelona.cat",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-13T22:38:00.231825",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.barcelona.cat",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76425,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "stylesheet",
            "requestCount": 1,
            "transferBytes": 24654,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "cdnjs.cloudflare.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15870,
            "sampleUrl": "https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js",
            "greenCheck": {
              "hostname": "cdnjs.cloudflare.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:34",
              "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/cdnjs.cloudflare.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15565,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7144,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5656,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 4111,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/css/bcn-avisos.css",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "fonts.googleapis.com",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 2481,
            "sampleUrl": "https://fonts.googleapis.com/css?family=Source+Sans+3:200,200i,300,300i,400,400i,500,500i,600,600i,700,700i,900,900i",
            "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
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=7IXD8i&url=https%3A%2F%2Fwww.barcelona.cat%2Fca%2Fviure-a-bcn%2Famb-nens-i-nenes%2Flleure%2Fllistat-de-ludotecas",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 11,
          "greenCount": 5,
          "notGreenCount": 7,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 75,
        "urgency": "high",
        "pageElementOccurrences": 4,
        "uniqueElementsAssessed": 2,
        "reusedFromCacheCount": 2,
        "components": [
          {
            "signature": "form|get|/ca|input|text|query|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "text",
            "fieldName": "query",
            "formContext": "form|get|/ca",
            "hasLabel": true,
            "hasValidationRule": false,
            "hasErrorMessagingHook": false,
            "toolingFriendly": false,
            "assessment": {
              "score": 60,
              "urgency": "high",
              "issues": [
                "No explicit validation rule",
                "No error messaging hook",
                "Missing autocomplete for tooling support"
              ],
              "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.",
                "Provide meaningful autocomplete values to support browsers and assistive tooling."
              ]
            },
            "reusedFromCache": true
          },
          {
            "signature": "no-form|select|select|anonymous|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "select",
            "fieldName": null,
            "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": "No explicit validation rule",
            "urgency": "medium",
            "detail": "2 unique form control signature(s) on this page include this issue."
          },
          {
            "title": "No error messaging hook",
            "urgency": "medium",
            "detail": "2 unique form control signature(s) on this page include this issue."
          },
          {
            "title": "Missing autocomplete for tooling support",
            "urgency": "medium",
            "detail": "1 unique form control signature(s) on this page include this issue."
          },
          {
            "title": "Missing associated label",
            "urgency": "high",
            "detail": "1 unique form control signature(s) on this page include this issue."
          }
        ]
      },
      "metadata": {
        "score": 25,
        "urgency": "low",
        "checks": {
          "hasTitle": true,
          "hasLang": true,
          "hasDescription": false,
          "hasCanonical": true,
          "hasOpenGraphCore": false,
          "hasTwitterCard": true,
          "hasViewport": true,
          "hasCharset": true,
          "hasValidStructuredData": true,
          "hasInvalidStructuredData": false
        },
        "observed": {
          "title": "Llistat de Ludotecas | Barcelona.cat | Ajuntament de Barcelona",
          "lang": "ca",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "",
          "robots": "",
          "canonical": "https://www.barcelona.cat/ca/viure-a-bcn/amb-nens-i-nenes/lleure/llistat-de-ludotecas",
          "ogTitle": "Llistat de Ludotecas",
          "ogDescription": "",
          "ogType": "Web",
          "ogUrl": "https://www.barcelona.cat/ca/viure-a-bcn/amb-nens-i-nenes/lleure/llistat-de-ludotecas",
          "twitterCard": "summary_large_image",
          "ldJsonCount": 0,
          "validLdJsonCount": 0,
          "invalidLdJsonCount": 0
        },
        "recommendations": [
          {
            "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."
          }
        ]
      },
      "layoutAdaptation": {
        "score": 44,
        "urgency": "medium",
        "checks": {
          "testedMobile": true,
          "testedTablet": true,
          "horizontalOverflowOnMobile": false,
          "horizontalOverflowOnTablet": false,
          "mobileSmallTapTargets": 64,
          "tabletSmallTapTargets": 63,
          "fixedWidthOffenders": 7,
          "oversizedMedia": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 7,
            "smallTapTargets": 64,
            "oversizedMedia": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 63,
            "oversizedMedia": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 64 small targets on mobile and 63 on tablet."
          },
          {
            "title": "Refactor fixed-width components",
            "urgency": "medium",
            "detail": "7 element(s) exceeded viewport width in tested layouts; use responsive component constraints."
          }
        ]
      },
      "securityLight": {
        "score": 59,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": true,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": true,
          "externalScriptCount": 8,
          "externalScriptsWithoutIntegrity": 8,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "cache-control": "max-age=300, public",
            "content-encoding": "gzip",
            "content-language": "ca",
            "content-length": "11862",
            "content-type": "text/html; charset=UTF-8",
            "date": "Mon, 13 Apr 2026 22:48:34 GMT",
            "etag": "\"1776120513-gzip\"",
            "expires": "Sun, 19 Nov 1978 05:00:00 GMT",
            "last-modified": "Mon, 13 Apr 2026 22:48:33 GMT",
            "server": "nginx",
            "vary": "Cookie,Accept-Encoding",
            "via": "1.1 ca2190123e61f1744d1210c24c87c840.cloudfront.net (CloudFront)",
            "x-amz-cf-id": "m6UNq-U7RL2_5RlFe6SwlcJPUZ2xvgFG5NbJ-exAhP8ZurOgppY7fQ==",
            "x-amz-cf-pop": "IAD12-P5",
            "x-cache": "Miss from cloudfront",
            "x-content-type-options": "nosniff",
            "x-frame-options": "SAMEORIGIN",
            "x-generator": "Drupal 10 (https://www.drupal.org)"
          },
          "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": "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": "8 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 25,
        "urgency": "low",
        "origin": "https://www.barcelona.cat",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://www.barcelona.cat/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/sitemap.xml",
            "found": true,
            "status": 200,
            "contentType": "application/xml; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/manifest.webmanifest",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/favicon.ico",
            "found": true,
            "status": 200,
            "contentType": "image/x-icon"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "low",
            "detail": "Missing beneficial file(s): /.well-known/security.txt, /manifest.webmanifest."
          }
        ]
      },
      "mediaHints": {
        "score": 50,
        "urgency": "medium",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 21,
          "imagesWithLazy": 0,
          "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 21 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 85,
        "urgency": "medium",
        "data": {
          "hasPrintStyles": true,
          "hasReducedMotion": true,
          "media": {
            "totalImages": 26,
            "lazyImages": 1,
            "totalIframes": 1,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "\"Source Sans Pro\", \"Helvetica Neue\", Helvetica, Arial, sans-serif",
            "usesSystemFont": true
          },
          "tracking": {
            "count": 0,
            "scripts": []
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 1/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": "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"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 51,
        "urgency": "medium",
        "totalEstimatedSavingsBytes": 633364.8,
        "checks": {
          "hasEffectiveTextCompression": false
        },
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Use modern image compression formats",
            "urgency": "high",
            "estimatedSavingsBytes": 357182.8,
            "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": 253758,
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings."
          },
          {
            "id": "uses-text-compression",
            "title": "Enable Brotli/gzip for text assets",
            "urgency": "low",
            "estimatedSavingsBytes": 22424,
            "detail": "Compress HTML, CSS, JS, JSON, SVG, and XML responses with Brotli or gzip."
          }
        ],
        "recommendations": [
          {
            "title": "Use modern image compression formats",
            "urgency": "high",
            "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size. Estimated savings: 348.81 KB."
          },
          {
            "title": "Improve image encoding quality/size",
            "urgency": "high",
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 247.81 KB."
          },
          {
            "title": "Enable Brotli/gzip for text assets",
            "urgency": "low",
            "detail": "Compress HTML, CSS, JS, JSON, SVG, and XML responses with Brotli or gzip. Estimated savings: 21.90 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": 927853.8,
        "totalEstimatedBlockingMs": 1788,
        "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": 357182.8,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 349 KiB",
            "urgency": "high",
            "sourceAuditId": "modern-image-formats"
          },
          {
            "id": "uses-optimized-images",
            "title": "Compress oversized image assets",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss.",
            "estimatedSavingsBytes": 253758,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 248 KiB",
            "urgency": "high",
            "sourceAuditId": "uses-optimized-images"
          },
          {
            "id": "render-blocking-resources",
            "title": "Eliminate render-blocking resources",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering.",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1788,
            "displayValue": "Est savings of 1,790 ms",
            "urgency": "high",
            "sourceAuditId": "render-blocking-resources"
          },
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 170073,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 166 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": 91935,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 90 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-css-rules"
          },
          {
            "id": "unused-javascript",
            "title": "Remove unused JavaScript",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code.",
            "estimatedSavingsBytes": 32481,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 32 KiB",
            "urgency": "low",
            "sourceAuditId": "unused-javascript"
          },
          {
            "id": "uses-text-compression",
            "title": "Enable text compression",
            "detail": "Serve text assets with Brotli or gzip to remove avoidable transfer bloat.",
            "estimatedSavingsBytes": 22424,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 22 KiB",
            "urgency": "low",
            "sourceAuditId": "uses-text-compression"
          }
        ],
        "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: 348.81 KB."
          },
          {
            "title": "Compress oversized image assets",
            "urgency": "high",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 247.81 KB."
          },
          {
            "title": "Eliminate render-blocking resources",
            "urgency": "high",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering. Estimated render unblocking: 1788 ms."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "medium",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 166.09 KB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "medium",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 89.78 KB."
          },
          {
            "title": "Remove unused JavaScript",
            "urgency": "low",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 31.72 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": 10,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 8,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "8 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": 525408.1251513035
        },
        "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: 513.09 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: 513.09 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": "medium",
        "transferBytes": 1244584,
        "css": {
          "unusedBytes": 91935,
          "ratio": 0.0738680555109177,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 32481,
          "duplicatedBytes": 0,
          "ratio": 0.02609787688094978,
          "auditIds": [
            "unused-javascript",
            "duplicated-javascript"
          ]
        },
        "html": {
          "estimatedPenalty": 0.25,
          "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": "high",
            "estimatedSavingsBytes": 91935,
            "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": "medium",
            "estimatedSavingsBytes": 32481,
            "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": 1244584,
        "estimatedDeferrableBytes": 294489,
        "renderBlockingMs": 1788,
        "breakdown": {
          "offscreenImageSavings": 170073,
          "unusedJavascriptSavings": 32481,
          "unusedCssSavings": 91935
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 170073,
            "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": "medium",
            "estimatedSavingsBytes": 32481,
            "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": "high",
            "estimatedSavingsBytes": 91935,
            "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": "Eliminate render-blocking resources",
            "area": "render-path",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1788,
            "strategy": "Defer scripts/styles not required for first paint and preload only truly critical assets.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-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 www.barcelona.cat",
            "area": "font",
            "urgency": "medium",
            "estimatedSavingsBytes": 90559,
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "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 www.barcelona.cat",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 84137,
            "url": "https://www.barcelona.cat/themes/barcelonacat_theme/images/menu/viula.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 image from estatics-nasia.dtibcn.cat",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 83974,
            "url": "https://estatics-nasia.dtibcn.cat/nasia-pro/media/1113165738-imatges%2Cdir%2Ceq%2Csants%2Ci_1113165738.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 cdn.matomo.cloud",
            "area": "script",
            "urgency": "medium",
            "estimatedSavingsBytes": 76425,
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.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": 65,
        "urgency": "high",
        "providerCount": 8,
        "requestCount": 9,
        "transferBytes": 155536,
        "notGreenCount": 5,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76425,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "cdnjs.cloudflare.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15870,
            "sampleUrl": "https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js",
            "greenCheck": {
              "hostname": "cdnjs.cloudflare.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:34",
              "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/cdnjs.cloudflare.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15565,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7144,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5656,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=7IXD8i&url=https%3A%2F%2Fwww.barcelona.cat%2Fca%2Fviure-a-bcn%2Famb-nens-i-nenes%2Flleure%2Fllistat-de-ludotecas",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "high",
            "detail": "Track 8 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."
          },
          {
            "title": "Prioritize greener alternatives for third-party providers",
            "urgency": "high",
            "detail": "5 third-party script origin(s) are not confirmed green in the Green Web Foundation dataset."
          }
        ]
      },
      "redundancy": {
        "score": 33,
        "urgency": "medium",
        "transferBytes": 1244584,
        "estimatedRedundantBytes": 124416,
        "redundancyRatio": 0.09996593239186749,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 91935,
            "displayValue": "Est savings of 90 KiB"
          },
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 32481,
            "displayValue": "Est savings of 32 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 91935,
            "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 unused javascript",
            "urgency": "medium",
            "estimatedSavingsBytes": 32481,
            "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": "Enable and verify text compression",
            "urgency": "medium",
            "estimatedSavingsBytes": 22424,
            "auditId": "uses-text-compression",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "2",
              "title": "Remove unnecessary or redundant information",
              "url": "https://www.w3.org/TR/web-sustainability-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": 16,
        "urgency": "medium",
        "totalTransferBytes": 1244584,
        "heavyRequestCount": 4,
        "heavyBytes": 270999,
        "heavyRatio": 0.2177426352901853,
        "heavyRequests": [
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "transferSize": 90559,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "transferSize": 76425,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "cdn.matomo.cloud"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament/fonts/icoajuntament.ttf?8aaig7",
            "transferSize": 54918,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/css/css_evpTRQTawGYS1Ro7RbXq3hBxwat7AU-RJm1V8ZgzeaE.css?delta=5&language=ca&theme=barcelonacat_theme&include=eJyFztEOwiAMheEXgnDhA5EDq4gySmiZ7u1dYuJinPGqTf_voriOqpipqseShcW9hkXLBntMI8NNUGo53qh_JzpjFBUT0CMVrohQzwv1nicSt8lhlbls_ZdpSGSXTPdPoBeayQVmFe1oPk71CKTCAcWKriXXdCRyZLv_fSSEx3bzgir-9A-0zibE6jfW4d6bp4dSryhGVlGaXYDQE_H9jbg&tcut5n",
            "transferSize": 49097,
            "resourceType": "stylesheet",
            "mimeType": "text/css",
            "domain": "www.barcelona.cat"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "font",
            "count": 2,
            "transferBytes": 145477
          },
          {
            "resourceType": "script",
            "count": 1,
            "transferBytes": 76425
          },
          {
            "resourceType": "stylesheet",
            "count": 1,
            "transferBytes": 49097
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.barcelona.cat",
            "count": 3,
            "transferBytes": 194574
          },
          {
            "domain": "cdn.matomo.cloud",
            "count": 1,
            "transferBytes": 76425
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Lazy-load offscreen images and media galleries",
            "urgency": "high",
            "estimatedSavingsBytes": 170073,
            "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": "Defer non-critical UI modules until after first render",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "strategy": "Keep only above-the-fold resources in the initial path; hydrate or import secondary modules later.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 www.barcelona.cat",
            "urgency": "medium",
            "estimatedSavingsBytes": 90559,
            "strategy": "Subset or defer this font so full font payloads are only fetched when needed.",
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 cdn.matomo.cloud",
            "urgency": "medium",
            "estimatedSavingsBytes": 76425,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.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": "10.0 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: 10.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,
          "displayValue": "Est savings of 32 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 32 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,
          "displayValue": "Est savings of 90 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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 90 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,
          "displayValue": "Est savings of 349 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 349 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 248 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 248 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": "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": 0,
          "displayValue": "Est savings of 1,790 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 Eliminate render-blocking resources\n\n- Lighthouse audit: render-blocking-resources\n- Current value: Est savings of 1,790 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\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": "server-response-time",
          "title": "Reduce initial server response time",
          "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": 0,
          "displayValue": "Root document took 880 ms",
          "impact": "high",
          "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 Reduce initial server response time\n\n- Lighthouse audit: server-response-time\n- Current value: Root document took 880 ms\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": "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,
          "displayValue": "1,089 elements",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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: 1,089 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"
        },
        {
          "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": 0.69,
          "displayValue": "4.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 Speed Index\n\n- Lighthouse audit: speed-index\n- Current value: 4.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\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": "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 166 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 166 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-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": 0.5,
          "displayValue": "Est savings of 22 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 Enable text compression\n\n- Lighthouse audit: uses-text-compression\n- Current value: Est savings of 22 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\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"
        }
      ]
    },
    {
      "url": "https://barcelona.cat/en/what-to-do-in-bcn/parks-and-gardens/childrens-play-areas",
      "status": "ok",
      "finalUrl": "https://www.barcelona.cat/en/what-to-do-in-bcn/parks-and-gardens/childrens-play-areas",
      "performanceScore": 0.68,
      "bestPracticesScore": 1,
      "transferBytes": 827280,
      "co2Grams": 0.31691558059200003,
      "greenWeb": {
        "page": {
          "hostname": "www.barcelona.cat",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-13T22:38:00.231825",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.barcelona.cat",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76425,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "stylesheet",
            "requestCount": 1,
            "transferBytes": 24654,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "cdnjs.cloudflare.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15870,
            "sampleUrl": "https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js",
            "greenCheck": {
              "hostname": "cdnjs.cloudflare.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:34",
              "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/cdnjs.cloudflare.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15565,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7143,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 4111,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/css/bcn-avisos.css",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "fonts.googleapis.com",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 2481,
            "sampleUrl": "https://fonts.googleapis.com/css?family=Source+Sans+3:200,200i,300,300i,400,400i,500,500i,600,600i,700,700i,900,900i",
            "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
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=mP74CK&url=https%3A%2F%2Fwww.barcelona.cat%2Fen%2Fwhat-to-do-in-bcn%2Fparks-and-gardens%2Fchildrens-play-areas",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 11,
          "greenCount": 5,
          "notGreenCount": 7,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 75,
        "urgency": "high",
        "pageElementOccurrences": 4,
        "uniqueElementsAssessed": 2,
        "reusedFromCacheCount": 2,
        "components": [
          {
            "signature": "form|get|/en|input|text|query|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "text",
            "fieldName": "query",
            "formContext": "form|get|/en",
            "hasLabel": true,
            "hasValidationRule": false,
            "hasErrorMessagingHook": false,
            "toolingFriendly": false,
            "assessment": {
              "score": 60,
              "urgency": "high",
              "issues": [
                "No explicit validation rule",
                "No error messaging hook",
                "Missing autocomplete for tooling support"
              ],
              "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.",
                "Provide meaningful autocomplete values to support browsers and assistive tooling."
              ]
            },
            "reusedFromCache": true
          },
          {
            "signature": "no-form|select|select|anonymous|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "select",
            "fieldName": null,
            "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": "No explicit validation rule",
            "urgency": "medium",
            "detail": "2 unique form control signature(s) on this page include this issue."
          },
          {
            "title": "No error messaging hook",
            "urgency": "medium",
            "detail": "2 unique form control signature(s) on this page include this issue."
          },
          {
            "title": "Missing autocomplete for tooling support",
            "urgency": "medium",
            "detail": "1 unique form control signature(s) on this page include this issue."
          },
          {
            "title": "Missing associated label",
            "urgency": "high",
            "detail": "1 unique form control signature(s) on this page include this issue."
          }
        ]
      },
      "metadata": {
        "score": 25,
        "urgency": "low",
        "checks": {
          "hasTitle": true,
          "hasLang": true,
          "hasDescription": false,
          "hasCanonical": true,
          "hasOpenGraphCore": false,
          "hasTwitterCard": true,
          "hasViewport": true,
          "hasCharset": true,
          "hasValidStructuredData": true,
          "hasInvalidStructuredData": false
        },
        "observed": {
          "title": "Children's play areas | Barcelona.cat | Ajuntament de Barcelona",
          "lang": "en",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "",
          "robots": "",
          "canonical": "https://www.barcelona.cat/en/what-to-do-in-bcn/parks-and-gardens/childrens-play-areas",
          "ogTitle": "Children's play areas",
          "ogDescription": "",
          "ogType": "Web",
          "ogUrl": "https://www.barcelona.cat/en/what-to-do-in-bcn/parks-and-gardens/childrens-play-areas",
          "twitterCard": "summary_large_image",
          "ldJsonCount": 0,
          "validLdJsonCount": 0,
          "invalidLdJsonCount": 0
        },
        "recommendations": [
          {
            "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."
          }
        ]
      },
      "layoutAdaptation": {
        "score": 30,
        "urgency": "medium",
        "checks": {
          "testedMobile": true,
          "testedTablet": true,
          "horizontalOverflowOnMobile": false,
          "horizontalOverflowOnTablet": false,
          "mobileSmallTapTargets": 50,
          "tabletSmallTapTargets": 48,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 50,
            "oversizedMedia": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 48,
            "oversizedMedia": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 50 small targets on mobile and 48 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 59,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": true,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": true,
          "externalScriptCount": 8,
          "externalScriptsWithoutIntegrity": 8,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "cache-control": "max-age=300, public",
            "content-encoding": "gzip",
            "content-language": "en",
            "content-length": "11297",
            "content-type": "text/html; charset=UTF-8",
            "date": "Mon, 13 Apr 2026 22:48:49 GMT",
            "etag": "\"1776120528-gzip\"",
            "expires": "Sun, 19 Nov 1978 05:00:00 GMT",
            "last-modified": "Mon, 13 Apr 2026 22:48:48 GMT",
            "server": "nginx",
            "vary": "Cookie,Accept-Encoding",
            "via": "1.1 ca2190123e61f1744d1210c24c87c840.cloudfront.net (CloudFront)",
            "x-amz-cf-id": "E7KETeDlFfJsHcKuLq-Gi-hm-RZRavxVoAMqoEvqg89oT0ozzlWEbA==",
            "x-amz-cf-pop": "IAD12-P5",
            "x-cache": "Miss from cloudfront",
            "x-content-type-options": "nosniff",
            "x-frame-options": "SAMEORIGIN",
            "x-generator": "Drupal 10 (https://www.drupal.org)"
          },
          "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": "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": "8 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 25,
        "urgency": "low",
        "origin": "https://www.barcelona.cat",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://www.barcelona.cat/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/sitemap.xml",
            "found": true,
            "status": 200,
            "contentType": "application/xml; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/manifest.webmanifest",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/favicon.ico",
            "found": true,
            "status": 200,
            "contentType": "image/x-icon"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "low",
            "detail": "Missing beneficial file(s): /.well-known/security.txt, /manifest.webmanifest."
          }
        ]
      },
      "mediaHints": {
        "score": 50,
        "urgency": "medium",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 11,
          "imagesWithLazy": 0,
          "imagesWithoutLazy": 11
        },
        "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": "11 of 11 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 85,
        "urgency": "medium",
        "data": {
          "hasPrintStyles": true,
          "hasReducedMotion": true,
          "media": {
            "totalImages": 16,
            "lazyImages": 1,
            "totalIframes": 1,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "\"Source Sans Pro\", \"Helvetica Neue\", Helvetica, Arial, sans-serif",
            "usesSystemFont": true
          },
          "tracking": {
            "count": 0,
            "scripts": []
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 1/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": "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"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 16,
        "urgency": "low",
        "totalEstimatedSavingsBytes": 130442.55,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Use modern image compression formats",
            "urgency": "medium",
            "estimatedSavingsBytes": 72410.55,
            "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size."
          },
          {
            "id": "uses-optimized-images",
            "title": "Improve image encoding quality/size",
            "urgency": "medium",
            "estimatedSavingsBytes": 58032,
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings."
          }
        ],
        "recommendations": [
          {
            "title": "Use modern image compression formats",
            "urgency": "medium",
            "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size. Estimated savings: 70.71 KB."
          },
          {
            "title": "Improve image encoding quality/size",
            "urgency": "medium",
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 56.67 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": 342061.55,
        "totalEstimatedBlockingMs": 1649,
        "opportunities": [
          {
            "id": "render-blocking-resources",
            "title": "Eliminate render-blocking resources",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering.",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1649,
            "displayValue": "Est savings of 1,650 ms",
            "urgency": "high",
            "sourceAuditId": "render-blocking-resources"
          },
          {
            "id": "unused-css-rules",
            "title": "Remove unused CSS",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped.",
            "estimatedSavingsBytes": 92028,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 90 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-css-rules"
          },
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 87110,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 85 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": 72410.55,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 71 KiB",
            "urgency": "medium",
            "sourceAuditId": "modern-image-formats"
          },
          {
            "id": "uses-optimized-images",
            "title": "Compress oversized image assets",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss.",
            "estimatedSavingsBytes": 58032,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 57 KiB",
            "urgency": "medium",
            "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": 32481,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 32 KiB",
            "urgency": "low",
            "sourceAuditId": "unused-javascript"
          }
        ],
        "recommendations": [
          {
            "title": "Eliminate render-blocking resources",
            "urgency": "high",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering. Estimated render unblocking: 1649 ms."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "medium",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 89.87 KB."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "medium",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 85.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: 70.71 KB."
          },
          {
            "title": "Compress oversized image assets",
            "urgency": "medium",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 56.67 KB."
          },
          {
            "title": "Remove unused JavaScript",
            "urgency": "low",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 31.72 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": 10,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 8,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "8 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": 168000.4334846369
        },
        "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: 164.06 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: 164.06 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": "medium",
        "transferBytes": 827280,
        "css": {
          "unusedBytes": 92028,
          "ratio": 0.11124165941398317,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 32481,
          "duplicatedBytes": 0,
          "ratio": 0.039262402088772845,
          "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": "high",
            "estimatedSavingsBytes": 92028,
            "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": "medium",
            "estimatedSavingsBytes": 32481,
            "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": 827280,
        "estimatedDeferrableBytes": 211619,
        "renderBlockingMs": 1649,
        "breakdown": {
          "offscreenImageSavings": 87110,
          "unusedJavascriptSavings": 32481,
          "unusedCssSavings": 92028
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 87110,
            "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": "medium",
            "estimatedSavingsBytes": 32481,
            "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": "high",
            "estimatedSavingsBytes": 92028,
            "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": "Eliminate render-blocking resources",
            "area": "render-path",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1649,
            "strategy": "Defer scripts/styles not required for first paint and preload only truly critical assets.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-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 www.barcelona.cat",
            "area": "font",
            "urgency": "medium",
            "estimatedSavingsBytes": 90561,
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "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 www.barcelona.cat",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 84137,
            "url": "https://www.barcelona.cat/themes/barcelonacat_theme/images/menu/viula.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 cdn.matomo.cloud",
            "area": "script",
            "urgency": "medium",
            "estimatedSavingsBytes": 76425,
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.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": 65,
        "urgency": "high",
        "providerCount": 8,
        "requestCount": 9,
        "transferBytes": 155325,
        "notGreenCount": 5,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76425,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "cdnjs.cloudflare.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15870,
            "sampleUrl": "https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js",
            "greenCheck": {
              "hostname": "cdnjs.cloudflare.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:34",
              "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/cdnjs.cloudflare.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15565,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7143,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=mP74CK&url=https%3A%2F%2Fwww.barcelona.cat%2Fen%2Fwhat-to-do-in-bcn%2Fparks-and-gardens%2Fchildrens-play-areas",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "high",
            "detail": "Track 8 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."
          },
          {
            "title": "Prioritize greener alternatives for third-party providers",
            "urgency": "high",
            "detail": "5 third-party script origin(s) are not confirmed green in the Green Web Foundation dataset."
          }
        ]
      },
      "redundancy": {
        "score": 18,
        "urgency": "low",
        "transferBytes": 827280,
        "estimatedRedundantBytes": 124509,
        "redundancyRatio": 0.15050406150275603,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 92028,
            "displayValue": "Est savings of 90 KiB"
          },
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 32481,
            "displayValue": "Est savings of 32 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 92028,
            "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 unused javascript",
            "urgency": "medium",
            "estimatedSavingsBytes": 32481,
            "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 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": 20,
        "urgency": "medium",
        "totalTransferBytes": 827280,
        "heavyRequestCount": 4,
        "heavyBytes": 271001,
        "heavyRatio": 0.32758074654288755,
        "heavyRequests": [
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "transferSize": 90561,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "transferSize": 76425,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "cdn.matomo.cloud"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament/fonts/icoajuntament.ttf?8aaig7",
            "transferSize": 54921,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/css/css_evpTRQTawGYS1Ro7RbXq3hBxwat7AU-RJm1V8ZgzeaE.css?delta=5&language=en&theme=barcelonacat_theme&include=eJyFztEOwiAMheEXgnDhA5EDq4gySmiZ7u1dYuJinPGqTf_voriOqpipqseShcW9hkXLBntMI8NNUGo53qh_JzpjFBUT0CMVrohQzwv1nicSt8lhlbls_ZdpSGSXTPdPoBeayQVmFe1oPk71CKTCAcWKriXXdCRyZLv_fSSEx3bzgir-9A-0zibE6jfW4d6bp4dSryhGVlGaXYDQE_H9jbg&tcut5n",
            "transferSize": 49094,
            "resourceType": "stylesheet",
            "mimeType": "text/css",
            "domain": "www.barcelona.cat"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "font",
            "count": 2,
            "transferBytes": 145482
          },
          {
            "resourceType": "script",
            "count": 1,
            "transferBytes": 76425
          },
          {
            "resourceType": "stylesheet",
            "count": 1,
            "transferBytes": 49094
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.barcelona.cat",
            "count": 3,
            "transferBytes": 194576
          },
          {
            "domain": "cdn.matomo.cloud",
            "count": 1,
            "transferBytes": 76425
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Lazy-load offscreen images and media galleries",
            "urgency": "medium",
            "estimatedSavingsBytes": 87110,
            "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": "Defer non-critical UI modules until after first render",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "strategy": "Keep only above-the-fold resources in the initial path; hydrate or import secondary modules later.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 www.barcelona.cat",
            "urgency": "medium",
            "estimatedSavingsBytes": 90561,
            "strategy": "Subset or defer this font so full font payloads are only fetched when needed.",
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 cdn.matomo.cloud",
            "urgency": "medium",
            "estimatedSavingsBytes": 76425,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.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.09,
          "displayValue": "6.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: 6.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-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,
          "displayValue": "Est savings of 90 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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 90 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,
          "displayValue": "Est savings of 71 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 71 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 57 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 57 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,
          "displayValue": "Est savings of 85 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 85 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": "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": 0,
          "displayValue": "Est savings of 1,650 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 Eliminate render-blocking resources\n\n- Lighthouse audit: render-blocking-resources\n- Current value: Est savings of 1,650 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\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": "server-response-time",
          "title": "Reduce initial server response time",
          "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": 0,
          "displayValue": "Root document took 850 ms",
          "impact": "high",
          "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 Reduce initial server response time\n\n- Lighthouse audit: server-response-time\n- Current value: Root document took 850 ms\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": "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": 0.81,
          "displayValue": "4.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 Speed Index\n\n- Lighthouse audit: speed-index\n- Current value: 4.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\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": 0.5,
          "displayValue": "Est savings of 32 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 32 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": "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": "983 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: 983 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://barcelona.cat/ca/que-pots-fer-a-bcn/estiu/refrescat-a-les-piscines-municipals",
      "status": "ok",
      "finalUrl": "https://www.barcelona.cat/ca/que-pots-fer-a-bcn/estiu/refrescat-a-les-piscines-municipals",
      "performanceScore": 0.67,
      "bestPracticesScore": 1,
      "transferBytes": 1154115,
      "co2Grams": 0.442119989961,
      "greenWeb": {
        "page": {
          "hostname": "www.barcelona.cat",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-13T22:38:00.231825",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.barcelona.cat",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76423,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "stylesheet",
            "requestCount": 1,
            "transferBytes": 24659,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "cdnjs.cloudflare.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15867,
            "sampleUrl": "https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js",
            "greenCheck": {
              "hostname": "cdnjs.cloudflare.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:34",
              "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/cdnjs.cloudflare.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15565,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7143,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 4109,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/css/bcn-avisos.css",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "fonts.googleapis.com",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 2480,
            "sampleUrl": "https://fonts.googleapis.com/css?family=Source+Sans+3:200,200i,300,300i,400,400i,500,500i,600,600i,700,700i,900,900i",
            "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
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=5tz199&url=https%3A%2F%2Fwww.barcelona.cat%2Fca%2Fque-pots-fer-a-bcn%2Festiu%2Frefrescat-a-les-piscines-municipals",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 11,
          "greenCount": 5,
          "notGreenCount": 7,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 75,
        "urgency": "high",
        "pageElementOccurrences": 6,
        "uniqueElementsAssessed": 2,
        "reusedFromCacheCount": 2,
        "components": [
          {
            "signature": "form|get|/ca|input|text|query|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "text",
            "fieldName": "query",
            "formContext": "form|get|/ca",
            "hasLabel": true,
            "hasValidationRule": false,
            "hasErrorMessagingHook": false,
            "toolingFriendly": false,
            "assessment": {
              "score": 60,
              "urgency": "high",
              "issues": [
                "No explicit validation rule",
                "No error messaging hook",
                "Missing autocomplete for tooling support"
              ],
              "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.",
                "Provide meaningful autocomplete values to support browsers and assistive tooling."
              ]
            },
            "reusedFromCache": true
          },
          {
            "signature": "no-form|select|select|anonymous|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "select",
            "fieldName": null,
            "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": "No explicit validation rule",
            "urgency": "medium",
            "detail": "2 unique form control signature(s) on this page include this issue."
          },
          {
            "title": "No error messaging hook",
            "urgency": "medium",
            "detail": "2 unique form control signature(s) on this page include this issue."
          },
          {
            "title": "Missing autocomplete for tooling support",
            "urgency": "medium",
            "detail": "1 unique form control signature(s) on this page include this issue."
          },
          {
            "title": "Missing associated label",
            "urgency": "high",
            "detail": "1 unique form control signature(s) on this page include this issue."
          }
        ]
      },
      "metadata": {
        "score": 25,
        "urgency": "low",
        "checks": {
          "hasTitle": true,
          "hasLang": true,
          "hasDescription": false,
          "hasCanonical": true,
          "hasOpenGraphCore": false,
          "hasTwitterCard": true,
          "hasViewport": true,
          "hasCharset": true,
          "hasValidStructuredData": true,
          "hasInvalidStructuredData": false
        },
        "observed": {
          "title": "Refresca’t a les piscines municipals | Barcelona.cat | Ajuntament de Barcelona",
          "lang": "ca",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "",
          "robots": "",
          "canonical": "https://www.barcelona.cat/ca/que-pots-fer-a-bcn/estiu/refrescat-a-les-piscines-municipals",
          "ogTitle": "Refresca’t a les piscines municipals",
          "ogDescription": "",
          "ogType": "Web",
          "ogUrl": "https://www.barcelona.cat/ca/que-pots-fer-a-bcn/estiu/refrescat-a-les-piscines-municipals",
          "twitterCard": "summary_large_image",
          "ldJsonCount": 0,
          "validLdJsonCount": 0,
          "invalidLdJsonCount": 0
        },
        "recommendations": [
          {
            "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."
          }
        ]
      },
      "layoutAdaptation": {
        "score": 30,
        "urgency": "medium",
        "checks": {
          "testedMobile": true,
          "testedTablet": true,
          "horizontalOverflowOnMobile": false,
          "horizontalOverflowOnTablet": false,
          "mobileSmallTapTargets": 73,
          "tabletSmallTapTargets": 76,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 73,
            "oversizedMedia": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 76,
            "oversizedMedia": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 73 small targets on mobile and 76 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 59,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": true,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": true,
          "externalScriptCount": 8,
          "externalScriptsWithoutIntegrity": 8,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "cache-control": "max-age=300, public",
            "content-encoding": "gzip",
            "content-language": "ca",
            "content-length": "12194",
            "content-type": "text/html; charset=UTF-8",
            "date": "Mon, 13 Apr 2026 22:49:03 GMT",
            "etag": "\"1776120542-gzip\"",
            "expires": "Sun, 19 Nov 1978 05:00:00 GMT",
            "last-modified": "Mon, 13 Apr 2026 22:49:02 GMT",
            "server": "nginx",
            "vary": "Cookie,Accept-Encoding",
            "via": "1.1 ca2190123e61f1744d1210c24c87c840.cloudfront.net (CloudFront)",
            "x-amz-cf-id": "6mlwbhxuKBocueSUH9eruOZZOa0ZGwajSAzP0PYIvZchG4O1uooIzw==",
            "x-amz-cf-pop": "IAD12-P5",
            "x-cache": "Miss from cloudfront",
            "x-content-type-options": "nosniff",
            "x-frame-options": "SAMEORIGIN",
            "x-generator": "Drupal 10 (https://www.drupal.org)"
          },
          "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": "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": "8 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 25,
        "urgency": "low",
        "origin": "https://www.barcelona.cat",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://www.barcelona.cat/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/sitemap.xml",
            "found": true,
            "status": 200,
            "contentType": "application/xml; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/manifest.webmanifest",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/favicon.ico",
            "found": true,
            "status": 200,
            "contentType": "image/x-icon"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "low",
            "detail": "Missing beneficial file(s): /.well-known/security.txt, /manifest.webmanifest."
          }
        ]
      },
      "mediaHints": {
        "score": 50,
        "urgency": "medium",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 25,
          "imagesWithLazy": 0,
          "imagesWithoutLazy": 25
        },
        "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": "25 of 25 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 85,
        "urgency": "medium",
        "data": {
          "hasPrintStyles": true,
          "hasReducedMotion": true,
          "media": {
            "totalImages": 30,
            "lazyImages": 1,
            "totalIframes": 1,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "\"Source Sans Pro\", \"Helvetica Neue\", Helvetica, Arial, sans-serif",
            "usesSystemFont": true
          },
          "tracking": {
            "count": 0,
            "scripts": []
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 1/30 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": "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"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 44,
        "urgency": "medium",
        "totalEstimatedSavingsBytes": 509776.95,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Use modern image compression formats",
            "urgency": "high",
            "estimatedSavingsBytes": 292101.95,
            "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": 217675,
            "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: 285.26 KB."
          },
          {
            "title": "Improve image encoding quality/size",
            "urgency": "high",
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 212.57 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": 1029764.95,
        "totalEstimatedBlockingMs": 1597,
        "opportunities": [
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 395365,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 386 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": 292101.95,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 285 KiB",
            "urgency": "high",
            "sourceAuditId": "modern-image-formats"
          },
          {
            "id": "uses-optimized-images",
            "title": "Compress oversized image assets",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss.",
            "estimatedSavingsBytes": 217675,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 213 KiB",
            "urgency": "high",
            "sourceAuditId": "uses-optimized-images"
          },
          {
            "id": "render-blocking-resources",
            "title": "Eliminate render-blocking resources",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering.",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1597,
            "displayValue": "Est savings of 1,600 ms",
            "urgency": "high",
            "sourceAuditId": "render-blocking-resources"
          },
          {
            "id": "unused-css-rules",
            "title": "Remove unused CSS",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped.",
            "estimatedSavingsBytes": 92142,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 90 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-css-rules"
          },
          {
            "id": "unused-javascript",
            "title": "Remove unused JavaScript",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code.",
            "estimatedSavingsBytes": 32481,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 32 KiB",
            "urgency": "low",
            "sourceAuditId": "unused-javascript"
          }
        ],
        "recommendations": [
          {
            "title": "Lazy-load offscreen images",
            "urgency": "high",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 386.10 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: 285.26 KB."
          },
          {
            "title": "Compress oversized image assets",
            "urgency": "high",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 212.57 KB."
          },
          {
            "title": "Eliminate render-blocking resources",
            "urgency": "high",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering. Estimated render unblocking: 1597 ms."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "medium",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 89.98 KB."
          },
          {
            "title": "Remove unused JavaScript",
            "urgency": "low",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 31.72 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": 10,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 8,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "8 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": 463058.4298766294
        },
        "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: 452.21 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: 452.21 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": "medium",
        "transferBytes": 1154115,
        "css": {
          "unusedBytes": 92142,
          "ratio": 0.0798377977931142,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 32481,
          "duplicatedBytes": 0,
          "ratio": 0.02814364253129021,
          "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": "high",
            "estimatedSavingsBytes": 92142,
            "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": "medium",
            "estimatedSavingsBytes": 32481,
            "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": 1154115,
        "estimatedDeferrableBytes": 519988,
        "renderBlockingMs": 1597,
        "breakdown": {
          "offscreenImageSavings": 395365,
          "unusedJavascriptSavings": 32481,
          "unusedCssSavings": 92142
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "high",
            "estimatedSavingsBytes": 395365,
            "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": "medium",
            "estimatedSavingsBytes": 32481,
            "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": "high",
            "estimatedSavingsBytes": 92142,
            "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": "Eliminate render-blocking resources",
            "area": "render-path",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1597,
            "strategy": "Defer scripts/styles not required for first paint and preload only truly critical assets.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-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 www.barcelona.cat",
            "area": "font",
            "urgency": "medium",
            "estimatedSavingsBytes": 90561,
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "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 www.barcelona.cat",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 84136,
            "url": "https://www.barcelona.cat/themes/barcelonacat_theme/images/menu/viula.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 cdn.matomo.cloud",
            "area": "script",
            "urgency": "medium",
            "estimatedSavingsBytes": 76423,
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.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 estatics-nasia.dtibcn.cat",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 65989,
            "url": "https://estatics-nasia.dtibcn.cat/nasia-pro/media/93302114541-Creueta.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": 65,
        "urgency": "high",
        "providerCount": 8,
        "requestCount": 9,
        "transferBytes": 155320,
        "notGreenCount": 5,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76423,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "cdnjs.cloudflare.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15867,
            "sampleUrl": "https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js",
            "greenCheck": {
              "hostname": "cdnjs.cloudflare.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:34",
              "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/cdnjs.cloudflare.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15565,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7143,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=5tz199&url=https%3A%2F%2Fwww.barcelona.cat%2Fca%2Fque-pots-fer-a-bcn%2Festiu%2Frefrescat-a-les-piscines-municipals",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "high",
            "detail": "Track 8 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."
          },
          {
            "title": "Prioritize greener alternatives for third-party providers",
            "urgency": "high",
            "detail": "5 third-party script origin(s) are not confirmed green in the Green Web Foundation dataset."
          }
        ]
      },
      "redundancy": {
        "score": 16,
        "urgency": "low",
        "transferBytes": 1154115,
        "estimatedRedundantBytes": 124623,
        "redundancyRatio": 0.10798144032440442,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 92142,
            "displayValue": "Est savings of 90 KiB"
          },
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 32481,
            "displayValue": "Est savings of 32 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 92142,
            "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 unused javascript",
            "urgency": "medium",
            "estimatedSavingsBytes": 32481,
            "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 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": 21,
        "urgency": "medium",
        "totalTransferBytes": 1154115,
        "heavyRequestCount": 4,
        "heavyBytes": 271009,
        "heavyRatio": 0.23481975366406294,
        "heavyRequests": [
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "transferSize": 90561,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "transferSize": 76423,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "cdn.matomo.cloud"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament/fonts/icoajuntament.ttf?8aaig7",
            "transferSize": 54922,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/css/css_evpTRQTawGYS1Ro7RbXq3hBxwat7AU-RJm1V8ZgzeaE.css?delta=5&language=ca&theme=barcelonacat_theme&include=eJyFztEOwiAMheEXgnDhA5EDq4gySmiZ7u1dYuJinPGqTf_voriOqpipqseShcW9hkXLBntMI8NNUGo53qh_JzpjFBUT0CMVrohQzwv1nicSt8lhlbls_ZdpSGSXTPdPoBeayQVmFe1oPk71CKTCAcWKriXXdCRyZLv_fSSEx3bzgir-9A-0zibE6jfW4d6bp4dSryhGVlGaXYDQE_H9jbg&tcut5n",
            "transferSize": 49103,
            "resourceType": "stylesheet",
            "mimeType": "text/css",
            "domain": "www.barcelona.cat"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "font",
            "count": 2,
            "transferBytes": 145483
          },
          {
            "resourceType": "script",
            "count": 1,
            "transferBytes": 76423
          },
          {
            "resourceType": "stylesheet",
            "count": 1,
            "transferBytes": 49103
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.barcelona.cat",
            "count": 3,
            "transferBytes": 194586
          },
          {
            "domain": "cdn.matomo.cloud",
            "count": 1,
            "transferBytes": 76423
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Lazy-load offscreen images and media galleries",
            "urgency": "high",
            "estimatedSavingsBytes": 395365,
            "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": "Defer non-critical UI modules until after first render",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "strategy": "Keep only above-the-fold resources in the initial path; hydrate or import secondary modules later.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 www.barcelona.cat",
            "urgency": "medium",
            "estimatedSavingsBytes": 90561,
            "strategy": "Subset or defer this font so full font payloads are only fetched when needed.",
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 cdn.matomo.cloud",
            "urgency": "medium",
            "estimatedSavingsBytes": 76423,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.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.06,
          "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-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,
          "displayValue": "Est savings of 90 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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 90 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,
          "displayValue": "Est savings of 285 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 285 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 213 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 213 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,
          "displayValue": "Est savings of 386 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 386 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": "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": 0,
          "displayValue": "Est savings of 1,600 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 Eliminate render-blocking resources\n\n- Lighthouse audit: render-blocking-resources\n- Current value: Est savings of 1,600 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\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": "server-response-time",
          "title": "Reduce initial server response time",
          "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": 0,
          "displayValue": "Root document took 960 ms",
          "impact": "high",
          "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 Reduce initial server response time\n\n- Lighthouse audit: server-response-time\n- Current value: Root document took 960 ms\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": "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": 0.74,
          "displayValue": "4.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 Speed Index\n\n- Lighthouse audit: speed-index\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\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": 0.5,
          "displayValue": "Est savings of 32 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 32 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": "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": "1,136 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: 1,136 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://barcelona.cat/es/que-hacer-en-bcn/banos-y-playas/playa-de-sant-miquel",
      "status": "ok",
      "finalUrl": "https://www.barcelona.cat/es/que-hacer-en-bcn/banos-y-playas/playa-de-sant-miquel",
      "performanceScore": 0.48,
      "bestPracticesScore": 0.96,
      "transferBytes": 1605807,
      "co2Grams": 0.6151547936898,
      "greenWeb": {
        "page": {
          "hostname": "www.barcelona.cat",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-13T22:38:00.231825",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.barcelona.cat",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76425,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "stylesheet",
            "requestCount": 1,
            "transferBytes": 24654,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15565,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7145,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 4110,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/css/bcn-avisos.css",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "fonts.googleapis.com",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 2481,
            "sampleUrl": "https://fonts.googleapis.com/css?family=Source+Sans+3:200,200i,300,300i,400,400i,500,500i,600,600i,700,700i,900,900i",
            "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
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=z92Y1E&url=https%3A%2F%2Fwww.barcelona.cat%2Fes%2Fque-hacer-en-bcn%2Fbanos-y-playas%2Fplaya-de-sant-miquel",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 10,
          "greenCount": 4,
          "notGreenCount": 7,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 60,
        "urgency": "high",
        "pageElementOccurrences": 1,
        "uniqueElementsAssessed": 1,
        "reusedFromCacheCount": 1,
        "components": [
          {
            "signature": "form|get|/es/|input|text|query|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "text",
            "fieldName": "query",
            "formContext": "form|get|/es/",
            "hasLabel": true,
            "hasValidationRule": false,
            "hasErrorMessagingHook": false,
            "toolingFriendly": false,
            "assessment": {
              "score": 60,
              "urgency": "high",
              "issues": [
                "No explicit validation rule",
                "No error messaging hook",
                "Missing autocomplete for tooling support"
              ],
              "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.",
                "Provide meaningful autocomplete values to support browsers and assistive tooling."
              ]
            },
            "reusedFromCache": true
          }
        ],
        "recommendations": [
          {
            "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."
          },
          {
            "title": "Missing autocomplete for tooling support",
            "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": "Playa Sant Miquel | Web Barcelona | Ayuntamiento Barcelona",
          "lang": "es",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "La playa de Sant Miquel, una de las más concurridas de Barcelona, está situada junto a la plaza del mar, y tiene una longitud de unos 420 metros.",
          "robots": "",
          "canonical": "https://www.barcelona.cat/es/que-hacer-en-bcn/banos-y-playas/playa-de-sant-miquel",
          "ogTitle": "Playa de Sant Miquel",
          "ogDescription": "Descubre la playa de Sant Miquel, una de las playas más antiguas y concurridas de Barcelona. Dispone de aparcamientos adaptados, itinerarios accesibles y duchas y lavabos adaptados.",
          "ogType": "Web",
          "ogUrl": "https://www.barcelona.cat/es/que-hacer-en-bcn/banos-y-playas/playa-de-sant-miquel",
          "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": 34,
        "urgency": "medium",
        "checks": {
          "testedMobile": true,
          "testedTablet": true,
          "horizontalOverflowOnMobile": false,
          "horizontalOverflowOnTablet": false,
          "mobileSmallTapTargets": 41,
          "tabletSmallTapTargets": 39,
          "fixedWidthOffenders": 2,
          "oversizedMedia": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 1,
            "smallTapTargets": 41,
            "oversizedMedia": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 1,
            "smallTapTargets": 39,
            "oversizedMedia": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 41 small targets on mobile and 39 on tablet."
          },
          {
            "title": "Refactor fixed-width components",
            "urgency": "medium",
            "detail": "2 element(s) exceeded viewport width in tested layouts; use responsive component constraints."
          }
        ]
      },
      "securityLight": {
        "score": 59,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": true,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": true,
          "externalScriptCount": 7,
          "externalScriptsWithoutIntegrity": 7,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "cache-control": "max-age=300, public",
            "content-encoding": "gzip",
            "content-language": "es",
            "content-length": "11816",
            "content-type": "text/html; charset=UTF-8",
            "date": "Mon, 13 Apr 2026 22:49:17 GMT",
            "etag": "\"1776120556-gzip\"",
            "expires": "Sun, 19 Nov 1978 05:00:00 GMT",
            "last-modified": "Mon, 13 Apr 2026 22:49:16 GMT",
            "server": "nginx",
            "vary": "Cookie,Accept-Encoding",
            "via": "1.1 ca2190123e61f1744d1210c24c87c840.cloudfront.net (CloudFront)",
            "x-amz-cf-id": "JHcKlbfBHbeKJ3jbnxgU-dOL7FLXKpwBPUs28I14TuSzWKNLLx1V8Q==",
            "x-amz-cf-pop": "IAD12-P5",
            "x-cache": "Miss from cloudfront",
            "x-content-type-options": "nosniff",
            "x-frame-options": "SAMEORIGIN",
            "x-generator": "Drupal 10 (https://www.drupal.org)"
          },
          "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": "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": "7 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 25,
        "urgency": "low",
        "origin": "https://www.barcelona.cat",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://www.barcelona.cat/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/sitemap.xml",
            "found": true,
            "status": 200,
            "contentType": "application/xml; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/manifest.webmanifest",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/favicon.ico",
            "found": true,
            "status": 200,
            "contentType": "image/x-icon"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "low",
            "detail": "Missing beneficial file(s): /.well-known/security.txt, /manifest.webmanifest."
          }
        ]
      },
      "mediaHints": {
        "score": 39,
        "urgency": "medium",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 16,
          "imagesWithLazy": 3,
          "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 16 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 85,
        "urgency": "medium",
        "data": {
          "hasPrintStyles": true,
          "hasReducedMotion": true,
          "media": {
            "totalImages": 21,
            "lazyImages": 4,
            "totalIframes": 1,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "\"Source Sans Pro\", \"Helvetica Neue\", Helvetica, Arial, sans-serif",
            "usesSystemFont": true
          },
          "tracking": {
            "count": 0,
            "scripts": []
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 4/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": "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"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 83,
        "urgency": "high",
        "totalEstimatedSavingsBytes": 1337363.6,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Use modern image compression formats",
            "urgency": "high",
            "estimatedSavingsBytes": 719427.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": 617936,
            "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: 702.57 KB."
          },
          {
            "title": "Improve image encoding quality/size",
            "urgency": "high",
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 603.45 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": 1562218.6,
        "totalEstimatedBlockingMs": 1028,
        "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": 719427.6,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 703 KiB",
            "urgency": "high",
            "sourceAuditId": "modern-image-formats"
          },
          {
            "id": "uses-optimized-images",
            "title": "Compress oversized image assets",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss.",
            "estimatedSavingsBytes": 617936,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 603 KiB",
            "urgency": "high",
            "sourceAuditId": "uses-optimized-images"
          },
          {
            "id": "render-blocking-resources",
            "title": "Eliminate render-blocking resources",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering.",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1028,
            "displayValue": "Est savings of 1,030 ms",
            "urgency": "high",
            "sourceAuditId": "render-blocking-resources"
          },
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 87108,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 85 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": 83301,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 81 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-css-rules"
          },
          {
            "id": "unused-javascript",
            "title": "Remove unused JavaScript",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code.",
            "estimatedSavingsBytes": 54446,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 53 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-javascript"
          }
        ],
        "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: 702.57 KB."
          },
          {
            "title": "Compress oversized image assets",
            "urgency": "high",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 603.45 KB."
          },
          {
            "title": "Eliminate render-blocking resources",
            "urgency": "high",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering. Estimated render unblocking: 1028 ms."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "medium",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 85.07 KB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "medium",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 81.35 KB."
          },
          {
            "title": "Remove unused JavaScript",
            "urgency": "medium",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 53.17 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": 10,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 7,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "7 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": 167998.92723463685
        },
        "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: 164.06 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: 164.06 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": "medium",
        "transferBytes": 1605807,
        "css": {
          "unusedBytes": 83301,
          "ratio": 0.05187485171007475,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 54446,
          "duplicatedBytes": 0,
          "ratio": 0.0339056935235679,
          "auditIds": [
            "unused-javascript",
            "duplicated-javascript"
          ]
        },
        "html": {
          "estimatedPenalty": 0.25,
          "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": "high",
            "estimatedSavingsBytes": 83301,
            "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": "medium",
            "estimatedSavingsBytes": 54446,
            "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": 14,
        "urgency": "high",
        "transferBytes": 1605807,
        "estimatedDeferrableBytes": 224855,
        "renderBlockingMs": 1028,
        "breakdown": {
          "offscreenImageSavings": 87108,
          "unusedJavascriptSavings": 54446,
          "unusedCssSavings": 83301
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 87108,
            "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": "medium",
            "estimatedSavingsBytes": 54446,
            "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": "high",
            "estimatedSavingsBytes": 83301,
            "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": "Eliminate render-blocking resources",
            "area": "render-path",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1028,
            "strategy": "Defer scripts/styles not required for first paint and preload only truly critical assets.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-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 www.barcelona.cat",
            "area": "image",
            "urgency": "high",
            "estimatedSavingsBytes": 281712,
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_platges/public/platges/176222209112813.jpg?itok=XqCCjNhJ",
            "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 www.barcelona.cat",
            "area": "font",
            "urgency": "medium",
            "estimatedSavingsBytes": 90560,
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "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": 64,
        "urgency": "high",
        "providerCount": 7,
        "requestCount": 8,
        "transferBytes": 139457,
        "notGreenCount": 5,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76425,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15565,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7145,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=z92Y1E&url=https%3A%2F%2Fwww.barcelona.cat%2Fes%2Fque-hacer-en-bcn%2Fbanos-y-playas%2Fplaya-de-sant-miquel",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "high",
            "detail": "Track 7 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."
          },
          {
            "title": "Prioritize greener alternatives for third-party providers",
            "urgency": "high",
            "detail": "5 third-party script origin(s) are not confirmed green in the Green Web Foundation dataset."
          }
        ]
      },
      "redundancy": {
        "score": 25,
        "urgency": "medium",
        "transferBytes": 1605807,
        "estimatedRedundantBytes": 137747,
        "redundancyRatio": 0.08578054523364265,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 83301,
            "displayValue": "Est savings of 81 KiB"
          },
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 54446,
            "displayValue": "Est savings of 53 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 83301,
            "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 unused javascript",
            "urgency": "medium",
            "estimatedSavingsBytes": 54446,
            "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 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": 34,
        "urgency": "medium",
        "totalTransferBytes": 1605807,
        "heavyRequestCount": 7,
        "heavyBytes": 1014165,
        "heavyRatio": 0.6315609534645197,
        "heavyRequests": [
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_platges/public/platges/176222209112813.jpg?itok=XqCCjNhJ",
            "transferSize": 281712,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_platges/public/platges/038484212120914.jpg?itok=lfGKWsl7",
            "transferSize": 259546,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_platges/public/platges/762315009090616.jpg?itok=cak5W2UB",
            "transferSize": 199055,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "transferSize": 90560,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "transferSize": 76425,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "cdn.matomo.cloud"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament/fonts/icoajuntament.ttf?8aaig7",
            "transferSize": 54921,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/css/css_qDD4BCxE8K-iT7MRORwp32v03DlJblP9-xrYwOBWlQo.css?delta=6&language=es&theme=barcelonacat_theme&include=eJyFz9EKwjAMBdAfWumDH1RuY5zVLhlNNre_dyAMhIpPudx7XoLHIo6JxRPWYmrxcwLmMmQ04qoCgiddubVyZYuHXoKr1mP_ZWaMHNbCr2_gd544ZlU3b5gTXaUHbhDas269bayaUYP5XouMPVFIA86_esJqoWcAEZuVXLlrdDm6ZBBLl39gbjpkknSwhnimxJtzE9TBdnOeYobxG293khk&tcut5n",
            "transferSize": 51946,
            "resourceType": "stylesheet",
            "mimeType": "text/css",
            "domain": "www.barcelona.cat"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "image",
            "count": 3,
            "transferBytes": 740313
          },
          {
            "resourceType": "font",
            "count": 2,
            "transferBytes": 145481
          },
          {
            "resourceType": "script",
            "count": 1,
            "transferBytes": 76425
          },
          {
            "resourceType": "stylesheet",
            "count": 1,
            "transferBytes": 51946
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.barcelona.cat",
            "count": 6,
            "transferBytes": 937740
          },
          {
            "domain": "cdn.matomo.cloud",
            "count": 1,
            "transferBytes": 76425
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Lazy-load offscreen images and media galleries",
            "urgency": "medium",
            "estimatedSavingsBytes": 87108,
            "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": "medium",
            "estimatedSavingsBytes": 54446,
            "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": "Defer non-critical UI modules until after first render",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "strategy": "Keep only above-the-fold resources in the initial path; hydrate or import secondary modules later.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 www.barcelona.cat",
            "urgency": "high",
            "estimatedSavingsBytes": 281712,
            "strategy": "Serve a smaller placeholder first and load this asset only when the user scrolls to or requests the component.",
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_platges/public/platges/176222209112813.jpg?itok=XqCCjNhJ",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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": "12.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: 12.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 53 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 53 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,
          "displayValue": "Est savings of 81 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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 81 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,
          "displayValue": "Est savings of 703 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 703 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 603 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 603 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,
          "displayValue": "Est savings of 85 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 85 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": "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": 0,
          "displayValue": "Est savings of 1,030 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 Eliminate render-blocking resources\n\n- Lighthouse audit: render-blocking-resources\n- Current value: Est savings of 1,030 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\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": "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,
          "displayValue": "1,074 elements",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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: 1,074 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"
        },
        {
          "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": 0.78,
          "displayValue": "4.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 Speed Index\n\n- Lighthouse audit: speed-index\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\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"
        }
      ]
    },
    {
      "url": "https://barcelona.cat/ca/que-pots-fer-a-bcn/parcs-i-jardins/parcs-forestals",
      "status": "ok",
      "finalUrl": "https://www.barcelona.cat/ca/que-pots-fer-a-bcn/parcs-i-jardins/parcs-forestals",
      "performanceScore": 0.66,
      "bestPracticesScore": 1,
      "transferBytes": 974913,
      "co2Grams": 0.3734710369182,
      "greenWeb": {
        "page": {
          "hostname": "www.barcelona.cat",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-13T22:38:00.231825",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.barcelona.cat",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76425,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "stylesheet",
            "requestCount": 1,
            "transferBytes": 24654,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "cdnjs.cloudflare.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15870,
            "sampleUrl": "https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js",
            "greenCheck": {
              "hostname": "cdnjs.cloudflare.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:34",
              "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/cdnjs.cloudflare.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15565,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7146,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 4109,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/css/bcn-avisos.css",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "fonts.googleapis.com",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 2481,
            "sampleUrl": "https://fonts.googleapis.com/css?family=Source+Sans+3:200,200i,300,300i,400,400i,500,500i,600,600i,700,700i,900,900i",
            "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
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=lJ6lFg&url=https%3A%2F%2Fwww.barcelona.cat%2Fca%2Fque-pots-fer-a-bcn%2Fparcs-i-jardins%2Fparcs-forestals",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 11,
          "greenCount": 5,
          "notGreenCount": 7,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 75,
        "urgency": "high",
        "pageElementOccurrences": 4,
        "uniqueElementsAssessed": 2,
        "reusedFromCacheCount": 2,
        "components": [
          {
            "signature": "form|get|/ca|input|text|query|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "text",
            "fieldName": "query",
            "formContext": "form|get|/ca",
            "hasLabel": true,
            "hasValidationRule": false,
            "hasErrorMessagingHook": false,
            "toolingFriendly": false,
            "assessment": {
              "score": 60,
              "urgency": "high",
              "issues": [
                "No explicit validation rule",
                "No error messaging hook",
                "Missing autocomplete for tooling support"
              ],
              "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.",
                "Provide meaningful autocomplete values to support browsers and assistive tooling."
              ]
            },
            "reusedFromCache": true
          },
          {
            "signature": "no-form|select|select|anonymous|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "select",
            "fieldName": null,
            "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": "No explicit validation rule",
            "urgency": "medium",
            "detail": "2 unique form control signature(s) on this page include this issue."
          },
          {
            "title": "No error messaging hook",
            "urgency": "medium",
            "detail": "2 unique form control signature(s) on this page include this issue."
          },
          {
            "title": "Missing autocomplete for tooling support",
            "urgency": "medium",
            "detail": "1 unique form control signature(s) on this page include this issue."
          },
          {
            "title": "Missing associated label",
            "urgency": "high",
            "detail": "1 unique form control signature(s) on this page include this issue."
          }
        ]
      },
      "metadata": {
        "score": 25,
        "urgency": "low",
        "checks": {
          "hasTitle": true,
          "hasLang": true,
          "hasDescription": false,
          "hasCanonical": true,
          "hasOpenGraphCore": false,
          "hasTwitterCard": true,
          "hasViewport": true,
          "hasCharset": true,
          "hasValidStructuredData": true,
          "hasInvalidStructuredData": false
        },
        "observed": {
          "title": "Parcs forestals | Barcelona.cat | Ajuntament de Barcelona",
          "lang": "ca",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "",
          "robots": "",
          "canonical": "https://www.barcelona.cat/ca/que-pots-fer-a-bcn/parcs-i-jardins/parcs-forestals",
          "ogTitle": "Parcs forestals",
          "ogDescription": "",
          "ogType": "Web",
          "ogUrl": "https://www.barcelona.cat/ca/que-pots-fer-a-bcn/parcs-i-jardins/parcs-forestals",
          "twitterCard": "summary_large_image",
          "ldJsonCount": 0,
          "validLdJsonCount": 0,
          "invalidLdJsonCount": 0
        },
        "recommendations": [
          {
            "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."
          }
        ]
      },
      "layoutAdaptation": {
        "score": 30,
        "urgency": "medium",
        "checks": {
          "testedMobile": true,
          "testedTablet": true,
          "horizontalOverflowOnMobile": false,
          "horizontalOverflowOnTablet": false,
          "mobileSmallTapTargets": 42,
          "tabletSmallTapTargets": 40,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 42,
            "oversizedMedia": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 40,
            "oversizedMedia": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 42 small targets on mobile and 40 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 59,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": true,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": true,
          "externalScriptCount": 8,
          "externalScriptsWithoutIntegrity": 8,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "cache-control": "max-age=300, public",
            "content-encoding": "gzip",
            "content-language": "ca",
            "content-length": "10924",
            "content-type": "text/html; charset=UTF-8",
            "date": "Mon, 13 Apr 2026 22:49:31 GMT",
            "etag": "\"1776120571-gzip\"",
            "expires": "Sun, 19 Nov 1978 05:00:00 GMT",
            "last-modified": "Mon, 13 Apr 2026 22:49:31 GMT",
            "server": "nginx",
            "vary": "Cookie,Accept-Encoding",
            "via": "1.1 ca2190123e61f1744d1210c24c87c840.cloudfront.net (CloudFront)",
            "x-amz-cf-id": "a7NUPYyxrtCBhfuPd7f4eBM-GFH19QSlROCakKqsUVPLLqyS1d1Cbg==",
            "x-amz-cf-pop": "IAD12-P5",
            "x-cache": "Miss from cloudfront",
            "x-content-type-options": "nosniff",
            "x-frame-options": "SAMEORIGIN",
            "x-generator": "Drupal 10 (https://www.drupal.org)"
          },
          "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": "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": "8 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 25,
        "urgency": "low",
        "origin": "https://www.barcelona.cat",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://www.barcelona.cat/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/sitemap.xml",
            "found": true,
            "status": 200,
            "contentType": "application/xml; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/manifest.webmanifest",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/favicon.ico",
            "found": true,
            "status": 200,
            "contentType": "image/x-icon"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "low",
            "detail": "Missing beneficial file(s): /.well-known/security.txt, /manifest.webmanifest."
          }
        ]
      },
      "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": 85,
        "urgency": "medium",
        "data": {
          "hasPrintStyles": true,
          "hasReducedMotion": true,
          "media": {
            "totalImages": 18,
            "lazyImages": 1,
            "totalIframes": 1,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "\"Source Sans Pro\", \"Helvetica Neue\", Helvetica, Arial, sans-serif",
            "usesSystemFont": true
          },
          "tracking": {
            "count": 0,
            "scripts": []
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 1/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": "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"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 22,
        "urgency": "low",
        "totalEstimatedSavingsBytes": 214501.35,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Use modern image compression formats",
            "urgency": "medium",
            "estimatedSavingsBytes": 143840.35,
            "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size."
          },
          {
            "id": "uses-optimized-images",
            "title": "Improve image encoding quality/size",
            "urgency": "medium",
            "estimatedSavingsBytes": 70661,
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings."
          }
        ],
        "recommendations": [
          {
            "title": "Use modern image compression formats",
            "urgency": "medium",
            "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size. Estimated savings: 140.47 KB."
          },
          {
            "title": "Improve image encoding quality/size",
            "urgency": "medium",
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 69.00 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": 555417.35,
        "totalEstimatedBlockingMs": 1608,
        "opportunities": [
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 216252,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 211 KiB",
            "urgency": "high",
            "sourceAuditId": "offscreen-images"
          },
          {
            "id": "render-blocking-resources",
            "title": "Eliminate render-blocking resources",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering.",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1608,
            "displayValue": "Est savings of 1,610 ms",
            "urgency": "high",
            "sourceAuditId": "render-blocking-resources"
          },
          {
            "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": 143840.35,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 140 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": 92183,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 90 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-css-rules"
          },
          {
            "id": "uses-optimized-images",
            "title": "Compress oversized image assets",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss.",
            "estimatedSavingsBytes": 70661,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 69 KiB",
            "urgency": "medium",
            "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": 32481,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 32 KiB",
            "urgency": "low",
            "sourceAuditId": "unused-javascript"
          }
        ],
        "recommendations": [
          {
            "title": "Lazy-load offscreen images",
            "urgency": "high",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 211.18 KB."
          },
          {
            "title": "Eliminate render-blocking resources",
            "urgency": "high",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering. Estimated render unblocking: 1608 ms."
          },
          {
            "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: 140.47 KB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "medium",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 90.02 KB."
          },
          {
            "title": "Compress oversized image assets",
            "urgency": "medium",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 69.00 KB."
          },
          {
            "title": "Remove unused JavaScript",
            "urgency": "low",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 31.72 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": 10,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 8,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "8 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": 292617.55431797024
        },
        "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: 285.76 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: 285.76 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": "medium",
        "transferBytes": 974913,
        "css": {
          "unusedBytes": 92183,
          "ratio": 0.09455510389132159,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 32481,
          "duplicatedBytes": 0,
          "ratio": 0.03331681903923735,
          "auditIds": [
            "unused-javascript",
            "duplicated-javascript"
          ]
        },
        "html": {
          "estimatedPenalty": 0.25,
          "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": "high",
            "estimatedSavingsBytes": 92183,
            "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": "medium",
            "estimatedSavingsBytes": 32481,
            "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": 974913,
        "estimatedDeferrableBytes": 340916,
        "renderBlockingMs": 1608,
        "breakdown": {
          "offscreenImageSavings": 216252,
          "unusedJavascriptSavings": 32481,
          "unusedCssSavings": 92183
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 216252,
            "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": "medium",
            "estimatedSavingsBytes": 32481,
            "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": "high",
            "estimatedSavingsBytes": 92183,
            "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": "Eliminate render-blocking resources",
            "area": "render-path",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1608,
            "strategy": "Defer scripts/styles not required for first paint and preload only truly critical assets.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-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 www.barcelona.cat",
            "area": "font",
            "urgency": "medium",
            "estimatedSavingsBytes": 90561,
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "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 www.barcelona.cat",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 84137,
            "url": "https://www.barcelona.cat/themes/barcelonacat_theme/images/menu/viula.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 image from estatics-nasia.dtibcn.cat",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 76797,
            "url": "https://estatics-nasia.dtibcn.cat/nasia-pro/media/316054116060915.570x321.607522de.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 cdn.matomo.cloud",
            "area": "script",
            "urgency": "medium",
            "estimatedSavingsBytes": 76425,
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.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": 65,
        "urgency": "high",
        "providerCount": 8,
        "requestCount": 9,
        "transferBytes": 155328,
        "notGreenCount": 5,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76425,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "cdnjs.cloudflare.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15870,
            "sampleUrl": "https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js",
            "greenCheck": {
              "hostname": "cdnjs.cloudflare.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:34",
              "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/cdnjs.cloudflare.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15565,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7146,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=lJ6lFg&url=https%3A%2F%2Fwww.barcelona.cat%2Fca%2Fque-pots-fer-a-bcn%2Fparcs-i-jardins%2Fparcs-forestals",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "high",
            "detail": "Track 8 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."
          },
          {
            "title": "Prioritize greener alternatives for third-party providers",
            "urgency": "high",
            "detail": "5 third-party script origin(s) are not confirmed green in the Green Web Foundation dataset."
          }
        ]
      },
      "redundancy": {
        "score": 27,
        "urgency": "low",
        "transferBytes": 974913,
        "estimatedRedundantBytes": 124664,
        "redundancyRatio": 0.12787192293055893,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 92183,
            "displayValue": "Est savings of 90 KiB"
          },
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 32481,
            "displayValue": "Est savings of 32 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 92183,
            "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 unused javascript",
            "urgency": "medium",
            "estimatedSavingsBytes": 32481,
            "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 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": 20,
        "urgency": "medium",
        "totalTransferBytes": 974913,
        "heavyRequestCount": 4,
        "heavyBytes": 271000,
        "heavyRatio": 0.2779735217398886,
        "heavyRequests": [
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "transferSize": 90561,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "transferSize": 76425,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "cdn.matomo.cloud"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament/fonts/icoajuntament.ttf?8aaig7",
            "transferSize": 54920,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/css/css_evpTRQTawGYS1Ro7RbXq3hBxwat7AU-RJm1V8ZgzeaE.css?delta=5&language=ca&theme=barcelonacat_theme&include=eJyFztEOwiAMheEXgnDhA5EDq4gySmiZ7u1dYuJinPGqTf_voriOqpipqseShcW9hkXLBntMI8NNUGo53qh_JzpjFBUT0CMVrohQzwv1nicSt8lhlbls_ZdpSGSXTPdPoBeayQVmFe1oPk71CKTCAcWKriXXdCRyZLv_fSSEx3bzgir-9A-0zibE6jfW4d6bp4dSryhGVlGaXYDQE_H9jbg&tcut5n",
            "transferSize": 49094,
            "resourceType": "stylesheet",
            "mimeType": "text/css",
            "domain": "www.barcelona.cat"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "font",
            "count": 2,
            "transferBytes": 145481
          },
          {
            "resourceType": "script",
            "count": 1,
            "transferBytes": 76425
          },
          {
            "resourceType": "stylesheet",
            "count": 1,
            "transferBytes": 49094
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.barcelona.cat",
            "count": 3,
            "transferBytes": 194575
          },
          {
            "domain": "cdn.matomo.cloud",
            "count": 1,
            "transferBytes": 76425
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Lazy-load offscreen images and media galleries",
            "urgency": "high",
            "estimatedSavingsBytes": 216252,
            "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": "Defer non-critical UI modules until after first render",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "strategy": "Keep only above-the-fold resources in the initial path; hydrate or import secondary modules later.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 www.barcelona.cat",
            "urgency": "medium",
            "estimatedSavingsBytes": 90561,
            "strategy": "Subset or defer this font so full font payloads are only fetched when needed.",
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 cdn.matomo.cloud",
            "urgency": "medium",
            "estimatedSavingsBytes": 76425,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.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.1,
          "displayValue": "6.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: 6.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-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,
          "displayValue": "Est savings of 90 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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 90 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,
          "displayValue": "Est savings of 140 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 140 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 69 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 69 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,
          "displayValue": "Est savings of 211 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 211 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": "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": 0,
          "displayValue": "Est savings of 1,610 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 Eliminate render-blocking resources\n\n- Lighthouse audit: render-blocking-resources\n- Current value: Est savings of 1,610 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\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": "server-response-time",
          "title": "Reduce initial server response time",
          "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": 0,
          "displayValue": "Root document took 790 ms",
          "impact": "high",
          "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 Reduce initial server response time\n\n- Lighthouse audit: server-response-time\n- Current value: Root document took 790 ms\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": "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,
          "displayValue": "995 elements",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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: 995 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"
        },
        {
          "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": 0.8,
          "displayValue": "4.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 Speed Index\n\n- Lighthouse audit: speed-index\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\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": 0.5,
          "displayValue": "Est savings of 32 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 32 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"
        }
      ]
    },
    {
      "url": "https://barcelona.cat/en/what-to-do-in-bcn/summer/outdoor-films",
      "status": "ok",
      "finalUrl": "https://www.barcelona.cat/en/what-to-do-in-bcn/summer/outdoor-films",
      "performanceScore": 0.66,
      "bestPracticesScore": 1,
      "transferBytes": 868635,
      "co2Grams": 0.332757911889,
      "greenWeb": {
        "page": {
          "hostname": "www.barcelona.cat",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-13T22:38:00.231825",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.barcelona.cat",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76425,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "stylesheet",
            "requestCount": 1,
            "transferBytes": 24654,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "cdnjs.cloudflare.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15869,
            "sampleUrl": "https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js",
            "greenCheck": {
              "hostname": "cdnjs.cloudflare.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:34",
              "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/cdnjs.cloudflare.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15565,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7145,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 4112,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/css/bcn-avisos.css",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "fonts.googleapis.com",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 2481,
            "sampleUrl": "https://fonts.googleapis.com/css?family=Source+Sans+3:200,200i,300,300i,400,400i,500,500i,600,600i,700,700i,900,900i",
            "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
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=F59KmU&url=https%3A%2F%2Fwww.barcelona.cat%2Fen%2Fwhat-to-do-in-bcn%2Fsummer%2Foutdoor-films",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 11,
          "greenCount": 5,
          "notGreenCount": 7,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 75,
        "urgency": "high",
        "pageElementOccurrences": 8,
        "uniqueElementsAssessed": 2,
        "reusedFromCacheCount": 2,
        "components": [
          {
            "signature": "form|get|/en|input|text|query|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "text",
            "fieldName": "query",
            "formContext": "form|get|/en",
            "hasLabel": true,
            "hasValidationRule": false,
            "hasErrorMessagingHook": false,
            "toolingFriendly": false,
            "assessment": {
              "score": 60,
              "urgency": "high",
              "issues": [
                "No explicit validation rule",
                "No error messaging hook",
                "Missing autocomplete for tooling support"
              ],
              "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.",
                "Provide meaningful autocomplete values to support browsers and assistive tooling."
              ]
            },
            "reusedFromCache": true
          },
          {
            "signature": "no-form|select|select|anonymous|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "select",
            "fieldName": null,
            "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": "No explicit validation rule",
            "urgency": "medium",
            "detail": "2 unique form control signature(s) on this page include this issue."
          },
          {
            "title": "No error messaging hook",
            "urgency": "medium",
            "detail": "2 unique form control signature(s) on this page include this issue."
          },
          {
            "title": "Missing autocomplete for tooling support",
            "urgency": "medium",
            "detail": "1 unique form control signature(s) on this page include this issue."
          },
          {
            "title": "Missing associated label",
            "urgency": "high",
            "detail": "1 unique form control signature(s) on this page include this issue."
          }
        ]
      },
      "metadata": {
        "score": 25,
        "urgency": "low",
        "checks": {
          "hasTitle": true,
          "hasLang": true,
          "hasDescription": false,
          "hasCanonical": true,
          "hasOpenGraphCore": false,
          "hasTwitterCard": true,
          "hasViewport": true,
          "hasCharset": true,
          "hasValidStructuredData": true,
          "hasInvalidStructuredData": false
        },
        "observed": {
          "title": "Outdoor films | Barcelona.cat | Ajuntament de Barcelona",
          "lang": "en",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "",
          "robots": "",
          "canonical": "https://www.barcelona.cat/en/what-to-do-in-bcn/summer/outdoor-films",
          "ogTitle": "Outdoor films",
          "ogDescription": "",
          "ogType": "Web",
          "ogUrl": "https://www.barcelona.cat/en/what-to-do-in-bcn/summer/outdoor-films",
          "twitterCard": "summary_large_image",
          "ldJsonCount": 0,
          "validLdJsonCount": 0,
          "invalidLdJsonCount": 0
        },
        "recommendations": [
          {
            "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."
          }
        ]
      },
      "layoutAdaptation": {
        "score": 30,
        "urgency": "medium",
        "checks": {
          "testedMobile": true,
          "testedTablet": true,
          "horizontalOverflowOnMobile": false,
          "horizontalOverflowOnTablet": false,
          "mobileSmallTapTargets": 49,
          "tabletSmallTapTargets": 50,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 49,
            "oversizedMedia": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 50,
            "oversizedMedia": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 49 small targets on mobile and 50 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 59,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": true,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": true,
          "externalScriptCount": 8,
          "externalScriptsWithoutIntegrity": 8,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "cache-control": "max-age=300, public",
            "content-encoding": "gzip",
            "content-language": "en",
            "content-length": "11336",
            "content-type": "text/html; charset=UTF-8",
            "date": "Mon, 13 Apr 2026 22:49:46 GMT",
            "etag": "\"1776120585-gzip\"",
            "expires": "Sun, 19 Nov 1978 05:00:00 GMT",
            "last-modified": "Mon, 13 Apr 2026 22:49:45 GMT",
            "server": "nginx",
            "vary": "Cookie,Accept-Encoding",
            "via": "1.1 ca2190123e61f1744d1210c24c87c840.cloudfront.net (CloudFront)",
            "x-amz-cf-id": "lBL1CiKRViaM9jxRn7rn7A0mJSVMNHSOPLjz5vIvslWJahy522YTuQ==",
            "x-amz-cf-pop": "IAD12-P5",
            "x-cache": "Miss from cloudfront",
            "x-content-type-options": "nosniff",
            "x-frame-options": "SAMEORIGIN",
            "x-generator": "Drupal 10 (https://www.drupal.org)"
          },
          "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": "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": "8 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 25,
        "urgency": "low",
        "origin": "https://www.barcelona.cat",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://www.barcelona.cat/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/sitemap.xml",
            "found": true,
            "status": 200,
            "contentType": "application/xml; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/manifest.webmanifest",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/favicon.ico",
            "found": true,
            "status": 200,
            "contentType": "image/x-icon"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "low",
            "detail": "Missing beneficial file(s): /.well-known/security.txt, /manifest.webmanifest."
          }
        ]
      },
      "mediaHints": {
        "score": 50,
        "urgency": "medium",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 14,
          "imagesWithLazy": 0,
          "imagesWithoutLazy": 14
        },
        "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": "14 of 14 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 85,
        "urgency": "medium",
        "data": {
          "hasPrintStyles": true,
          "hasReducedMotion": true,
          "media": {
            "totalImages": 19,
            "lazyImages": 1,
            "totalIframes": 1,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "\"Source Sans Pro\", \"Helvetica Neue\", Helvetica, Arial, sans-serif",
            "usesSystemFont": true
          },
          "tracking": {
            "count": 0,
            "scripts": []
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 1/19 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": "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"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 18,
        "urgency": "low",
        "totalEstimatedSavingsBytes": 160183.1,
        "checks": {
          "hasEffectiveTextCompression": false
        },
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Use modern image compression formats",
            "urgency": "medium",
            "estimatedSavingsBytes": 85650.1,
            "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size."
          },
          {
            "id": "uses-optimized-images",
            "title": "Improve image encoding quality/size",
            "urgency": "medium",
            "estimatedSavingsBytes": 58032,
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings."
          },
          {
            "id": "uses-text-compression",
            "title": "Enable Brotli/gzip for text assets",
            "urgency": "low",
            "estimatedSavingsBytes": 16501,
            "detail": "Compress HTML, CSS, JS, JSON, SVG, and XML responses with Brotli or gzip."
          }
        ],
        "recommendations": [
          {
            "title": "Use modern image compression formats",
            "urgency": "medium",
            "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size. Estimated savings: 83.64 KB."
          },
          {
            "title": "Improve image encoding quality/size",
            "urgency": "medium",
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 56.67 KB."
          },
          {
            "title": "Enable Brotli/gzip for text assets",
            "urgency": "low",
            "detail": "Compress HTML, CSS, JS, JSON, SVG, and XML responses with Brotli or gzip. Estimated savings: 16.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": 393833.1,
        "totalEstimatedBlockingMs": 1931,
        "opportunities": [
          {
            "id": "render-blocking-resources",
            "title": "Eliminate render-blocking resources",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering.",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1931,
            "displayValue": "Est savings of 1,930 ms",
            "urgency": "high",
            "sourceAuditId": "render-blocking-resources"
          },
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 109002,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 106 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": 92167,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 90 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-css-rules"
          },
          {
            "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": 85650.1,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 84 KiB",
            "urgency": "medium",
            "sourceAuditId": "modern-image-formats"
          },
          {
            "id": "uses-optimized-images",
            "title": "Compress oversized image assets",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss.",
            "estimatedSavingsBytes": 58032,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 57 KiB",
            "urgency": "medium",
            "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": 32481,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 32 KiB",
            "urgency": "low",
            "sourceAuditId": "unused-javascript"
          },
          {
            "id": "uses-text-compression",
            "title": "Enable text compression",
            "detail": "Serve text assets with Brotli or gzip to remove avoidable transfer bloat.",
            "estimatedSavingsBytes": 16501,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 16 KiB",
            "urgency": "low",
            "sourceAuditId": "uses-text-compression"
          }
        ],
        "recommendations": [
          {
            "title": "Eliminate render-blocking resources",
            "urgency": "high",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering. Estimated render unblocking: 1931 ms."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "medium",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 106.45 KB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "medium",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 90.01 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: 83.64 KB."
          },
          {
            "title": "Compress oversized image assets",
            "urgency": "medium",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 56.67 KB."
          },
          {
            "title": "Remove unused JavaScript",
            "urgency": "low",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 31.72 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": 10,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 8,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "8 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": 189407.71265130356
        },
        "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: 184.97 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: 184.97 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": "medium",
        "transferBytes": 868635,
        "css": {
          "unusedBytes": 92167,
          "ratio": 0.1061055564189792,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 32481,
          "duplicatedBytes": 0,
          "ratio": 0.03739315132362845,
          "auditIds": [
            "unused-javascript",
            "duplicated-javascript"
          ]
        },
        "html": {
          "estimatedPenalty": 0.25,
          "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": "high",
            "estimatedSavingsBytes": 92167,
            "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": "medium",
            "estimatedSavingsBytes": 32481,
            "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": 23,
        "urgency": "high",
        "transferBytes": 868635,
        "estimatedDeferrableBytes": 233650,
        "renderBlockingMs": 1931,
        "breakdown": {
          "offscreenImageSavings": 109002,
          "unusedJavascriptSavings": 32481,
          "unusedCssSavings": 92167
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 109002,
            "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": "medium",
            "estimatedSavingsBytes": 32481,
            "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": "high",
            "estimatedSavingsBytes": 92167,
            "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": "Eliminate render-blocking resources",
            "area": "render-path",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1931,
            "strategy": "Defer scripts/styles not required for first paint and preload only truly critical assets.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-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 www.barcelona.cat",
            "area": "font",
            "urgency": "medium",
            "estimatedSavingsBytes": 90561,
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "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 www.barcelona.cat",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 84136,
            "url": "https://www.barcelona.cat/themes/barcelonacat_theme/images/menu/viula.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 cdn.matomo.cloud",
            "area": "script",
            "urgency": "medium",
            "estimatedSavingsBytes": 76425,
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.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": 65,
        "urgency": "high",
        "providerCount": 8,
        "requestCount": 9,
        "transferBytes": 155326,
        "notGreenCount": 5,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76425,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "cdnjs.cloudflare.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15869,
            "sampleUrl": "https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js",
            "greenCheck": {
              "hostname": "cdnjs.cloudflare.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:34",
              "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/cdnjs.cloudflare.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15565,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7145,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=F59KmU&url=https%3A%2F%2Fwww.barcelona.cat%2Fen%2Fwhat-to-do-in-bcn%2Fsummer%2Foutdoor-films",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "high",
            "detail": "Track 8 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."
          },
          {
            "title": "Prioritize greener alternatives for third-party providers",
            "urgency": "high",
            "detail": "5 third-party script origin(s) are not confirmed green in the Green Web Foundation dataset."
          }
        ]
      },
      "redundancy": {
        "score": 35,
        "urgency": "medium",
        "transferBytes": 868635,
        "estimatedRedundantBytes": 124648,
        "redundancyRatio": 0.14349870774260765,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 92167,
            "displayValue": "Est savings of 90 KiB"
          },
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 32481,
            "displayValue": "Est savings of 32 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 92167,
            "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 unused javascript",
            "urgency": "medium",
            "estimatedSavingsBytes": 32481,
            "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": "Enable and verify text compression",
            "urgency": "medium",
            "estimatedSavingsBytes": 16501,
            "auditId": "uses-text-compression",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "2",
              "title": "Remove unnecessary or redundant information",
              "url": "https://www.w3.org/TR/web-sustainability-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": 20,
        "urgency": "medium",
        "totalTransferBytes": 868635,
        "heavyRequestCount": 4,
        "heavyBytes": 271001,
        "heavyRatio": 0.3119848958423273,
        "heavyRequests": [
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "transferSize": 90561,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "transferSize": 76425,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "cdn.matomo.cloud"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament/fonts/icoajuntament.ttf?8aaig7",
            "transferSize": 54920,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/css/css_evpTRQTawGYS1Ro7RbXq3hBxwat7AU-RJm1V8ZgzeaE.css?delta=5&language=en&theme=barcelonacat_theme&include=eJyFztEOwiAMheEXgnDhA5EDq4gySmiZ7u1dYuJinPGqTf_voriOqpipqseShcW9hkXLBntMI8NNUGo53qh_JzpjFBUT0CMVrohQzwv1nicSt8lhlbls_ZdpSGSXTPdPoBeayQVmFe1oPk71CKTCAcWKriXXdCRyZLv_fSSEx3bzgir-9A-0zibE6jfW4d6bp4dSryhGVlGaXYDQE_H9jbg&tcut5n",
            "transferSize": 49095,
            "resourceType": "stylesheet",
            "mimeType": "text/css",
            "domain": "www.barcelona.cat"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "font",
            "count": 2,
            "transferBytes": 145481
          },
          {
            "resourceType": "script",
            "count": 1,
            "transferBytes": 76425
          },
          {
            "resourceType": "stylesheet",
            "count": 1,
            "transferBytes": 49095
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.barcelona.cat",
            "count": 3,
            "transferBytes": 194576
          },
          {
            "domain": "cdn.matomo.cloud",
            "count": 1,
            "transferBytes": 76425
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Lazy-load offscreen images and media galleries",
            "urgency": "medium",
            "estimatedSavingsBytes": 109002,
            "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": "Defer non-critical UI modules until after first render",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "strategy": "Keep only above-the-fold resources in the initial path; hydrate or import secondary modules later.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 www.barcelona.cat",
            "urgency": "medium",
            "estimatedSavingsBytes": 90561,
            "strategy": "Subset or defer this font so full font payloads are only fetched when needed.",
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 cdn.matomo.cloud",
            "urgency": "medium",
            "estimatedSavingsBytes": 76425,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.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.11,
          "displayValue": "6.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: 6.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-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,
          "displayValue": "Est savings of 90 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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 90 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,
          "displayValue": "Est savings of 84 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 84 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 57 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 57 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,
          "displayValue": "Est savings of 106 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 106 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": "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": 0,
          "displayValue": "Est savings of 1,930 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 Eliminate render-blocking resources\n\n- Lighthouse audit: render-blocking-resources\n- Current value: Est savings of 1,930 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\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": "server-response-time",
          "title": "Reduce initial server response time",
          "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": 0,
          "displayValue": "Root document took 1,450 ms",
          "impact": "high",
          "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 Reduce initial server response time\n\n- Lighthouse audit: server-response-time\n- Current value: Root document took 1,450 ms\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": "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,
          "displayValue": "999 elements",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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: 999 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"
        },
        {
          "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": 0.65,
          "displayValue": "4.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 Speed Index\n\n- Lighthouse audit: speed-index\n- Current value: 4.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\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": 0.5,
          "displayValue": "Est savings of 32 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 32 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": "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": 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 Enable text compression\n\n- Lighthouse audit: uses-text-compression\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\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"
        }
      ]
    },
    {
      "url": "https://barcelona.cat/es/que-hacer-en-bcn/banos-y-playas/zona-de-banos-del-forum",
      "status": "ok",
      "finalUrl": "https://www.barcelona.cat/es/que-hacer-en-bcn/banos-y-playas/zona-de-banos-del-forum",
      "performanceScore": 0.65,
      "bestPracticesScore": 0.96,
      "transferBytes": 1301957,
      "co2Grams": 0.4987555102998001,
      "greenWeb": {
        "page": {
          "hostname": "www.barcelona.cat",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-13T22:38:00.231825",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.barcelona.cat",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76425,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "stylesheet",
            "requestCount": 1,
            "transferBytes": 24654,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15565,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7146,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5656,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 4113,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/css/bcn-avisos.css",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2860,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "fonts.googleapis.com",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 2479,
            "sampleUrl": "https://fonts.googleapis.com/css?family=Source+Sans+3:200,200i,300,300i,400,400i,500,500i,600,600i,700,700i,900,900i",
            "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
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=VO6oGb&url=https%3A%2F%2Fwww.barcelona.cat%2Fes%2Fque-hacer-en-bcn%2Fbanos-y-playas%2Fzona-de-banos-del-forum",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 10,
          "greenCount": 4,
          "notGreenCount": 7,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 60,
        "urgency": "high",
        "pageElementOccurrences": 1,
        "uniqueElementsAssessed": 1,
        "reusedFromCacheCount": 1,
        "components": [
          {
            "signature": "form|get|/es/|input|text|query|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "text",
            "fieldName": "query",
            "formContext": "form|get|/es/",
            "hasLabel": true,
            "hasValidationRule": false,
            "hasErrorMessagingHook": false,
            "toolingFriendly": false,
            "assessment": {
              "score": 60,
              "urgency": "high",
              "issues": [
                "No explicit validation rule",
                "No error messaging hook",
                "Missing autocomplete for tooling support"
              ],
              "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.",
                "Provide meaningful autocomplete values to support browsers and assistive tooling."
              ]
            },
            "reusedFromCache": true
          }
        ],
        "recommendations": [
          {
            "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."
          },
          {
            "title": "Missing autocomplete for tooling support",
            "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": "Zona baños Fòrum | Web Barcelona | Ayuntamiento Barcelona",
          "lang": "es",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "En la zona de baños del Fòrum puedes acceder al agua a través de escaleras y tomar el sol en las zonas habilitadas. Dispone de servicio de baño asistido.",
          "robots": "",
          "canonical": "https://www.barcelona.cat/es/que-hacer-en-bcn/banos-y-playas/zona-de-banos-del-forum",
          "ogTitle": "Zona de baños del Fórum",
          "ogDescription": "La zona de baños del Fòrum ofrece la posibilidad de bañarse o tomar el sol, pero no dispone de arena, y el acceso al agua se hace directamente desde superficies pavimentadas mediante escaleras. También tiene un área para personas con discapacidad que dispone de servicio de asistencia al baño.",
          "ogType": "Web",
          "ogUrl": "https://www.barcelona.cat/es/que-hacer-en-bcn/banos-y-playas/zona-de-banos-del-forum",
          "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": 32,
        "urgency": "medium",
        "checks": {
          "testedMobile": true,
          "testedTablet": true,
          "horizontalOverflowOnMobile": false,
          "horizontalOverflowOnTablet": false,
          "mobileSmallTapTargets": 41,
          "tabletSmallTapTargets": 39,
          "fixedWidthOffenders": 1,
          "oversizedMedia": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 1,
            "smallTapTargets": 41,
            "oversizedMedia": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 39,
            "oversizedMedia": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 41 small targets on mobile and 39 on tablet."
          },
          {
            "title": "Refactor fixed-width components",
            "urgency": "medium",
            "detail": "1 element(s) exceeded viewport width in tested layouts; use responsive component constraints."
          }
        ]
      },
      "securityLight": {
        "score": 59,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": true,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": true,
          "externalScriptCount": 7,
          "externalScriptsWithoutIntegrity": 7,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "cache-control": "max-age=300, public",
            "content-encoding": "gzip",
            "content-language": "es",
            "content-length": "12696",
            "content-type": "text/html; charset=UTF-8",
            "date": "Mon, 13 Apr 2026 22:50:00 GMT",
            "etag": "\"1776120599-gzip\"",
            "expires": "Sun, 19 Nov 1978 05:00:00 GMT",
            "last-modified": "Mon, 13 Apr 2026 22:49:59 GMT",
            "server": "nginx",
            "vary": "Cookie,Accept-Encoding",
            "via": "1.1 ca2190123e61f1744d1210c24c87c840.cloudfront.net (CloudFront)",
            "x-amz-cf-id": "10PPzC5wwxk6QL-Jq22_LvLR31rn94iJat5fQawRujhAQ63pfM6a1g==",
            "x-amz-cf-pop": "IAD12-P5",
            "x-cache": "Miss from cloudfront",
            "x-content-type-options": "nosniff",
            "x-frame-options": "SAMEORIGIN",
            "x-generator": "Drupal 10 (https://www.drupal.org)"
          },
          "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": "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": "7 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 25,
        "urgency": "low",
        "origin": "https://www.barcelona.cat",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://www.barcelona.cat/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/sitemap.xml",
            "found": true,
            "status": 200,
            "contentType": "application/xml; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/manifest.webmanifest",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/favicon.ico",
            "found": true,
            "status": 200,
            "contentType": "image/x-icon"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "low",
            "detail": "Missing beneficial file(s): /.well-known/security.txt, /manifest.webmanifest."
          }
        ]
      },
      "mediaHints": {
        "score": 42,
        "urgency": "medium",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 15,
          "imagesWithLazy": 2,
          "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 15 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 85,
        "urgency": "medium",
        "data": {
          "hasPrintStyles": true,
          "hasReducedMotion": true,
          "media": {
            "totalImages": 20,
            "lazyImages": 3,
            "totalIframes": 1,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "\"Source Sans Pro\", \"Helvetica Neue\", Helvetica, Arial, sans-serif",
            "usesSystemFont": true
          },
          "tracking": {
            "count": 0,
            "scripts": []
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 3/20 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": "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"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 63,
        "urgency": "high",
        "totalEstimatedSavingsBytes": 824744.6499999999,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Use modern image compression formats",
            "urgency": "high",
            "estimatedSavingsBytes": 444053.64999999997,
            "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": 380691,
            "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: 433.65 KB."
          },
          {
            "title": "Improve image encoding quality/size",
            "urgency": "high",
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 371.77 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": 1049106.65,
        "totalEstimatedBlockingMs": 1593,
        "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": 444053.64999999997,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 434 KiB",
            "urgency": "high",
            "sourceAuditId": "modern-image-formats"
          },
          {
            "id": "uses-optimized-images",
            "title": "Compress oversized image assets",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss.",
            "estimatedSavingsBytes": 380691,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 372 KiB",
            "urgency": "high",
            "sourceAuditId": "uses-optimized-images"
          },
          {
            "id": "render-blocking-resources",
            "title": "Eliminate render-blocking resources",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering.",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1593,
            "displayValue": "Est savings of 1,590 ms",
            "urgency": "high",
            "sourceAuditId": "render-blocking-resources"
          },
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 87108,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 85 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": 82967,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 81 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-css-rules"
          },
          {
            "id": "unused-javascript",
            "title": "Remove unused JavaScript",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code.",
            "estimatedSavingsBytes": 54287,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 53 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-javascript"
          }
        ],
        "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: 433.65 KB."
          },
          {
            "title": "Compress oversized image assets",
            "urgency": "high",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 371.77 KB."
          },
          {
            "title": "Eliminate render-blocking resources",
            "urgency": "high",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering. Estimated render unblocking: 1593 ms."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "medium",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 85.07 KB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "medium",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 81.02 KB."
          },
          {
            "title": "Remove unused JavaScript",
            "urgency": "medium",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 53.01 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": 10,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 7,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "7 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": 168024.42098463688
        },
        "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: 164.09 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: 164.09 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": "medium",
        "transferBytes": 1301957,
        "css": {
          "unusedBytes": 82967,
          "ratio": 0.0637248388387635,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 54287,
          "duplicatedBytes": 0,
          "ratio": 0.04169646155748615,
          "auditIds": [
            "unused-javascript",
            "duplicated-javascript"
          ]
        },
        "html": {
          "estimatedPenalty": 0.25,
          "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": "high",
            "estimatedSavingsBytes": 82967,
            "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": "medium",
            "estimatedSavingsBytes": 54287,
            "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": 20,
        "urgency": "high",
        "transferBytes": 1301957,
        "estimatedDeferrableBytes": 224362,
        "renderBlockingMs": 1593,
        "breakdown": {
          "offscreenImageSavings": 87108,
          "unusedJavascriptSavings": 54287,
          "unusedCssSavings": 82967
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 87108,
            "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": "medium",
            "estimatedSavingsBytes": 54287,
            "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": "high",
            "estimatedSavingsBytes": 82967,
            "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": "Eliminate render-blocking resources",
            "area": "render-path",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1593,
            "strategy": "Defer scripts/styles not required for first paint and preload only truly critical assets.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-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 www.barcelona.cat",
            "area": "image",
            "urgency": "high",
            "estimatedSavingsBytes": 213325,
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_platges/public/platges/552233113111414.jpg?itok=vcwjn_Ho",
            "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 www.barcelona.cat",
            "area": "font",
            "urgency": "medium",
            "estimatedSavingsBytes": 90561,
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "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": 64,
        "urgency": "high",
        "providerCount": 7,
        "requestCount": 8,
        "transferBytes": 139667,
        "notGreenCount": 5,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76425,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15565,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7146,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5656,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2860,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=VO6oGb&url=https%3A%2F%2Fwww.barcelona.cat%2Fes%2Fque-hacer-en-bcn%2Fbanos-y-playas%2Fzona-de-banos-del-forum",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "high",
            "detail": "Track 7 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."
          },
          {
            "title": "Prioritize greener alternatives for third-party providers",
            "urgency": "high",
            "detail": "5 third-party script origin(s) are not confirmed green in the Green Web Foundation dataset."
          }
        ]
      },
      "redundancy": {
        "score": 26,
        "urgency": "medium",
        "transferBytes": 1301957,
        "estimatedRedundantBytes": 137254,
        "redundancyRatio": 0.10542130039624964,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 82967,
            "displayValue": "Est savings of 81 KiB"
          },
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 54287,
            "displayValue": "Est savings of 53 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 82967,
            "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 unused javascript",
            "urgency": "medium",
            "estimatedSavingsBytes": 54287,
            "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 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": 30,
        "urgency": "medium",
        "totalTransferBytes": 1301957,
        "heavyRequestCount": 6,
        "heavyBytes": 694376,
        "heavyRatio": 0.5333325140538435,
        "heavyRequests": [
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_platges/public/platges/552233113111414.jpg?itok=vcwjn_Ho",
            "transferSize": 213325,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_platges/public/platges/873092113110314.jpg?itok=sMhQ4KjT",
            "transferSize": 207202,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "transferSize": 90561,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "transferSize": 76425,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "cdn.matomo.cloud"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament/fonts/icoajuntament.ttf?8aaig7",
            "transferSize": 54920,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/css/css_qDD4BCxE8K-iT7MRORwp32v03DlJblP9-xrYwOBWlQo.css?delta=6&language=es&theme=barcelonacat_theme&include=eJyFz9EKwjAMBdAfWumDH1RuY5zVLhlNNre_dyAMhIpPudx7XoLHIo6JxRPWYmrxcwLmMmQ04qoCgiddubVyZYuHXoKr1mP_ZWaMHNbCr2_gd544ZlU3b5gTXaUHbhDas269bayaUYP5XouMPVFIA86_esJqoWcAEZuVXLlrdDm6ZBBLl39gbjpkknSwhnimxJtzE9TBdnOeYobxG293khk&tcut5n",
            "transferSize": 51943,
            "resourceType": "stylesheet",
            "mimeType": "text/css",
            "domain": "www.barcelona.cat"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "image",
            "count": 2,
            "transferBytes": 420527
          },
          {
            "resourceType": "font",
            "count": 2,
            "transferBytes": 145481
          },
          {
            "resourceType": "script",
            "count": 1,
            "transferBytes": 76425
          },
          {
            "resourceType": "stylesheet",
            "count": 1,
            "transferBytes": 51943
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.barcelona.cat",
            "count": 5,
            "transferBytes": 617951
          },
          {
            "domain": "cdn.matomo.cloud",
            "count": 1,
            "transferBytes": 76425
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Lazy-load offscreen images and media galleries",
            "urgency": "medium",
            "estimatedSavingsBytes": 87108,
            "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": "medium",
            "estimatedSavingsBytes": 54287,
            "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": "Defer non-critical UI modules until after first render",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "strategy": "Keep only above-the-fold resources in the initial path; hydrate or import secondary modules later.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 www.barcelona.cat",
            "urgency": "medium",
            "estimatedSavingsBytes": 213325,
            "strategy": "Serve a smaller placeholder first and load this asset only when the user scrolls to or requests the component.",
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_platges/public/platges/552233113111414.jpg?itok=vcwjn_Ho",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 www.barcelona.cat",
            "urgency": "medium",
            "estimatedSavingsBytes": 90561,
            "strategy": "Subset or defer this font so full font payloads are only fetched when needed.",
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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": "10.9 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: 10.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,
          "displayValue": "Est savings of 53 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 53 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,
          "displayValue": "Est savings of 81 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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 81 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,
          "displayValue": "Est savings of 434 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 434 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": "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 85 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 85 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": "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": 0,
          "displayValue": "Est savings of 1,590 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 Eliminate render-blocking resources\n\n- Lighthouse audit: render-blocking-resources\n- Current value: Est savings of 1,590 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\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": "server-response-time",
          "title": "Reduce initial server response time",
          "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": 0,
          "displayValue": "Root document took 670 ms",
          "impact": "high",
          "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 Reduce initial server response time\n\n- Lighthouse audit: server-response-time\n- Current value: Root document took 670 ms\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": "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,
          "displayValue": "1,060 elements",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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: 1,060 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"
        },
        {
          "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": 0.77,
          "displayValue": "4.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 Speed Index\n\n- Lighthouse audit: speed-index\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\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"
        }
      ]
    },
    {
      "url": "https://barcelona.cat/en/discoverbcn/ciutadella-knowledge-hub/heritage-and-science-hub",
      "status": "ok",
      "finalUrl": "https://www.barcelona.cat/en/discoverbcn/ciutadella-knowledge-hub/heritage-and-science-hub",
      "performanceScore": 0.39,
      "bestPracticesScore": 1,
      "transferBytes": 3105127,
      "co2Grams": 1.1895163983378003,
      "greenWeb": {
        "page": {
          "hostname": "www.barcelona.cat",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-13T22:38:00.231825",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.barcelona.cat",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76425,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31745,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "stylesheet",
            "requestCount": 1,
            "transferBytes": 24654,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15565,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7144,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 4111,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/css/bcn-avisos.css",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "fonts.googleapis.com",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 2479,
            "sampleUrl": "https://fonts.googleapis.com/css?family=Source+Sans+3:200,200i,300,300i,400,400i,500,500i,600,600i,700,700i,900,900i",
            "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
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=5aX60q&url=https%3A%2F%2Fwww.barcelona.cat%2Fen%2Fdiscoverbcn%2Fciutadella-knowledge-hub%2Fheritage-and-science-hub",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 10,
          "greenCount": 4,
          "notGreenCount": 7,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 60,
        "urgency": "high",
        "pageElementOccurrences": 1,
        "uniqueElementsAssessed": 1,
        "reusedFromCacheCount": 1,
        "components": [
          {
            "signature": "form|get|/en|input|text|query|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "text",
            "fieldName": "query",
            "formContext": "form|get|/en",
            "hasLabel": true,
            "hasValidationRule": false,
            "hasErrorMessagingHook": false,
            "toolingFriendly": false,
            "assessment": {
              "score": 60,
              "urgency": "high",
              "issues": [
                "No explicit validation rule",
                "No error messaging hook",
                "Missing autocomplete for tooling support"
              ],
              "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.",
                "Provide meaningful autocomplete values to support browsers and assistive tooling."
              ]
            },
            "reusedFromCache": true
          }
        ],
        "recommendations": [
          {
            "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."
          },
          {
            "title": "Missing autocomplete for tooling support",
            "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": "Heritage and Scientific Hub | La Ciutadella Knowledge Hub | Barcelona City Council",
          "lang": "en",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "The south side of the Parc de la Ciutadella is home to the most emblematic buildings of the park, which form a hub of high heritage value that will reinforce its scientific and cultural uses.",
          "robots": "",
          "canonical": "https://www.barcelona.cat/en/discoverbcn/ciutadella-knowledge-hub/heritage-and-science-hub",
          "ogTitle": "Heritage and Scientific Hub | La Ciutadella Knowledge Hub | Barcelona City Council",
          "ogDescription": "The south side of the Parc de la Ciutadella is home to the most emblematic buildings of the park, which form a hub of high heritage value that will reinforce its scientific and cultural uses.",
          "ogType": "Web",
          "ogUrl": "https://www.barcelona.cat/en/discoverbcn/ciutadella-knowledge-hub/heritage-and-science-hub",
          "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": 34,
        "urgency": "medium",
        "checks": {
          "testedMobile": true,
          "testedTablet": true,
          "horizontalOverflowOnMobile": false,
          "horizontalOverflowOnTablet": false,
          "mobileSmallTapTargets": 44,
          "tabletSmallTapTargets": 35,
          "fixedWidthOffenders": 2,
          "oversizedMedia": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 1,
            "smallTapTargets": 44,
            "oversizedMedia": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 1,
            "smallTapTargets": 35,
            "oversizedMedia": 0
          }
        ],
        "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 35 on tablet."
          },
          {
            "title": "Refactor fixed-width components",
            "urgency": "medium",
            "detail": "2 element(s) exceeded viewport width in tested layouts; use responsive component constraints."
          }
        ]
      },
      "securityLight": {
        "score": 59,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": true,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": true,
          "externalScriptCount": 7,
          "externalScriptsWithoutIntegrity": 7,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "cache-control": "max-age=300, public",
            "content-encoding": "gzip",
            "content-language": "en",
            "content-length": "14618",
            "content-type": "text/html; charset=UTF-8",
            "date": "Mon, 13 Apr 2026 22:50:13 GMT",
            "etag": "\"1776120613-gzip\"",
            "expires": "Sun, 19 Nov 1978 05:00:00 GMT",
            "last-modified": "Mon, 13 Apr 2026 22:50:13 GMT",
            "server": "nginx",
            "vary": "Cookie,Accept-Encoding",
            "via": "1.1 ca2190123e61f1744d1210c24c87c840.cloudfront.net (CloudFront)",
            "x-amz-cf-id": "4osyyoG-xQr1hwU8uLvdc3yZjpyE0XRAV0BdwGfq6sPIn_4wMKB0rQ==",
            "x-amz-cf-pop": "IAD12-P5",
            "x-cache": "Miss from cloudfront",
            "x-content-type-options": "nosniff",
            "x-frame-options": "SAMEORIGIN",
            "x-generator": "Drupal 10 (https://www.drupal.org)"
          },
          "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": "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": "7 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 25,
        "urgency": "low",
        "origin": "https://www.barcelona.cat",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://www.barcelona.cat/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/sitemap.xml",
            "found": true,
            "status": 200,
            "contentType": "application/xml; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/manifest.webmanifest",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/favicon.ico",
            "found": true,
            "status": 200,
            "contentType": "image/x-icon"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "low",
            "detail": "Missing beneficial file(s): /.well-known/security.txt, /manifest.webmanifest."
          }
        ]
      },
      "mediaHints": {
        "score": 20,
        "urgency": "low",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 33,
          "imagesWithLazy": 22,
          "imagesWithoutLazy": 11
        },
        "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."
          }
        ]
      },
      "wsgCustom": {
        "score": 85,
        "urgency": "medium",
        "data": {
          "hasPrintStyles": true,
          "hasReducedMotion": true,
          "media": {
            "totalImages": 38,
            "lazyImages": 23,
            "totalIframes": 1,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "\"Source Sans Pro\", \"Helvetica Neue\", Helvetica, Arial, sans-serif",
            "usesSystemFont": true
          },
          "tracking": {
            "count": 0,
            "scripts": []
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 23/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": "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"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 100,
        "urgency": "high",
        "totalEstimatedSavingsBytes": 3572424.35,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Use modern image compression formats",
            "urgency": "high",
            "estimatedSavingsBytes": 1947613.35,
            "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": 1624811,
            "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: 1.86 MB."
          },
          {
            "title": "Improve image encoding quality/size",
            "urgency": "high",
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 1.55 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": 4051928.35,
        "totalEstimatedBlockingMs": 1662,
        "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": 1947613.35,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 1,902 KiB",
            "urgency": "high",
            "sourceAuditId": "modern-image-formats"
          },
          {
            "id": "uses-optimized-images",
            "title": "Compress oversized image assets",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss.",
            "estimatedSavingsBytes": 1624811,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 1,587 KiB",
            "urgency": "high",
            "sourceAuditId": "uses-optimized-images"
          },
          {
            "id": "uses-responsive-images",
            "title": "Right-size images for viewport",
            "detail": "Avoid sending larger images than the rendered size needs.",
            "estimatedSavingsBytes": 254564,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 249 KiB",
            "urgency": "high",
            "sourceAuditId": "uses-responsive-images"
          },
          {
            "id": "render-blocking-resources",
            "title": "Eliminate render-blocking resources",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering.",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1662,
            "displayValue": "Est savings of 1,660 ms",
            "urgency": "high",
            "sourceAuditId": "render-blocking-resources"
          },
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 87109,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 85 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": 83082,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 81 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-css-rules"
          },
          {
            "id": "unused-javascript",
            "title": "Remove unused JavaScript",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code.",
            "estimatedSavingsBytes": 54749,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 53 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-javascript"
          }
        ],
        "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.86 MB."
          },
          {
            "title": "Compress oversized image assets",
            "urgency": "high",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 1.55 MB."
          },
          {
            "title": "Right-size images for viewport",
            "urgency": "high",
            "detail": "Avoid sending larger images than the rendered size needs. Estimated byte savings: 248.60 KB."
          },
          {
            "title": "Eliminate render-blocking resources",
            "urgency": "high",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering. Estimated render unblocking: 1662 ms."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "medium",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 85.07 KB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "medium",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 81.13 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": 10,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 7,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "7 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": 167991.1772346369
        },
        "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: 164.05 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: 164.05 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": "medium",
        "transferBytes": 3105127,
        "css": {
          "unusedBytes": 83082,
          "ratio": 0.026756393538815,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 54749,
          "duplicatedBytes": 0,
          "ratio": 0.017631807008215768,
          "auditIds": [
            "unused-javascript",
            "duplicated-javascript"
          ]
        },
        "html": {
          "estimatedPenalty": 0.25,
          "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": "high",
            "estimatedSavingsBytes": 83082,
            "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": "medium",
            "estimatedSavingsBytes": 54749,
            "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": 3105127,
        "estimatedDeferrableBytes": 224940,
        "renderBlockingMs": 1662,
        "breakdown": {
          "offscreenImageSavings": 87109,
          "unusedJavascriptSavings": 54749,
          "unusedCssSavings": 83082
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 87109,
            "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": "medium",
            "estimatedSavingsBytes": 54749,
            "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": "high",
            "estimatedSavingsBytes": 83082,
            "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": "Eliminate render-blocking resources",
            "area": "render-path",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1662,
            "strategy": "Defer scripts/styles not required for first paint and preload only truly critical assets.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-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 www.barcelona.cat",
            "area": "image",
            "urgency": "high",
            "estimatedSavingsBytes": 537623,
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_medium/public/exposicions_5_2.jpg?itok=ru8HEyc8",
            "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": 64,
        "urgency": "high",
        "providerCount": 7,
        "requestCount": 8,
        "transferBytes": 139455,
        "notGreenCount": 5,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76425,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31745,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15565,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7144,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=5aX60q&url=https%3A%2F%2Fwww.barcelona.cat%2Fen%2Fdiscoverbcn%2Fciutadella-knowledge-hub%2Fheritage-and-science-hub",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "high",
            "detail": "Track 7 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."
          },
          {
            "title": "Prioritize greener alternatives for third-party providers",
            "urgency": "high",
            "detail": "5 third-party script origin(s) are not confirmed green in the Green Web Foundation dataset."
          }
        ]
      },
      "redundancy": {
        "score": 22,
        "urgency": "medium",
        "transferBytes": 3105127,
        "estimatedRedundantBytes": 137831,
        "redundancyRatio": 0.044388200547030764,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 83082,
            "displayValue": "Est savings of 81 KiB"
          },
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 54749,
            "displayValue": "Est savings of 53 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 83082,
            "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 unused javascript",
            "urgency": "medium",
            "estimatedSavingsBytes": 54749,
            "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 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": 44,
        "urgency": "high",
        "totalTransferBytes": 3105127,
        "heavyRequestCount": 10,
        "heavyBytes": 2529519,
        "heavyRatio": 0.8146265837113909,
        "heavyRequests": [
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_medium/public/exposicions_5_2.jpg?itok=ru8HEyc8",
            "transferSize": 537623,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_medium/public/ciutatvella_20220422_710x379_1.jpg?itok=hbpOvxlq",
            "transferSize": 477919,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_medium/public/_DSC5144pv-719x379%281%29_1.jpg?itok=eetbwlrQ",
            "transferSize": 318965,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_medium/public/ombracle_fachada-710x379.jpg?itok=8FzNNNjW",
            "transferSize": 318168,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_medium/public/martorell_front-710x379.jpg?itok=aTF5YLyE",
            "transferSize": 309497,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_medium/public/Facana_Ciutadella_Martorell-719x379%281%29_1.jpg?itok=SQkThBiY",
            "transferSize": 293508,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "transferSize": 90559,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "transferSize": 76425,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "cdn.matomo.cloud"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament/fonts/icoajuntament.ttf?8aaig7",
            "transferSize": 54921,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/css/css_qDD4BCxE8K-iT7MRORwp32v03DlJblP9-xrYwOBWlQo.css?delta=6&language=en&theme=barcelonacat_theme&include=eJyFz8FuxCAMBNAfCsuhH4QG4ia0DkbYpJu_L9JKW1VitSdbM-8y-OrFcFCxgDOrqH8ch5qXiJaIpSDBgpzUWl5J_dDdmQiP_pWp2MidmX7-A9vpIB9FTK2hhrSWGfhESVeU-6zbWCLYqV2cyzYTOYnDc9dMKOf07ZASqebINDXSRxYURcPHO1CbLDGVMFiDf36B7katgJeKhm0s3tWvrVfw7S-59VJ75Kw7rYteanT4CKVfKxCiTQ&tcut5n",
            "transferSize": 51934,
            "resourceType": "stylesheet",
            "mimeType": "text/css",
            "domain": "www.barcelona.cat"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "image",
            "count": 6,
            "transferBytes": 2255680
          },
          {
            "resourceType": "font",
            "count": 2,
            "transferBytes": 145480
          },
          {
            "resourceType": "script",
            "count": 1,
            "transferBytes": 76425
          },
          {
            "resourceType": "stylesheet",
            "count": 1,
            "transferBytes": 51934
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.barcelona.cat",
            "count": 9,
            "transferBytes": 2453094
          },
          {
            "domain": "cdn.matomo.cloud",
            "count": 1,
            "transferBytes": 76425
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Lazy-load offscreen images and media galleries",
            "urgency": "medium",
            "estimatedSavingsBytes": 87109,
            "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": "medium",
            "estimatedSavingsBytes": 54749,
            "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": "Defer non-critical UI modules until after first render",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "strategy": "Keep only above-the-fold resources in the initial path; hydrate or import secondary modules later.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 www.barcelona.cat",
            "urgency": "high",
            "estimatedSavingsBytes": 537623,
            "strategy": "Serve a smaller placeholder first and load this asset only when the user scrolls to or requests the component.",
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_medium/public/exposicions_5_2.jpg?itok=ru8HEyc8",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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.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: 20.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 53 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 53 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,
          "displayValue": "Est savings of 81 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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 81 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,
          "displayValue": "Est savings of 1,902 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,902 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 1,587 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 1,587 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,
          "displayValue": "Est savings of 85 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 85 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": "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": 0,
          "displayValue": "Est savings of 1,660 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 Eliminate render-blocking resources\n\n- Lighthouse audit: render-blocking-resources\n- Current value: Est savings of 1,660 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\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": "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,
          "displayValue": "1,082 elements",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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: 1,082 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"
        },
        {
          "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": 0.6,
          "displayValue": "5.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 Speed Index\n\n- Lighthouse audit: speed-index\n- Current value: 5.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\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": "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,032 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,032 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://barcelona.cat/es/que-hacer-en-bcn/cultura/teatros",
      "status": "ok",
      "finalUrl": "https://www.barcelona.cat/es/que-hacer-en-bcn/cultura/teatros",
      "performanceScore": 0.67,
      "bestPracticesScore": 1,
      "transferBytes": 880046,
      "co2Grams": 0.3371292537444,
      "greenWeb": {
        "page": {
          "hostname": "www.barcelona.cat",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-13T22:38:00.231825",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.barcelona.cat",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76425,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "stylesheet",
            "requestCount": 1,
            "transferBytes": 24654,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "cdnjs.cloudflare.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15867,
            "sampleUrl": "https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js",
            "greenCheck": {
              "hostname": "cdnjs.cloudflare.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:34",
              "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/cdnjs.cloudflare.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15565,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7146,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 4115,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/css/bcn-avisos.css",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "fonts.googleapis.com",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 2482,
            "sampleUrl": "https://fonts.googleapis.com/css?family=Source+Sans+3:200,200i,300,300i,400,400i,500,500i,600,600i,700,700i,900,900i",
            "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
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=k6KnDa&url=https%3A%2F%2Fwww.barcelona.cat%2Fes%2Fque-hacer-en-bcn%2Fcultura%2Fteatros",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 11,
          "greenCount": 5,
          "notGreenCount": 7,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 75,
        "urgency": "high",
        "pageElementOccurrences": 7,
        "uniqueElementsAssessed": 2,
        "reusedFromCacheCount": 2,
        "components": [
          {
            "signature": "form|get|/es/|input|text|query|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "text",
            "fieldName": "query",
            "formContext": "form|get|/es/",
            "hasLabel": true,
            "hasValidationRule": false,
            "hasErrorMessagingHook": false,
            "toolingFriendly": false,
            "assessment": {
              "score": 60,
              "urgency": "high",
              "issues": [
                "No explicit validation rule",
                "No error messaging hook",
                "Missing autocomplete for tooling support"
              ],
              "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.",
                "Provide meaningful autocomplete values to support browsers and assistive tooling."
              ]
            },
            "reusedFromCache": true
          },
          {
            "signature": "no-form|select|select|anonymous|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "select",
            "fieldName": null,
            "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": "No explicit validation rule",
            "urgency": "medium",
            "detail": "2 unique form control signature(s) on this page include this issue."
          },
          {
            "title": "No error messaging hook",
            "urgency": "medium",
            "detail": "2 unique form control signature(s) on this page include this issue."
          },
          {
            "title": "Missing autocomplete for tooling support",
            "urgency": "medium",
            "detail": "1 unique form control signature(s) on this page include this issue."
          },
          {
            "title": "Missing associated label",
            "urgency": "high",
            "detail": "1 unique form control signature(s) on this page include this issue."
          }
        ]
      },
      "metadata": {
        "score": 25,
        "urgency": "low",
        "checks": {
          "hasTitle": true,
          "hasLang": true,
          "hasDescription": false,
          "hasCanonical": true,
          "hasOpenGraphCore": false,
          "hasTwitterCard": true,
          "hasViewport": true,
          "hasCharset": true,
          "hasValidStructuredData": true,
          "hasInvalidStructuredData": false
        },
        "observed": {
          "title": "Teatros | Barcelona.cat | Ajuntament de Barcelona",
          "lang": "es",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "",
          "robots": "",
          "canonical": "https://www.barcelona.cat/es/que-hacer-en-bcn/cultura/teatros",
          "ogTitle": "Teatros",
          "ogDescription": "",
          "ogType": "Web",
          "ogUrl": "https://www.barcelona.cat/es/que-hacer-en-bcn/cultura/teatros",
          "twitterCard": "summary_large_image",
          "ldJsonCount": 0,
          "validLdJsonCount": 0,
          "invalidLdJsonCount": 0
        },
        "recommendations": [
          {
            "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."
          }
        ]
      },
      "layoutAdaptation": {
        "score": 30,
        "urgency": "medium",
        "checks": {
          "testedMobile": true,
          "testedTablet": true,
          "horizontalOverflowOnMobile": false,
          "horizontalOverflowOnTablet": false,
          "mobileSmallTapTargets": 65,
          "tabletSmallTapTargets": 65,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 65,
            "oversizedMedia": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 65,
            "oversizedMedia": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 65 small targets on mobile and 65 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 59,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": true,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": true,
          "externalScriptCount": 8,
          "externalScriptsWithoutIntegrity": 8,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "cache-control": "max-age=300, public",
            "content-encoding": "gzip",
            "content-language": "es",
            "content-length": "11891",
            "content-type": "text/html; charset=UTF-8",
            "date": "Mon, 13 Apr 2026 22:50:28 GMT",
            "etag": "\"1776120627-gzip\"",
            "expires": "Sun, 19 Nov 1978 05:00:00 GMT",
            "last-modified": "Mon, 13 Apr 2026 22:50:27 GMT",
            "server": "nginx",
            "vary": "Cookie,Accept-Encoding",
            "via": "1.1 ca2190123e61f1744d1210c24c87c840.cloudfront.net (CloudFront)",
            "x-amz-cf-id": "ZBkbBoaT6bzTjqiPMqbq1838FZWQfUmd3s3BpCqc6LxeMs1xPH9PDg==",
            "x-amz-cf-pop": "IAD12-P5",
            "x-cache": "Miss from cloudfront",
            "x-content-type-options": "nosniff",
            "x-frame-options": "SAMEORIGIN",
            "x-generator": "Drupal 10 (https://www.drupal.org)"
          },
          "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": "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": "8 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 25,
        "urgency": "low",
        "origin": "https://www.barcelona.cat",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://www.barcelona.cat/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/sitemap.xml",
            "found": true,
            "status": 200,
            "contentType": "application/xml; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/manifest.webmanifest",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/favicon.ico",
            "found": true,
            "status": 200,
            "contentType": "image/x-icon"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "low",
            "detail": "Missing beneficial file(s): /.well-known/security.txt, /manifest.webmanifest."
          }
        ]
      },
      "mediaHints": {
        "score": 50,
        "urgency": "medium",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 21,
          "imagesWithLazy": 0,
          "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 21 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 85,
        "urgency": "medium",
        "data": {
          "hasPrintStyles": true,
          "hasReducedMotion": true,
          "media": {
            "totalImages": 26,
            "lazyImages": 1,
            "totalIframes": 1,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "\"Source Sans Pro\", \"Helvetica Neue\", Helvetica, Arial, sans-serif",
            "usesSystemFont": true
          },
          "tracking": {
            "count": 0,
            "scripts": []
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 1/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": "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"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 20,
        "urgency": "low",
        "totalEstimatedSavingsBytes": 171803.75,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Use modern image compression formats",
            "urgency": "medium",
            "estimatedSavingsBytes": 96924.75,
            "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size."
          },
          {
            "id": "uses-optimized-images",
            "title": "Improve image encoding quality/size",
            "urgency": "medium",
            "estimatedSavingsBytes": 74879,
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings."
          }
        ],
        "recommendations": [
          {
            "title": "Use modern image compression formats",
            "urgency": "medium",
            "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size. Estimated savings: 94.65 KB."
          },
          {
            "title": "Improve image encoding quality/size",
            "urgency": "medium",
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 73.12 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": 416103.75,
        "totalEstimatedBlockingMs": 1032,
        "opportunities": [
          {
            "id": "render-blocking-resources",
            "title": "Eliminate render-blocking resources",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering.",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1032,
            "displayValue": "Est savings of 1,030 ms",
            "urgency": "high",
            "sourceAuditId": "render-blocking-resources"
          },
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 119876,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 117 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": 96924.75,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 95 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": 91943,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 90 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-css-rules"
          },
          {
            "id": "uses-optimized-images",
            "title": "Compress oversized image assets",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss.",
            "estimatedSavingsBytes": 74879,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 73 KiB",
            "urgency": "medium",
            "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": 32481,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 32 KiB",
            "urgency": "low",
            "sourceAuditId": "unused-javascript"
          }
        ],
        "recommendations": [
          {
            "title": "Eliminate render-blocking resources",
            "urgency": "high",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering. Estimated render unblocking: 1032 ms."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "medium",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 117.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: 94.65 KB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "medium",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 89.79 KB."
          },
          {
            "title": "Compress oversized image assets",
            "urgency": "medium",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 73.12 KB."
          },
          {
            "title": "Remove unused JavaScript",
            "urgency": "low",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 31.72 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": 10,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 8,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "8 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": 199790.2709846369
        },
        "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: 195.11 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: 195.11 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": "medium",
        "transferBytes": 880046,
        "css": {
          "unusedBytes": 91943,
          "ratio": 0.10447522061346794,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 32481,
          "duplicatedBytes": 0,
          "ratio": 0.036908297975333106,
          "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": "high",
            "estimatedSavingsBytes": 91943,
            "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": "medium",
            "estimatedSavingsBytes": 32481,
            "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": 880046,
        "estimatedDeferrableBytes": 244300,
        "renderBlockingMs": 1032,
        "breakdown": {
          "offscreenImageSavings": 119876,
          "unusedJavascriptSavings": 32481,
          "unusedCssSavings": 91943
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 119876,
            "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": "medium",
            "estimatedSavingsBytes": 32481,
            "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": "high",
            "estimatedSavingsBytes": 91943,
            "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": "Eliminate render-blocking resources",
            "area": "render-path",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1032,
            "strategy": "Defer scripts/styles not required for first paint and preload only truly critical assets.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-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 www.barcelona.cat",
            "area": "font",
            "urgency": "medium",
            "estimatedSavingsBytes": 90560,
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "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 www.barcelona.cat",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 84136,
            "url": "https://www.barcelona.cat/themes/barcelonacat_theme/images/menu/viula.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 cdn.matomo.cloud",
            "area": "script",
            "urgency": "medium",
            "estimatedSavingsBytes": 76425,
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.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": 65,
        "urgency": "high",
        "providerCount": 8,
        "requestCount": 9,
        "transferBytes": 155325,
        "notGreenCount": 5,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76425,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "cdnjs.cloudflare.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15867,
            "sampleUrl": "https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js",
            "greenCheck": {
              "hostname": "cdnjs.cloudflare.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:34",
              "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/cdnjs.cloudflare.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15565,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7146,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=k6KnDa&url=https%3A%2F%2Fwww.barcelona.cat%2Fes%2Fque-hacer-en-bcn%2Fcultura%2Fteatros",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "high",
            "detail": "Track 8 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."
          },
          {
            "title": "Prioritize greener alternatives for third-party providers",
            "urgency": "high",
            "detail": "5 third-party script origin(s) are not confirmed green in the Green Web Foundation dataset."
          }
        ]
      },
      "redundancy": {
        "score": 18,
        "urgency": "low",
        "transferBytes": 880046,
        "estimatedRedundantBytes": 124424,
        "redundancyRatio": 0.14138351858880105,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 91943,
            "displayValue": "Est savings of 90 KiB"
          },
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 32481,
            "displayValue": "Est savings of 32 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 91943,
            "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 unused javascript",
            "urgency": "medium",
            "estimatedSavingsBytes": 32481,
            "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 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": 20,
        "urgency": "medium",
        "totalTransferBytes": 880046,
        "heavyRequestCount": 4,
        "heavyBytes": 271011,
        "heavyRatio": 0.3079509480186263,
        "heavyRequests": [
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "transferSize": 90560,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "transferSize": 76425,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "cdn.matomo.cloud"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament/fonts/icoajuntament.ttf?8aaig7",
            "transferSize": 54920,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/css/css_evpTRQTawGYS1Ro7RbXq3hBxwat7AU-RJm1V8ZgzeaE.css?delta=5&language=es&theme=barcelonacat_theme&include=eJyFztEOwiAMheEXgnDhA5EDq4gySmiZ7u1dYuJinPGqTf_voriOqpipqseShcW9hkXLBntMI8NNUGo53qh_JzpjFBUT0CMVrohQzwv1nicSt8lhlbls_ZdpSGSXTPdPoBeayQVmFe1oPk71CKTCAcWKriXXdCRyZLv_fSSEx3bzgir-9A-0zibE6jfW4d6bp4dSryhGVlGaXYDQE_H9jbg&tcut5n",
            "transferSize": 49106,
            "resourceType": "stylesheet",
            "mimeType": "text/css",
            "domain": "www.barcelona.cat"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "font",
            "count": 2,
            "transferBytes": 145480
          },
          {
            "resourceType": "script",
            "count": 1,
            "transferBytes": 76425
          },
          {
            "resourceType": "stylesheet",
            "count": 1,
            "transferBytes": 49106
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.barcelona.cat",
            "count": 3,
            "transferBytes": 194586
          },
          {
            "domain": "cdn.matomo.cloud",
            "count": 1,
            "transferBytes": 76425
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Lazy-load offscreen images and media galleries",
            "urgency": "medium",
            "estimatedSavingsBytes": 119876,
            "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": "Defer non-critical UI modules until after first render",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "strategy": "Keep only above-the-fold resources in the initial path; hydrate or import secondary modules later.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 www.barcelona.cat",
            "urgency": "medium",
            "estimatedSavingsBytes": 90560,
            "strategy": "Subset or defer this font so full font payloads are only fetched when needed.",
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 cdn.matomo.cloud",
            "urgency": "medium",
            "estimatedSavingsBytes": 76425,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.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.11,
          "displayValue": "6.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: 6.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-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,
          "displayValue": "Est savings of 90 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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 90 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,
          "displayValue": "Est savings of 95 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 95 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 73 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 73 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,
          "displayValue": "Est savings of 117 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 117 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": "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": 0,
          "displayValue": "Est savings of 1,030 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 Eliminate render-blocking resources\n\n- Lighthouse audit: render-blocking-resources\n- Current value: Est savings of 1,030 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\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": "server-response-time",
          "title": "Reduce initial server response time",
          "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": 0,
          "displayValue": "Root document took 1,050 ms",
          "impact": "high",
          "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 Reduce initial server response time\n\n- Lighthouse audit: server-response-time\n- Current value: Root document took 1,050 ms\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": "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": 0.71,
          "displayValue": "4.6 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 Speed Index\n\n- Lighthouse audit: speed-index\n- Current value: 4.6 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\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": 0.5,
          "displayValue": "Est savings of 32 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 32 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": "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": "1,078 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: 1,078 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://barcelona.cat/capdesetmana/ca/",
      "status": "ok",
      "finalUrl": "https://www.barcelona.cat/capdesetmana/ca",
      "performanceScore": 0.63,
      "bestPracticesScore": 0.82,
      "transferBytes": 1843444,
      "co2Grams": 0.7061891083416001,
      "greenWeb": {
        "page": {
          "hostname": "www.barcelona.cat",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-13T22:38:00.231825",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.barcelona.cat",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "www.bcn.cat",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 33673,
            "sampleUrl": "https://www.bcn.cat/recursos/jquery/jquery-1.11.0.min.js",
            "greenCheck": {
              "hostname": "www.bcn.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:50:55.646337",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.bcn.cat",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "cdnjs.cloudflare.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15867,
            "sampleUrl": "https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js",
            "greenCheck": {
              "hostname": "cdnjs.cloudflare.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:34",
              "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/cdnjs.cloudflare.com",
              "error": null
            }
          },
          {
            "hostname": "www.youtube.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 11061,
            "sampleUrl": "https://www.youtube.com/iframe_api",
            "greenCheck": {
              "hostname": "www.youtube.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2026-01-10T15:09:17",
              "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.youtube.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 3507,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/v1/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "stylesheet",
            "requestCount": 1,
            "transferBytes": 2138,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/css/v1/bcn-avisos.css",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "fonts.googleapis.com",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 1668,
            "sampleUrl": "https://fonts.googleapis.com/css2?family=Source+Sans+3:ital,wght@0,200..900;1,200..900",
            "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": 8,
          "greenCount": 4,
          "notGreenCount": 5,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 73.33333333333333,
        "urgency": "high",
        "pageElementOccurrences": 8,
        "uniqueElementsAssessed": 6,
        "reusedFromCacheCount": 2,
        "components": [
          {
            "signature": "form|get|/ca|input|text|query|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "text",
            "fieldName": "query",
            "formContext": "form|get|/ca",
            "hasLabel": true,
            "hasValidationRule": false,
            "hasErrorMessagingHook": false,
            "toolingFriendly": false,
            "assessment": {
              "score": 60,
              "urgency": "high",
              "issues": [
                "No explicit validation rule",
                "No error messaging hook",
                "Missing autocomplete for tooling support"
              ],
              "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.",
                "Provide meaningful autocomplete values to support browsers and assistive tooling."
              ]
            },
            "reusedFromCache": true
          },
          {
            "signature": "form|get|/capdesetmana/ca/llistat|input|text|q|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "text",
            "fieldName": "q",
            "formContext": "form|get|/capdesetmana/ca/llistat",
            "hasLabel": true,
            "hasValidationRule": false,
            "hasErrorMessagingHook": false,
            "toolingFriendly": false,
            "assessment": {
              "score": 60,
              "urgency": "high",
              "issues": [
                "No explicit validation rule",
                "No error messaging hook",
                "Missing autocomplete for tooling support"
              ],
              "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.",
                "Provide meaningful autocomplete values to support browsers and assistive tooling."
              ]
            },
            "reusedFromCache": false
          },
          {
            "signature": "form|get|/capdesetmana/ca/llistat|select|select|districtstr|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "select",
            "fieldName": "districtstr",
            "formContext": "form|get|/capdesetmana/ca/llistat",
            "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
          },
          {
            "signature": "form|get|/capdesetmana/ca/llistat|select|select|ctg|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "select",
            "fieldName": "ctg",
            "formContext": "form|get|/capdesetmana/ca/llistat",
            "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
          },
          {
            "signature": "form|get|/capdesetmana/ca/llistat|select|select|ticket|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "select",
            "fieldName": "ticket",
            "formContext": "form|get|/capdesetmana/ca/llistat",
            "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
          },
          {
            "signature": "form|get|self|input|checkbox|anonymous|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "checkbox",
            "fieldName": null,
            "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": 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."
          },
          {
            "title": "Missing associated label",
            "urgency": "high",
            "detail": "3 unique form control signature(s) on this page include this issue."
          },
          {
            "title": "Missing autocomplete for tooling support",
            "urgency": "medium",
            "detail": "2 unique form control signature(s) on this page include this issue."
          }
        ]
      },
      "metadata": {
        "score": 30,
        "urgency": "medium",
        "checks": {
          "hasTitle": true,
          "hasLang": true,
          "hasDescription": false,
          "hasCanonical": true,
          "hasOpenGraphCore": false,
          "hasTwitterCard": false,
          "hasViewport": true,
          "hasCharset": true,
          "hasValidStructuredData": true,
          "hasInvalidStructuredData": false
        },
        "observed": {
          "title": "Cap de setmana BCN | Ajuntament de Barcelona",
          "lang": "ca",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "",
          "robots": "",
          "canonical": "https://www.barcelona.cat/capdesetmana/ca",
          "ogTitle": "",
          "ogDescription": "",
          "ogType": "",
          "ogUrl": "",
          "twitterCard": "",
          "ldJsonCount": 0,
          "validLdJsonCount": 0,
          "invalidLdJsonCount": 0
        },
        "recommendations": [
          {
            "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": 30,
        "urgency": "medium",
        "checks": {
          "testedMobile": true,
          "testedTablet": true,
          "horizontalOverflowOnMobile": false,
          "horizontalOverflowOnTablet": false,
          "mobileSmallTapTargets": 38,
          "tabletSmallTapTargets": 36,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 38,
            "oversizedMedia": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 36,
            "oversizedMedia": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 38 small targets on mobile and 36 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 59,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": true,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": true,
          "externalScriptCount": 5,
          "externalScriptsWithoutIntegrity": 5,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "cache-control": "max-age=300, public",
            "content-encoding": "gzip",
            "content-language": "ca",
            "content-length": "9481",
            "content-type": "text/html; charset=UTF-8",
            "date": "Mon, 13 Apr 2026 22:50:43 GMT",
            "etag": "\"1776120642-gzip\"",
            "expires": "Sun, 19 Nov 1978 05:00:00 GMT",
            "last-modified": "Mon, 13 Apr 2026 22:50:42 GMT",
            "server": "nginx",
            "vary": "Cookie,Accept-Encoding",
            "via": "1.1 ca2190123e61f1744d1210c24c87c840.cloudfront.net (CloudFront)",
            "x-amz-cf-id": "QayX-dWUC2cbD8J6r3vxHBge79Fsj-I1hY3TTT69iCXtL9aTn0sB7Q==",
            "x-amz-cf-pop": "IAD12-P5",
            "x-cache": "Miss from cloudfront",
            "x-content-type-options": "nosniff",
            "x-frame-options": "SAMEORIGIN",
            "x-generator": "Drupal 10 (https://www.drupal.org)"
          },
          "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": "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": "5 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 25,
        "urgency": "low",
        "origin": "https://www.barcelona.cat",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://www.barcelona.cat/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/sitemap.xml",
            "found": true,
            "status": 200,
            "contentType": "application/xml; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/manifest.webmanifest",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/favicon.ico",
            "found": true,
            "status": 200,
            "contentType": "image/x-icon"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "low",
            "detail": "Missing beneficial file(s): /.well-known/security.txt, /manifest.webmanifest."
          }
        ]
      },
      "mediaHints": {
        "score": 50,
        "urgency": "medium",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 22,
          "imagesWithLazy": 0,
          "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 22 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 85,
        "urgency": "medium",
        "data": {
          "hasPrintStyles": true,
          "hasReducedMotion": true,
          "media": {
            "totalImages": 26,
            "lazyImages": 1,
            "totalIframes": 2,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "\"Source Sans 3\", sans-serif",
            "usesSystemFont": true
          },
          "tracking": {
            "count": 0,
            "scripts": []
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 1/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": "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"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 43,
        "urgency": "medium",
        "totalEstimatedSavingsBytes": 791730.0499999999,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Use modern image compression formats",
            "urgency": "high",
            "estimatedSavingsBytes": 610936.0499999999,
            "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": 172877,
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings."
          },
          {
            "id": "unminified-javascript",
            "title": "Minify JavaScript before transfer",
            "urgency": "low",
            "estimatedSavingsBytes": 7917,
            "detail": "Minify JS bundles so transport compression produces better results with fewer bytes."
          }
        ],
        "recommendations": [
          {
            "title": "Use modern image compression formats",
            "urgency": "high",
            "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size. Estimated savings: 596.62 KB."
          },
          {
            "title": "Improve image encoding quality/size",
            "urgency": "high",
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 168.83 KB."
          },
          {
            "title": "Minify JavaScript before transfer",
            "urgency": "low",
            "detail": "Minify JS bundles so transport compression produces better results with fewer bytes. Estimated savings: 7.73 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": 1129698.0499999998,
        "totalEstimatedBlockingMs": 1294,
        "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": 610936.0499999999,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 597 KiB",
            "urgency": "high",
            "sourceAuditId": "modern-image-formats"
          },
          {
            "id": "render-blocking-resources",
            "title": "Eliminate render-blocking resources",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering.",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1294,
            "displayValue": "Est savings of 1,290 ms",
            "urgency": "high",
            "sourceAuditId": "render-blocking-resources"
          },
          {
            "id": "uses-optimized-images",
            "title": "Compress oversized image assets",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss.",
            "estimatedSavingsBytes": 172877,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 169 KiB",
            "urgency": "medium",
            "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": 122575,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 120 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-css-rules"
          },
          {
            "id": "unused-javascript",
            "title": "Remove unused JavaScript",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code.",
            "estimatedSavingsBytes": 76281,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 74 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-javascript"
          },
          {
            "id": "uses-responsive-images",
            "title": "Right-size images for viewport",
            "detail": "Avoid sending larger images than the rendered size needs.",
            "estimatedSavingsBytes": 72929,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 71 KiB",
            "urgency": "medium",
            "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": 66183,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 65 KiB",
            "urgency": "medium",
            "sourceAuditId": "offscreen-images"
          },
          {
            "id": "unminified-javascript",
            "title": "Minify JavaScript",
            "detail": "Use minified production JS output to reduce payload size.",
            "estimatedSavingsBytes": 7917,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 8 KiB",
            "urgency": "low",
            "sourceAuditId": "unminified-javascript"
          }
        ],
        "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: 596.62 KB."
          },
          {
            "title": "Eliminate render-blocking resources",
            "urgency": "high",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering. Estimated render unblocking: 1294 ms."
          },
          {
            "title": "Compress oversized image assets",
            "urgency": "medium",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 168.83 KB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "medium",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 119.70 KB."
          },
          {
            "title": "Remove unused JavaScript",
            "urgency": "medium",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 74.49 KB."
          },
          {
            "title": "Right-size images for viewport",
            "urgency": "medium",
            "detail": "Avoid sending larger images than the rendered size needs. Estimated byte savings: 71.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": 10,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 5,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "5 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": 788946.1528514898
        },
        "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: 770.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: 770.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": "medium",
        "transferBytes": 1843444,
        "css": {
          "unusedBytes": 122575,
          "ratio": 0.06649239141519894,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 76281,
          "duplicatedBytes": 0,
          "ratio": 0.04137961337583349,
          "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": "high",
            "estimatedSavingsBytes": 122575,
            "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": 76281,
            "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": 1843444,
        "estimatedDeferrableBytes": 265039,
        "renderBlockingMs": 1294,
        "breakdown": {
          "offscreenImageSavings": 66183,
          "unusedJavascriptSavings": 76281,
          "unusedCssSavings": 122575
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 66183,
            "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": "medium",
            "estimatedSavingsBytes": 76281,
            "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": "high",
            "estimatedSavingsBytes": 122575,
            "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": "Eliminate render-blocking resources",
            "area": "render-path",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1294,
            "strategy": "Defer scripts/styles not required for first paint and preload only truly critical assets.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-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 www.barcelona.cat",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 142891,
            "url": "https://www.barcelona.cat/capdesetmana/sites/default/files/2024-02/capcalera.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 font from www.barcelona.cat",
            "area": "font",
            "urgency": "medium",
            "estimatedSavingsBytes": 90560,
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "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 stylesheet from www.barcelona.cat",
            "area": "stylesheet",
            "urgency": "medium",
            "estimatedSavingsBytes": 89682,
            "url": "https://www.barcelona.cat/capdesetmana/sites/default/files/css/css_WTao0bwzGSGB1e9gRT5NEHUTFgwaE4nwCHUoCQqmdOI.css?delta=2&language=ca&theme=minerva_subtheme&include=eJx1j1FOxDAMRC_U3XxwoGiSmjbgOFFsA709kVZsRRF_1nuyPYM3F0MlsYhsDi4GCyu9wtl0wak3LwgrjHrJ7zT-qp-dlCUmjIHwnCJ9GQ0BL7UIjQ9E9WQ7VQrZ1Vq9qR1cZHv6h0ytmdpAv_Dc5u-Z4TfduCXwP6dKbrcz8kUqz05X1nxkigrR-HJxnzh6KzLLdgxsM-CuYR3ewfeT3F26Jy6607rooUY1JCh9A8ezk4A",
            "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 estatics-nasia.dtibcn.cat",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 85081,
            "url": "https://estatics-nasia.dtibcn.cat/nasia-pro/media/estunen.570x321.792fd017.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": 57,
        "urgency": "medium",
        "providerCount": 6,
        "requestCount": 7,
        "transferBytes": 98715,
        "notGreenCount": 3,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "www.bcn.cat",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 33673,
            "sampleUrl": "https://www.bcn.cat/recursos/jquery/jquery-1.11.0.min.js",
            "greenCheck": {
              "hostname": "www.bcn.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:50:55.646337",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.bcn.cat",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "cdnjs.cloudflare.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15867,
            "sampleUrl": "https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js",
            "greenCheck": {
              "hostname": "cdnjs.cloudflare.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:34",
              "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/cdnjs.cloudflare.com",
              "error": null
            }
          },
          {
            "hostname": "www.youtube.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 11061,
            "sampleUrl": "https://www.youtube.com/iframe_api",
            "greenCheck": {
              "hostname": "www.youtube.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2026-01-10T15:09:17",
              "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.youtube.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 3507,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/v1/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "medium",
            "detail": "Track 6 third-party script origin(s) and assign an owner plus business justification for each."
          },
          {
            "title": "Reduce third-party script payload and requests",
            "urgency": "medium",
            "detail": "Defer non-critical tags, remove unused vendors, and gate scripts behind consent or user interaction."
          },
          {
            "title": "Prioritize greener alternatives for third-party providers",
            "urgency": "high",
            "detail": "3 third-party script origin(s) are not confirmed green in the Green Web Foundation dataset."
          }
        ]
      },
      "redundancy": {
        "score": 18,
        "urgency": "medium",
        "transferBytes": 1843444,
        "estimatedRedundantBytes": 198856,
        "redundancyRatio": 0.10787200479103244,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 122575,
            "displayValue": "Est savings of 120 KiB"
          },
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 76281,
            "displayValue": "Est savings of 74 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 122575,
            "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 unused javascript",
            "urgency": "medium",
            "estimatedSavingsBytes": 76281,
            "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 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": 14,
        "urgency": "medium",
        "totalTransferBytes": 1843444,
        "heavyRequestCount": 4,
        "heavyBytes": 378053,
        "heavyRatio": 0.20507973119877793,
        "heavyRequests": [
          {
            "url": "https://www.barcelona.cat/capdesetmana/sites/default/files/2024-02/capcalera.jpg",
            "transferSize": 142891,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "transferSize": 90560,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/capdesetmana/sites/default/files/css/css_WTao0bwzGSGB1e9gRT5NEHUTFgwaE4nwCHUoCQqmdOI.css?delta=2&language=ca&theme=minerva_subtheme&include=eJx1j1FOxDAMRC_U3XxwoGiSmjbgOFFsA709kVZsRRF_1nuyPYM3F0MlsYhsDi4GCyu9wtl0wak3LwgrjHrJ7zT-qp-dlCUmjIHwnCJ9GQ0BL7UIjQ9E9WQ7VQrZ1Vq9qR1cZHv6h0ytmdpAv_Dc5u-Z4TfduCXwP6dKbrcz8kUqz05X1nxkigrR-HJxnzh6KzLLdgxsM-CuYR3ewfeT3F26Jy6607rooUY1JCh9A8ezk4A",
            "transferSize": 89682,
            "resourceType": "stylesheet",
            "mimeType": "text/css",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament/fonts/icoajuntament.ttf?8aaig7",
            "transferSize": 54920,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "font",
            "count": 2,
            "transferBytes": 145480
          },
          {
            "resourceType": "image",
            "count": 1,
            "transferBytes": 142891
          },
          {
            "resourceType": "stylesheet",
            "count": 1,
            "transferBytes": 89682
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.barcelona.cat",
            "count": 4,
            "transferBytes": 378053
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Lazy-load offscreen images and media galleries",
            "urgency": "medium",
            "estimatedSavingsBytes": 66183,
            "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": "medium",
            "estimatedSavingsBytes": 76281,
            "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": "Defer non-critical UI modules until after first render",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "strategy": "Keep only above-the-fold resources in the initial path; hydrate or import secondary modules later.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 www.barcelona.cat",
            "urgency": "medium",
            "estimatedSavingsBytes": 142891,
            "strategy": "Serve a smaller placeholder first and load this asset only when the user scrolls to or requests the component.",
            "url": "https://www.barcelona.cat/capdesetmana/sites/default/files/2024-02/capcalera.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 font asset from www.barcelona.cat",
            "urgency": "medium",
            "estimatedSavingsBytes": 90560,
            "strategy": "Subset or defer this font so full font payloads are only fetched when needed.",
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 stylesheet asset from www.barcelona.cat",
            "urgency": "medium",
            "estimatedSavingsBytes": 89682,
            "strategy": "Split this stylesheet so component-specific CSS is delivered only when the component is rendered.",
            "url": "https://www.barcelona.cat/capdesetmana/sites/default/files/css/css_WTao0bwzGSGB1e9gRT5NEHUTFgwaE4nwCHUoCQqmdOI.css?delta=2&language=ca&theme=minerva_subtheme&include=eJx1j1FOxDAMRC_U3XxwoGiSmjbgOFFsA709kVZsRRF_1nuyPYM3F0MlsYhsDi4GCyu9wtl0wak3LwgrjHrJ7zT-qp-dlCUmjIHwnCJ9GQ0BL7UIjQ9E9WQ7VQrZ1Vq9qR1cZHv6h0ytmdpAv_Dc5u-Z4TfduCXwP6dKbrcz8kUqz05X1nxkigrR-HJxnzh6KzLLdgxsM-CuYR3ewfeT3F26Jy6607rooUY1JCh9A8ezk4A",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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": "9.9 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: 9.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": "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": 0.36,
          "displayValue": "6.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 Speed Index\n\n- Lighthouse audit: speed-index\n- Current value: 6.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\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": 0,
          "displayValue": "Est savings of 74 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 74 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,
          "displayValue": "Est savings of 120 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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 120 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,
          "displayValue": "Est savings of 597 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 597 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 169 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 169 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": "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": 0,
          "displayValue": "Est savings of 1,290 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 Eliminate render-blocking resources\n\n- Lighthouse audit: render-blocking-resources\n- Current value: Est savings of 1,290 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\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": "server-response-time",
          "title": "Reduce initial server response time",
          "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": 0,
          "displayValue": "Root document took 1,130 ms",
          "impact": "high",
          "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 Reduce initial server response time\n\n- Lighthouse audit: server-response-time\n- Current value: Root document took 1,130 ms\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": "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 65 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 65 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": "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": "984 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: 984 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://barcelona.cat/es/vivir-en-bcn/diada",
      "status": "ok",
      "finalUrl": "https://www.barcelona.cat/es/vivir-en-bcn/diada",
      "performanceScore": 0.64,
      "bestPracticesScore": 1,
      "transferBytes": 1870227,
      "co2Grams": 0.7164491774778001,
      "greenWeb": {
        "page": {
          "hostname": "www.barcelona.cat",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-13T22:38:00.231825",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.barcelona.cat",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76425,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "stylesheet",
            "requestCount": 1,
            "transferBytes": 24654,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15565,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7155,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 4119,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/css/bcn-avisos.css",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2860,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "fonts.googleapis.com",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 2479,
            "sampleUrl": "https://fonts.googleapis.com/css?family=Source+Sans+3:200,200i,300,300i,400,400i,500,500i,600,600i,700,700i,900,900i",
            "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
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=YVs6Ob&url=https%3A%2F%2Fwww.barcelona.cat%2Fes%2Fvivir-en-bcn%2Fdiada",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 10,
          "greenCount": 4,
          "notGreenCount": 7,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 60,
        "urgency": "high",
        "pageElementOccurrences": 1,
        "uniqueElementsAssessed": 1,
        "reusedFromCacheCount": 1,
        "components": [
          {
            "signature": "form|get|/es/|input|text|query|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "text",
            "fieldName": "query",
            "formContext": "form|get|/es/",
            "hasLabel": true,
            "hasValidationRule": false,
            "hasErrorMessagingHook": false,
            "toolingFriendly": false,
            "assessment": {
              "score": 60,
              "urgency": "high",
              "issues": [
                "No explicit validation rule",
                "No error messaging hook",
                "Missing autocomplete for tooling support"
              ],
              "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.",
                "Provide meaningful autocomplete values to support browsers and assistive tooling."
              ]
            },
            "reusedFromCache": true
          }
        ],
        "recommendations": [
          {
            "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."
          },
          {
            "title": "Missing autocomplete for tooling support",
            "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": "Diada 2025 | Web de Barcelona | Ayuntamiento de Barcelona",
          "lang": "es",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "Actos, actividades, puertas abiertas, manifestaciones, afectaciones al tráfico y transporte público y recomendaciones de movilidad en Barcelona durante el 11 de setiembre, la Diada Nacional de Cataluña 2025.",
          "robots": "",
          "canonical": "https://www.barcelona.cat/es/vivir-en-bcn/diada",
          "ogTitle": "Diada 2025 | Web de Barcelona | Ayuntamiento de Barcelona",
          "ogDescription": "Actos, actividades, puertas abiertas, manifestaciones, afectaciones al tráfico y transporte público y recomendaciones de movilidad en Barcelona durante el 11 de setiembre, la Diada Nacional de Cataluña 2025.",
          "ogType": "Web",
          "ogUrl": "https://www.barcelona.cat/es/vivir-en-bcn/diada",
          "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": 41,
          "tabletSmallTapTargets": 38,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 41,
            "oversizedMedia": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 38,
            "oversizedMedia": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 41 small targets on mobile and 38 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 59,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": true,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": true,
          "externalScriptCount": 7,
          "externalScriptsWithoutIntegrity": 7,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "cache-control": "max-age=300, public",
            "content-encoding": "gzip",
            "content-language": "es",
            "content-length": "12052",
            "content-type": "text/html; charset=UTF-8",
            "date": "Mon, 13 Apr 2026 22:51:00 GMT",
            "etag": "\"1776120660-gzip\"",
            "expires": "Sun, 19 Nov 1978 05:00:00 GMT",
            "last-modified": "Mon, 13 Apr 2026 22:51:00 GMT",
            "server": "nginx",
            "vary": "Cookie,Accept-Encoding",
            "via": "1.1 ca2190123e61f1744d1210c24c87c840.cloudfront.net (CloudFront)",
            "x-amz-cf-id": "vRS-s-_qjdT7R5EvnVGsbNtYAkJWmOrNktq0Xufx8iRLHUWgyTrI7w==",
            "x-amz-cf-pop": "IAD12-P5",
            "x-cache": "Miss from cloudfront",
            "x-content-type-options": "nosniff",
            "x-frame-options": "SAMEORIGIN",
            "x-generator": "Drupal 10 (https://www.drupal.org)"
          },
          "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": "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": "7 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 25,
        "urgency": "low",
        "origin": "https://www.barcelona.cat",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://www.barcelona.cat/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/sitemap.xml",
            "found": true,
            "status": 200,
            "contentType": "application/xml; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/manifest.webmanifest",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/favicon.ico",
            "found": true,
            "status": 200,
            "contentType": "image/x-icon"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "low",
            "detail": "Missing beneficial file(s): /.well-known/security.txt, /manifest.webmanifest."
          }
        ]
      },
      "mediaHints": {
        "score": 23,
        "urgency": "low",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 22,
          "imagesWithLazy": 10,
          "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 22 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 85,
        "urgency": "medium",
        "data": {
          "hasPrintStyles": true,
          "hasReducedMotion": true,
          "media": {
            "totalImages": 27,
            "lazyImages": 11,
            "totalIframes": 1,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "\"Source Sans Pro\", \"Helvetica Neue\", Helvetica, Arial, sans-serif",
            "usesSystemFont": true
          },
          "tracking": {
            "count": 0,
            "scripts": []
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 11/27 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": "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"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 88,
        "urgency": "high",
        "totalEstimatedSavingsBytes": 1640661.8000000003,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Use modern image compression formats",
            "urgency": "high",
            "estimatedSavingsBytes": 909768.8000000002,
            "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": 730893,
            "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: 888.45 KB."
          },
          {
            "title": "Improve image encoding quality/size",
            "urgency": "high",
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 713.76 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": 1786650.8000000003,
        "totalEstimatedBlockingMs": 876,
        "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": 909768.8000000002,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 888 KiB",
            "urgency": "high",
            "sourceAuditId": "modern-image-formats"
          },
          {
            "id": "uses-optimized-images",
            "title": "Compress oversized image assets",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss.",
            "estimatedSavingsBytes": 730893,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 714 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": 83960,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 82 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-css-rules"
          },
          {
            "id": "unused-javascript",
            "title": "Remove unused JavaScript",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code.",
            "estimatedSavingsBytes": 54127,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 53 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-javascript"
          },
          {
            "id": "render-blocking-resources",
            "title": "Eliminate render-blocking resources",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering.",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 876,
            "displayValue": "Est savings of 880 ms",
            "urgency": "medium",
            "sourceAuditId": "render-blocking-resources"
          },
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 7902,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 8 KiB",
            "urgency": "low",
            "sourceAuditId": "offscreen-images"
          }
        ],
        "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: 888.45 KB."
          },
          {
            "title": "Compress oversized image assets",
            "urgency": "high",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 713.76 KB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "medium",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 81.99 KB."
          },
          {
            "title": "Remove unused JavaScript",
            "urgency": "medium",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 52.86 KB."
          },
          {
            "title": "Eliminate render-blocking resources",
            "urgency": "medium",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering. Estimated render unblocking: 876 ms."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "low",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 7.72 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": 10,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 7,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "7 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": 168008.22098463692
        },
        "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: 164.07 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: 164.07 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": 5,
        "urgency": "medium",
        "transferBytes": 1870227,
        "css": {
          "unusedBytes": 83960,
          "ratio": 0.044892946150387095,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 54127,
          "duplicatedBytes": 0,
          "ratio": 0.02894140657791808,
          "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": "high",
            "estimatedSavingsBytes": 83960,
            "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": "medium",
            "estimatedSavingsBytes": 54127,
            "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": 1870227,
        "estimatedDeferrableBytes": 145989,
        "renderBlockingMs": 876,
        "breakdown": {
          "offscreenImageSavings": 7902,
          "unusedJavascriptSavings": 54127,
          "unusedCssSavings": 83960
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 7902,
            "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": "medium",
            "estimatedSavingsBytes": 54127,
            "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": "high",
            "estimatedSavingsBytes": 83960,
            "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": "Eliminate render-blocking resources",
            "area": "render-path",
            "urgency": "medium",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 876,
            "strategy": "Defer scripts/styles not required for first paint and preload only truly critical assets.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-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 www.barcelona.cat",
            "area": "image",
            "urgency": "high",
            "estimatedSavingsBytes": 211790,
            "url": "https://www.barcelona.cat/sites/default/files/styles/destacat_gran/public/528x228-_0007_180911_p_ofrenafloral_001_4_1.jpg?itok=LIKrmuy7",
            "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": 64,
        "urgency": "high",
        "providerCount": 7,
        "requestCount": 8,
        "transferBytes": 139466,
        "notGreenCount": 5,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76425,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15565,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7155,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2860,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=YVs6Ob&url=https%3A%2F%2Fwww.barcelona.cat%2Fes%2Fvivir-en-bcn%2Fdiada",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "high",
            "detail": "Track 7 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."
          },
          {
            "title": "Prioritize greener alternatives for third-party providers",
            "urgency": "high",
            "detail": "5 third-party script origin(s) are not confirmed green in the Green Web Foundation dataset."
          }
        ]
      },
      "redundancy": {
        "score": 14,
        "urgency": "medium",
        "transferBytes": 1870227,
        "estimatedRedundantBytes": 138087,
        "redundancyRatio": 0.07383435272830517,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 83960,
            "displayValue": "Est savings of 82 KiB"
          },
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 54127,
            "displayValue": "Est savings of 53 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 83960,
            "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 unused javascript",
            "urgency": "medium",
            "estimatedSavingsBytes": 54127,
            "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 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": 35,
        "urgency": "high",
        "totalTransferBytes": 1870227,
        "heavyRequestCount": 10,
        "heavyBytes": 1128292,
        "heavyRatio": 0.6032914721047231,
        "heavyRequests": [
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/destacat_gran/public/528x228-_0007_180911_p_ofrenafloral_001_4_1.jpg?itok=LIKrmuy7",
            "transferSize": 211790,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/destacat_gran/public/afectacions_mobilitat_528x228_1.jpg?itok=oX50yECY",
            "transferSize": 173259,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/destacat_gran/public/528x228-_0000_transport_public_v_zambrano_1_2.jpg?itok=9x7igEBS",
            "transferSize": 128516,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/destacat_gran/public/museu-nacional-dart-de-catalunya-mnac_2_1_2_1.jpg?itok=NJ3VFX3s",
            "transferSize": 122212,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/destacat_gran/public/528x228_diada-nacional-de-catalunya-2012-ma_2_1_3_1.jpg?itok=c04LmSMD",
            "transferSize": 113586,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/destacat_gran/public/528x228_la-merce-ball-de-bastons_2_1_3_1.jpg?itok=8HnNkiXe",
            "transferSize": 105090,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "transferSize": 90560,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "transferSize": 76425,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "cdn.matomo.cloud"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament/fonts/icoajuntament.ttf?8aaig7",
            "transferSize": 54921,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/css/css_qDD4BCxE8K-iT7MRORwp32v03DlJblP9-xrYwOBWlQo.css?delta=5&language=es&theme=barcelonacat_theme&include=eJyFz0FqxTAMBNALxd-LHsiMHTVxcSQjyenP7Wso_FJI6Upi5m0GH4MdB7EnnNXE4vcJ6HXJ0EJNGAWe5CTVupLFqUdwkTb7v0zHRuGs9Pkb-E4HxSzi5oqeysp34B1crizPu25rktGC-dUqb3eiFgl47boTJmNmycCW3v4DXWXJhdNkivj6Ej2dlNGWDsU21-wWVx0d7fGTPAb3kVu1ndbFLnM6YobRF2idlFA&tcut5n",
            "transferSize": 51933,
            "resourceType": "stylesheet",
            "mimeType": "text/css",
            "domain": "www.barcelona.cat"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "image",
            "count": 6,
            "transferBytes": 854453
          },
          {
            "resourceType": "font",
            "count": 2,
            "transferBytes": 145481
          },
          {
            "resourceType": "script",
            "count": 1,
            "transferBytes": 76425
          },
          {
            "resourceType": "stylesheet",
            "count": 1,
            "transferBytes": 51933
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.barcelona.cat",
            "count": 9,
            "transferBytes": 1051867
          },
          {
            "domain": "cdn.matomo.cloud",
            "count": 1,
            "transferBytes": 76425
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Split JavaScript by route or interaction",
            "urgency": "medium",
            "estimatedSavingsBytes": 54127,
            "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": "Defer non-critical UI modules until after first render",
            "urgency": "medium",
            "estimatedSavingsBytes": 0,
            "strategy": "Keep only above-the-fold resources in the initial path; hydrate or import secondary modules later.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 www.barcelona.cat",
            "urgency": "medium",
            "estimatedSavingsBytes": 211790,
            "strategy": "Serve a smaller placeholder first and load this asset only when the user scrolls to or requests the component.",
            "url": "https://www.barcelona.cat/sites/default/files/styles/destacat_gran/public/528x228-_0007_180911_p_ofrenafloral_001_4_1.jpg?itok=LIKrmuy7",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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.01,
          "displayValue": "8.9 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: 8.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,
          "displayValue": "Est savings of 53 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 53 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,
          "displayValue": "Est savings of 82 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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 82 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,
          "displayValue": "Est savings of 888 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 888 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 714 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 714 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": "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": 0,
          "displayValue": "Est savings of 880 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 Eliminate render-blocking resources\n\n- Lighthouse audit: render-blocking-resources\n- Current value: Est savings of 880 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\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": "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": 0.88,
          "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 Speed Index\n\n- Lighthouse audit: speed-index\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\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": "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 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 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": "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": "1,058 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: 1,058 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://barcelona.cat/en/living-in-bcn/pets",
      "status": "ok",
      "finalUrl": "https://www.barcelona.cat/en/living-in-bcn/pets",
      "performanceScore": 0.6,
      "bestPracticesScore": 1,
      "transferBytes": 2642997,
      "co2Grams": 1.0124829909558,
      "greenWeb": {
        "page": {
          "hostname": "www.barcelona.cat",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-13T22:38:00.231825",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.barcelona.cat",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "cdn.jsdelivr.net",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 163436,
            "sampleUrl": "https://cdn.jsdelivr.net/gh/openlayers/openlayers.github.io@master/en/v5.3.0/build/ol.js",
            "greenCheck": {
              "hostname": "cdn.jsdelivr.net",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:39",
              "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/cdn.jsdelivr.net",
              "error": null
            }
          },
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76426,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "stylesheet",
            "requestCount": 1,
            "transferBytes": 24654,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "cdnjs.cloudflare.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 20760,
            "sampleUrl": "https://cdnjs.cloudflare.com/ajax/libs/proj4js/2.2.1/proj4.js",
            "greenCheck": {
              "hostname": "cdnjs.cloudflare.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:34",
              "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/cdnjs.cloudflare.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15565,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7153,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 4109,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/css/bcn-avisos.css",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "fonts.googleapis.com",
            "resourceType": "stylesheet",
            "requestCount": 3,
            "transferBytes": 3341,
            "sampleUrl": "https://fonts.googleapis.com/css?family=Source+Sans+3:200,200i,300,300i,400,400i,500,500i,600,600i,700,700i,900,900i",
            "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
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=bE6hFx&url=https%3A%2F%2Fwww.barcelona.cat%2Fen%2Fliving-in-bcn%2Fpets",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 12,
          "greenCount": 6,
          "notGreenCount": 7,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 55,
        "urgency": "medium",
        "pageElementOccurrences": 23,
        "uniqueElementsAssessed": 4,
        "reusedFromCacheCount": 4,
        "components": [
          {
            "signature": "form|get|/en|input|text|query|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "text",
            "fieldName": "query",
            "formContext": "form|get|/en",
            "hasLabel": true,
            "hasValidationRule": false,
            "hasErrorMessagingHook": false,
            "toolingFriendly": false,
            "assessment": {
              "score": 60,
              "urgency": "high",
              "issues": [
                "No explicit validation rule",
                "No error messaging hook",
                "Missing autocomplete for tooling support"
              ],
              "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.",
                "Provide meaningful autocomplete values to support browsers and assistive tooling."
              ]
            },
            "reusedFromCache": true
          },
          {
            "signature": "no-form|input|search|ajuntament-maps-cercador-mapa|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "search",
            "fieldName": "ajuntament-maps-cercador-mapa",
            "formContext": "no-form",
            "hasLabel": true,
            "hasValidationRule": false,
            "hasErrorMessagingHook": false,
            "toolingFriendly": false,
            "assessment": {
              "score": 60,
              "urgency": "high",
              "issues": [
                "No explicit validation rule",
                "No error messaging hook",
                "Missing autocomplete for tooling support"
              ],
              "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.",
                "Provide meaningful autocomplete values to support browsers and assistive tooling."
              ]
            },
            "reusedFromCache": true
          },
          {
            "signature": "form|get|self|input|checkbox|anonymous|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "checkbox",
            "fieldName": null,
            "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": true
          },
          {
            "signature": "form|get|self|input|checkbox|districte|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "checkbox",
            "fieldName": "districte",
            "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": true
          }
        ],
        "recommendations": [
          {
            "title": "No explicit validation rule",
            "urgency": "medium",
            "detail": "4 unique form control signature(s) on this page include this issue."
          },
          {
            "title": "No error messaging hook",
            "urgency": "medium",
            "detail": "4 unique form control signature(s) on this page include this issue."
          },
          {
            "title": "Missing autocomplete for tooling support",
            "urgency": "medium",
            "detail": "2 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": "Pets | Barcelona.cat | Barcelona City Council",
          "lang": "en",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "Get information on how to enjoy pets: dog parks, rules, missing animals, veterinary centres, volunteering and everything you need for their well-being.",
          "robots": "",
          "canonical": "https://www.barcelona.cat/en/living-in-bcn/pets",
          "ogTitle": "Pets in Barcelona",
          "ogDescription": "We’ll help you care for your pet. Find information on how to enjoy pets: dog parks, rules, missing animals, veterinary centres, volunteering and everything you need for their well-being in our city.",
          "ogType": "Web",
          "ogUrl": "https://www.barcelona.cat/en/living-in-bcn/pets",
          "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": 77,
          "tabletSmallTapTargets": 73,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 77,
            "oversizedMedia": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 73,
            "oversizedMedia": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 77 small targets on mobile and 73 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 59,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": true,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": true,
          "externalScriptCount": 9,
          "externalScriptsWithoutIntegrity": 9,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "cache-control": "max-age=300, public",
            "content-encoding": "gzip",
            "content-language": "en",
            "content-length": "14970",
            "content-type": "text/html; charset=UTF-8",
            "date": "Mon, 13 Apr 2026 22:51:15 GMT",
            "etag": "\"1776120674-gzip\"",
            "expires": "Sun, 19 Nov 1978 05:00:00 GMT",
            "last-modified": "Mon, 13 Apr 2026 22:51:14 GMT",
            "server": "nginx",
            "vary": "Cookie,Accept-Encoding",
            "via": "1.1 ca2190123e61f1744d1210c24c87c840.cloudfront.net (CloudFront)",
            "x-amz-cf-id": "AwBWt7fJ-ecSoRwq96sEDRYZq-plwwVv_FmP0t8yxi9gr9WzO39uWA==",
            "x-amz-cf-pop": "IAD12-P5",
            "x-cache": "Miss from cloudfront",
            "x-content-type-options": "nosniff",
            "x-frame-options": "SAMEORIGIN",
            "x-generator": "Drupal 10 (https://www.drupal.org)"
          },
          "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": "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": "9 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 25,
        "urgency": "low",
        "origin": "https://www.barcelona.cat",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://www.barcelona.cat/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/sitemap.xml",
            "found": true,
            "status": 200,
            "contentType": "application/xml; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/manifest.webmanifest",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/favicon.ico",
            "found": true,
            "status": 200,
            "contentType": "image/x-icon"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "low",
            "detail": "Missing beneficial file(s): /.well-known/security.txt, /manifest.webmanifest."
          }
        ]
      },
      "mediaHints": {
        "score": 30,
        "urgency": "medium",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 30,
          "imagesWithLazy": 10,
          "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 30 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 85,
        "urgency": "medium",
        "data": {
          "hasPrintStyles": true,
          "hasReducedMotion": true,
          "media": {
            "totalImages": 40,
            "lazyImages": 11,
            "totalIframes": 1,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "\"Source Sans Pro\", \"Helvetica Neue\", Helvetica, Arial, sans-serif",
            "usesSystemFont": true
          },
          "tracking": {
            "count": 0,
            "scripts": []
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 11/40 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": "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"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 70,
        "urgency": "high",
        "totalEstimatedSavingsBytes": 1839759.5999999999,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Use modern image compression formats",
            "urgency": "high",
            "estimatedSavingsBytes": 1210014.5999999999,
            "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": 623670,
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings."
          },
          {
            "id": "unminified-javascript",
            "title": "Minify JavaScript before transfer",
            "urgency": "low",
            "estimatedSavingsBytes": 6075,
            "detail": "Minify JS bundles so transport compression produces better results with fewer bytes."
          }
        ],
        "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.15 MB."
          },
          {
            "title": "Improve image encoding quality/size",
            "urgency": "high",
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 609.05 KB."
          },
          {
            "title": "Minify JavaScript before transfer",
            "urgency": "low",
            "detail": "Minify JS bundles so transport compression produces better results with fewer bytes. Estimated savings: 5.93 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": 2435827.5999999996,
        "totalEstimatedBlockingMs": 1492,
        "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": 1210014.5999999999,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 1,182 KiB",
            "urgency": "high",
            "sourceAuditId": "modern-image-formats"
          },
          {
            "id": "uses-optimized-images",
            "title": "Compress oversized image assets",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss.",
            "estimatedSavingsBytes": 623670,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 609 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": 362625,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 354 KiB",
            "urgency": "high",
            "sourceAuditId": "unused-javascript"
          },
          {
            "id": "render-blocking-resources",
            "title": "Eliminate render-blocking resources",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering.",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1492,
            "displayValue": "Est savings of 1,490 ms",
            "urgency": "high",
            "sourceAuditId": "render-blocking-resources"
          },
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 149422,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 146 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": 84021,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 82 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-css-rules"
          },
          {
            "id": "unminified-javascript",
            "title": "Minify JavaScript",
            "detail": "Use minified production JS output to reduce payload size.",
            "estimatedSavingsBytes": 6075,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 6 KiB",
            "urgency": "low",
            "sourceAuditId": "unminified-javascript"
          }
        ],
        "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.15 MB."
          },
          {
            "title": "Compress oversized image assets",
            "urgency": "high",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 609.05 KB."
          },
          {
            "title": "Remove unused JavaScript",
            "urgency": "high",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 354.13 KB."
          },
          {
            "title": "Eliminate render-blocking resources",
            "urgency": "high",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering. Estimated render unblocking: 1492 ms."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "medium",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 145.92 KB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "medium",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 82.05 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": 10,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 9,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "9 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": 852276.7832053072
        },
        "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: 832.30 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: 832.30 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": 2642997,
        "css": {
          "unusedBytes": 84021,
          "ratio": 0.0317900474347871,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 362625,
          "duplicatedBytes": 0,
          "ratio": 0.1372021988674221,
          "auditIds": [
            "unused-javascript",
            "duplicated-javascript"
          ]
        },
        "html": {
          "estimatedPenalty": 0.25,
          "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": "high",
            "estimatedSavingsBytes": 84021,
            "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": 362625,
            "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": 2642997,
        "estimatedDeferrableBytes": 596068,
        "renderBlockingMs": 1492,
        "breakdown": {
          "offscreenImageSavings": 149422,
          "unusedJavascriptSavings": 362625,
          "unusedCssSavings": 84021
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 149422,
            "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": 362625,
            "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": "high",
            "estimatedSavingsBytes": 84021,
            "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": "Eliminate render-blocking resources",
            "area": "render-path",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1492,
            "strategy": "Defer scripts/styles not required for first paint and preload only truly critical assets.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-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.barcelona.cat",
            "area": "script",
            "urgency": "high",
            "estimatedSavingsBytes": 275905,
            "url": "https://www.barcelona.cat/estatics/geobcn/1.0/api-full-ca.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 www.barcelona.cat",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 170401,
            "url": "https://www.barcelona.cat/sites/default/files/styles/destacat_gran/public/animals-de-companyia_viatje_1.jpg?itok=Ivu99jic",
            "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 cdn.jsdelivr.net",
            "area": "script",
            "urgency": "medium",
            "estimatedSavingsBytes": 163436,
            "url": "https://cdn.jsdelivr.net/gh/openlayers/openlayers.github.io@master/en/v5.3.0/build/ol.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": 82,
        "urgency": "high",
        "providerCount": 9,
        "requestCount": 10,
        "transferBytes": 323662,
        "notGreenCount": 5,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "cdn.jsdelivr.net",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 163436,
            "sampleUrl": "https://cdn.jsdelivr.net/gh/openlayers/openlayers.github.io@master/en/v5.3.0/build/ol.js",
            "greenCheck": {
              "hostname": "cdn.jsdelivr.net",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:39",
              "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/cdn.jsdelivr.net",
              "error": null
            }
          },
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76426,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "cdnjs.cloudflare.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 20760,
            "sampleUrl": "https://cdnjs.cloudflare.com/ajax/libs/proj4js/2.2.1/proj4.js",
            "greenCheck": {
              "hostname": "cdnjs.cloudflare.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:34",
              "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/cdnjs.cloudflare.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15565,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7153,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=bE6hFx&url=https%3A%2F%2Fwww.barcelona.cat%2Fen%2Fliving-in-bcn%2Fpets",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "high",
            "detail": "Track 9 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."
          },
          {
            "title": "Prioritize greener alternatives for third-party providers",
            "urgency": "high",
            "detail": "5 third-party script origin(s) are not confirmed green in the Green Web Foundation dataset."
          }
        ]
      },
      "redundancy": {
        "score": 32,
        "urgency": "medium",
        "transferBytes": 2642997,
        "estimatedRedundantBytes": 446646,
        "redundancyRatio": 0.1689922463022092,
        "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": 362625,
            "displayValue": "Est savings of 354 KiB"
          },
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 84021,
            "displayValue": "Est savings of 82 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused javascript",
            "urgency": "high",
            "estimatedSavingsBytes": 362625,
            "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": 84021,
            "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": 24,
        "urgency": "medium",
        "totalTransferBytes": 2642997,
        "heavyRequestCount": 7,
        "heavyBytes": 883581,
        "heavyRatio": 0.3343102546086886,
        "heavyRequests": [
          {
            "url": "https://www.barcelona.cat/estatics/geobcn/1.0/api-full-ca.js",
            "transferSize": 275905,
            "resourceType": "script",
            "mimeType": "text/javascript",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/destacat_gran/public/animals-de-companyia_viatje_1.jpg?itok=Ivu99jic",
            "transferSize": 170401,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://cdn.jsdelivr.net/gh/openlayers/openlayers.github.io@master/en/v5.3.0/build/ol.js",
            "transferSize": 163436,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "cdn.jsdelivr.net"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "transferSize": 90560,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "transferSize": 76426,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "cdn.matomo.cloud"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament/fonts/icoajuntament.ttf?8aaig7",
            "transferSize": 54918,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/css/css_qDD4BCxE8K-iT7MRORwp32v03DlJblP9-xrYwOBWlQo.css?delta=5&language=en&theme=barcelonacat_theme&include=eJyFz9EKwjAMBdAfWumDH1RuuzgrXVKabLq_tyJsCBOfkpt7XoL7woaZ2ALWrKL-MxxqHnCUM2qv9uzeeYhoiYowEizISq3lkdR3sDgTKb3_ZSomcmumxzewG83ko4ipNdSQRj4DV3DaojzPuqlIRHFqW8k8nYmcxB2vnAmVpd-CgjVc_oHaZIiJQ2cNft8CPY0aowy6qdHsI5ReZhyQ0w&tcut5n",
            "transferSize": 51935,
            "resourceType": "stylesheet",
            "mimeType": "text/css",
            "domain": "www.barcelona.cat"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "script",
            "count": 3,
            "transferBytes": 515767
          },
          {
            "resourceType": "image",
            "count": 1,
            "transferBytes": 170401
          },
          {
            "resourceType": "font",
            "count": 2,
            "transferBytes": 145478
          },
          {
            "resourceType": "stylesheet",
            "count": 1,
            "transferBytes": 51935
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.barcelona.cat",
            "count": 5,
            "transferBytes": 643719
          },
          {
            "domain": "cdn.jsdelivr.net",
            "count": 1,
            "transferBytes": 163436
          },
          {
            "domain": "cdn.matomo.cloud",
            "count": 1,
            "transferBytes": 76426
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Lazy-load offscreen images and media galleries",
            "urgency": "high",
            "estimatedSavingsBytes": 149422,
            "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": 362625,
            "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": "Defer non-critical UI modules until after first render",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "strategy": "Keep only above-the-fold resources in the initial path; hydrate or import secondary modules later.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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.barcelona.cat",
            "urgency": "high",
            "estimatedSavingsBytes": 275905,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://www.barcelona.cat/estatics/geobcn/1.0/api-full-ca.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 www.barcelona.cat",
            "urgency": "medium",
            "estimatedSavingsBytes": 170401,
            "strategy": "Serve a smaller placeholder first and load this asset only when the user scrolls to or requests the component.",
            "url": "https://www.barcelona.cat/sites/default/files/styles/destacat_gran/public/animals-de-companyia_viatje_1.jpg?itok=Ivu99jic",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 cdn.jsdelivr.net",
            "urgency": "medium",
            "estimatedSavingsBytes": 163436,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://cdn.jsdelivr.net/gh/openlayers/openlayers.github.io@master/en/v5.3.0/build/ol.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": "10.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: 10.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 354 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 354 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,
          "displayValue": "Est savings of 82 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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 82 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,
          "displayValue": "Est savings of 1,182 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,182 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 609 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 609 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": "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": 0,
          "displayValue": "Est savings of 1,490 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 Eliminate render-blocking resources\n\n- Lighthouse audit: render-blocking-resources\n- Current value: Est savings of 1,490 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\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": "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,
          "displayValue": "1,170 elements",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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: 1,170 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"
        },
        {
          "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": 0.58,
          "displayValue": "5.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 Speed Index\n\n- Lighthouse audit: speed-index\n- Current value: 5.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\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": "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 146 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 146 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://barcelona.cat/es/que-hacer-en-bcn/banos-y-playas/deporte-en-las-playas/pesca",
      "status": "ok",
      "finalUrl": "https://www.barcelona.cat/es/que-hacer-en-bcn/banos-y-playas/deporte-en-las-playas/pesca",
      "performanceScore": 0.67,
      "bestPracticesScore": 1,
      "transferBytes": 1067238,
      "co2Grams": 0.40883902717320003,
      "greenWeb": {
        "page": {
          "hostname": "www.barcelona.cat",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-13T22:38:00.231825",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.barcelona.cat",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76426,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "stylesheet",
            "requestCount": 1,
            "transferBytes": 24654,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15565,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7145,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 4110,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/css/bcn-avisos.css",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "fonts.googleapis.com",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 2481,
            "sampleUrl": "https://fonts.googleapis.com/css?family=Source+Sans+3:200,200i,300,300i,400,400i,500,500i,600,600i,700,700i,900,900i",
            "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
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=ivxIDC&url=https%3A%2F%2Fwww.barcelona.cat%2Fes%2Fque-hacer-en-bcn%2Fbanos-y-playas%2Fdeporte-en-las-playas%2Fpesca",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 10,
          "greenCount": 4,
          "notGreenCount": 7,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 60,
        "urgency": "high",
        "pageElementOccurrences": 1,
        "uniqueElementsAssessed": 1,
        "reusedFromCacheCount": 1,
        "components": [
          {
            "signature": "form|get|/es/|input|text|query|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "text",
            "fieldName": "query",
            "formContext": "form|get|/es/",
            "hasLabel": true,
            "hasValidationRule": false,
            "hasErrorMessagingHook": false,
            "toolingFriendly": false,
            "assessment": {
              "score": 60,
              "urgency": "high",
              "issues": [
                "No explicit validation rule",
                "No error messaging hook",
                "Missing autocomplete for tooling support"
              ],
              "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.",
                "Provide meaningful autocomplete values to support browsers and assistive tooling."
              ]
            },
            "reusedFromCache": true
          }
        ],
        "recommendations": [
          {
            "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."
          },
          {
            "title": "Missing autocomplete for tooling support",
            "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": "Pesca | Web de Barcelona | Ayuntamiento de Barcelona",
          "lang": "es",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "Haz una práctica segura y responsable de la pesca en las playas de Barcelona.",
          "robots": "",
          "canonical": "https://www.barcelona.cat/es/que-hacer-en-bcn/banos-y-playas/deporte-en-las-playas/pesca",
          "ogTitle": "Pesca | Web de Barcelona | Ayuntamiento de Barcelona",
          "ogDescription": "Haz una práctica segura y responsable de la pesca en las playas de Barcelona.",
          "ogType": "Web",
          "ogUrl": "https://www.barcelona.cat/es/que-hacer-en-bcn/banos-y-playas/deporte-en-las-playas/pesca",
          "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": 34,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 36,
            "oversizedMedia": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 34,
            "oversizedMedia": 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 34 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 59,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": true,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": true,
          "externalScriptCount": 7,
          "externalScriptsWithoutIntegrity": 7,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "cache-control": "max-age=300, public",
            "content-encoding": "gzip",
            "content-language": "es",
            "content-length": "10198",
            "content-type": "text/html; charset=UTF-8",
            "date": "Mon, 13 Apr 2026 22:51:31 GMT",
            "etag": "\"1776120690-gzip\"",
            "expires": "Sun, 19 Nov 1978 05:00:00 GMT",
            "last-modified": "Mon, 13 Apr 2026 22:51:30 GMT",
            "server": "nginx",
            "vary": "Cookie,Accept-Encoding",
            "via": "1.1 ca2190123e61f1744d1210c24c87c840.cloudfront.net (CloudFront)",
            "x-amz-cf-id": "DPm9EynQ3Vq75kwFOv7Np24VDq6OMZZYdAJ4af2aTlPXCLc-Hazm1w==",
            "x-amz-cf-pop": "IAD12-P5",
            "x-cache": "Miss from cloudfront",
            "x-content-type-options": "nosniff",
            "x-frame-options": "SAMEORIGIN",
            "x-generator": "Drupal 10 (https://www.drupal.org)"
          },
          "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": "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": "7 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 25,
        "urgency": "low",
        "origin": "https://www.barcelona.cat",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://www.barcelona.cat/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/sitemap.xml",
            "found": true,
            "status": 200,
            "contentType": "application/xml; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/manifest.webmanifest",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/favicon.ico",
            "found": true,
            "status": 200,
            "contentType": "image/x-icon"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "low",
            "detail": "Missing beneficial file(s): /.well-known/security.txt, /manifest.webmanifest."
          }
        ]
      },
      "mediaHints": {
        "score": 45,
        "urgency": "medium",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 12,
          "imagesWithLazy": 1,
          "imagesWithoutLazy": 11
        },
        "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": "11 of 12 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 85,
        "urgency": "medium",
        "data": {
          "hasPrintStyles": true,
          "hasReducedMotion": true,
          "media": {
            "totalImages": 17,
            "lazyImages": 2,
            "totalIframes": 1,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "\"Source Sans Pro\", \"Helvetica Neue\", Helvetica, Arial, sans-serif",
            "usesSystemFont": true
          },
          "tracking": {
            "count": 0,
            "scripts": []
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 2/17 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": "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"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 53,
        "urgency": "medium",
        "totalEstimatedSavingsBytes": 562737.1,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Use modern image compression formats",
            "urgency": "high",
            "estimatedSavingsBytes": 313081.1,
            "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": 249656,
            "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: 305.74 KB."
          },
          {
            "title": "Improve image encoding quality/size",
            "urgency": "high",
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 243.80 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": 796815.1,
        "totalEstimatedBlockingMs": 1489,
        "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": 313081.1,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 306 KiB",
            "urgency": "high",
            "sourceAuditId": "modern-image-formats"
          },
          {
            "id": "uses-optimized-images",
            "title": "Compress oversized image assets",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss.",
            "estimatedSavingsBytes": 249656,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 244 KiB",
            "urgency": "high",
            "sourceAuditId": "uses-optimized-images"
          },
          {
            "id": "render-blocking-resources",
            "title": "Eliminate render-blocking resources",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering.",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1489,
            "displayValue": "Est savings of 1,490 ms",
            "urgency": "high",
            "sourceAuditId": "render-blocking-resources"
          },
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 87117,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 85 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": 81541,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 80 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-css-rules"
          },
          {
            "id": "uses-responsive-images",
            "title": "Right-size images for viewport",
            "detail": "Avoid sending larger images than the rendered size needs.",
            "estimatedSavingsBytes": 32939,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 32 KiB",
            "urgency": "low",
            "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": 32481,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 32 KiB",
            "urgency": "low",
            "sourceAuditId": "unused-javascript"
          }
        ],
        "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: 305.74 KB."
          },
          {
            "title": "Compress oversized image assets",
            "urgency": "high",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 243.80 KB."
          },
          {
            "title": "Eliminate render-blocking resources",
            "urgency": "high",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering. Estimated render unblocking: 1489 ms."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "medium",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 85.08 KB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "medium",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 79.63 KB."
          },
          {
            "title": "Right-size images for viewport",
            "urgency": "low",
            "detail": "Avoid sending larger images than the rendered size needs. Estimated byte savings: 32.17 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": 10,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 7,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "7 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": 168001.41445530724
        },
        "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: 164.06 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: 164.06 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": "medium",
        "transferBytes": 1067238,
        "css": {
          "unusedBytes": 81541,
          "ratio": 0.07640376373404995,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 32481,
          "duplicatedBytes": 0,
          "ratio": 0.03043463594812029,
          "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": "high",
            "estimatedSavingsBytes": 81541,
            "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": "medium",
            "estimatedSavingsBytes": 32481,
            "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": 20,
        "urgency": "high",
        "transferBytes": 1067238,
        "estimatedDeferrableBytes": 201139,
        "renderBlockingMs": 1489,
        "breakdown": {
          "offscreenImageSavings": 87117,
          "unusedJavascriptSavings": 32481,
          "unusedCssSavings": 81541
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 87117,
            "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": "medium",
            "estimatedSavingsBytes": 32481,
            "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": 81541,
            "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": "Eliminate render-blocking resources",
            "area": "render-path",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1489,
            "strategy": "Defer scripts/styles not required for first paint and preload only truly critical assets.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-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 www.barcelona.cat",
            "area": "image",
            "urgency": "high",
            "estimatedSavingsBytes": 291941,
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_medium/public/710x379_0001_pesca02_pixabay_1.jpg?itok=k5vDy8pm",
            "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 www.barcelona.cat",
            "area": "font",
            "urgency": "medium",
            "estimatedSavingsBytes": 90561,
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "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 cdn.matomo.cloud",
            "area": "script",
            "urgency": "medium",
            "estimatedSavingsBytes": 76426,
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.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": 64,
        "urgency": "high",
        "providerCount": 7,
        "requestCount": 8,
        "transferBytes": 139458,
        "notGreenCount": 5,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76426,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15565,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7145,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=ivxIDC&url=https%3A%2F%2Fwww.barcelona.cat%2Fes%2Fque-hacer-en-bcn%2Fbanos-y-playas%2Fdeporte-en-las-playas%2Fpesca",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "high",
            "detail": "Track 7 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."
          },
          {
            "title": "Prioritize greener alternatives for third-party providers",
            "urgency": "high",
            "detail": "5 third-party script origin(s) are not confirmed green in the Green Web Foundation dataset."
          }
        ]
      },
      "redundancy": {
        "score": 16,
        "urgency": "low",
        "transferBytes": 1067238,
        "estimatedRedundantBytes": 114022,
        "redundancyRatio": 0.10683839968217024,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 81541,
            "displayValue": "Est savings of 80 KiB"
          },
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 32481,
            "displayValue": "Est savings of 32 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 81541,
            "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 unused javascript",
            "urgency": "medium",
            "estimatedSavingsBytes": 32481,
            "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 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": 28,
        "urgency": "medium",
        "totalTransferBytes": 1067238,
        "heavyRequestCount": 5,
        "heavyBytes": 562952,
        "heavyRatio": 0.5274849658651585,
        "heavyRequests": [
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_medium/public/710x379_0001_pesca02_pixabay_1.jpg?itok=k5vDy8pm",
            "transferSize": 291941,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "transferSize": 90561,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "transferSize": 76426,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "cdn.matomo.cloud"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament/fonts/icoajuntament.ttf?8aaig7",
            "transferSize": 54920,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/css/css_evpTRQTawGYS1Ro7RbXq3hBxwat7AU-RJm1V8ZgzeaE.css?delta=5&language=es&theme=barcelonacat_theme&include=eJyFzsGKwzAMBNAfiuvDfpAZOyJxcSQjydn272sodFnIsieJmXcY3Ac7DmJPOKuJxfcJ6HXJ0EJNGAWe5CTVupLFqUdwkTb7v0zHRuGs9P0b-E4HxSzi5oqeyspXYGuS0YL5s1XerkQtEvDZfiVMxsySgS19_Qe6ypILp8kU8fMlejgpoy0dim0u3i2uOjra7Se5De4jt2o7rYs9zemIGUYvwgyJSg&tcut5n",
            "transferSize": 49104,
            "resourceType": "stylesheet",
            "mimeType": "text/css",
            "domain": "www.barcelona.cat"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "image",
            "count": 1,
            "transferBytes": 291941
          },
          {
            "resourceType": "font",
            "count": 2,
            "transferBytes": 145481
          },
          {
            "resourceType": "script",
            "count": 1,
            "transferBytes": 76426
          },
          {
            "resourceType": "stylesheet",
            "count": 1,
            "transferBytes": 49104
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.barcelona.cat",
            "count": 4,
            "transferBytes": 486526
          },
          {
            "domain": "cdn.matomo.cloud",
            "count": 1,
            "transferBytes": 76426
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Lazy-load offscreen images and media galleries",
            "urgency": "medium",
            "estimatedSavingsBytes": 87117,
            "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": "Defer non-critical UI modules until after first render",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "strategy": "Keep only above-the-fold resources in the initial path; hydrate or import secondary modules later.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 www.barcelona.cat",
            "urgency": "high",
            "estimatedSavingsBytes": 291941,
            "strategy": "Serve a smaller placeholder first and load this asset only when the user scrolls to or requests the component.",
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_medium/public/710x379_0001_pesca02_pixabay_1.jpg?itok=k5vDy8pm",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 www.barcelona.cat",
            "urgency": "medium",
            "estimatedSavingsBytes": 90561,
            "strategy": "Subset or defer this font so full font payloads are only fetched when needed.",
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 cdn.matomo.cloud",
            "urgency": "medium",
            "estimatedSavingsBytes": 76426,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.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": "10.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: 10.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 32 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 32 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,
          "displayValue": "Est savings of 80 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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 80 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,
          "displayValue": "Est savings of 306 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 306 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 244 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 244 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,
          "displayValue": "Est savings of 85 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 85 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": "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": 0,
          "displayValue": "Est savings of 1,490 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 Eliminate render-blocking resources\n\n- Lighthouse audit: render-blocking-resources\n- Current value: Est savings of 1,490 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\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": "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": 0.86,
          "displayValue": "3.6 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 Speed Index\n\n- Lighthouse audit: speed-index\n- Current value: 3.6 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\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": "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": "931 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: 931 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://barcelona.cat/en/what-to-do-in-bcn/get-fit/sports-facilities",
      "status": "ok",
      "finalUrl": "https://www.barcelona.cat/en/what-to-do-in-bcn/get-fit/sports-facilities",
      "performanceScore": 0.65,
      "bestPracticesScore": 1,
      "transferBytes": 957267,
      "co2Grams": 0.36671118253380003,
      "greenWeb": {
        "page": {
          "hostname": "www.barcelona.cat",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-13T22:38:00.231825",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.barcelona.cat",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76425,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "stylesheet",
            "requestCount": 1,
            "transferBytes": 24654,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "cdnjs.cloudflare.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15865,
            "sampleUrl": "https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js",
            "greenCheck": {
              "hostname": "cdnjs.cloudflare.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:34",
              "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/cdnjs.cloudflare.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15565,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7145,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5656,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 4111,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/css/bcn-avisos.css",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "fonts.googleapis.com",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 2481,
            "sampleUrl": "https://fonts.googleapis.com/css?family=Source+Sans+3:200,200i,300,300i,400,400i,500,500i,600,600i,700,700i,900,900i",
            "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
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=JHEKmU&url=https%3A%2F%2Fwww.barcelona.cat%2Fen%2Fwhat-to-do-in-bcn%2Fget-fit%2Fsports-facilities",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 11,
          "greenCount": 5,
          "notGreenCount": 7,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 75,
        "urgency": "high",
        "pageElementOccurrences": 7,
        "uniqueElementsAssessed": 2,
        "reusedFromCacheCount": 2,
        "components": [
          {
            "signature": "form|get|/en|input|text|query|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "text",
            "fieldName": "query",
            "formContext": "form|get|/en",
            "hasLabel": true,
            "hasValidationRule": false,
            "hasErrorMessagingHook": false,
            "toolingFriendly": false,
            "assessment": {
              "score": 60,
              "urgency": "high",
              "issues": [
                "No explicit validation rule",
                "No error messaging hook",
                "Missing autocomplete for tooling support"
              ],
              "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.",
                "Provide meaningful autocomplete values to support browsers and assistive tooling."
              ]
            },
            "reusedFromCache": true
          },
          {
            "signature": "no-form|select|select|anonymous|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "select",
            "fieldName": null,
            "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": "No explicit validation rule",
            "urgency": "medium",
            "detail": "2 unique form control signature(s) on this page include this issue."
          },
          {
            "title": "No error messaging hook",
            "urgency": "medium",
            "detail": "2 unique form control signature(s) on this page include this issue."
          },
          {
            "title": "Missing autocomplete for tooling support",
            "urgency": "medium",
            "detail": "1 unique form control signature(s) on this page include this issue."
          },
          {
            "title": "Missing associated label",
            "urgency": "high",
            "detail": "1 unique form control signature(s) on this page include this issue."
          }
        ]
      },
      "metadata": {
        "score": 25,
        "urgency": "low",
        "checks": {
          "hasTitle": true,
          "hasLang": true,
          "hasDescription": false,
          "hasCanonical": true,
          "hasOpenGraphCore": false,
          "hasTwitterCard": true,
          "hasViewport": true,
          "hasCharset": true,
          "hasValidStructuredData": true,
          "hasInvalidStructuredData": false
        },
        "observed": {
          "title": "Sports facilities | Barcelona.cat | Ajuntament de Barcelona",
          "lang": "en",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "",
          "robots": "",
          "canonical": "https://www.barcelona.cat/en/what-to-do-in-bcn/get-fit/sports-facilities",
          "ogTitle": "Sports facilities",
          "ogDescription": "",
          "ogType": "Web",
          "ogUrl": "https://www.barcelona.cat/en/what-to-do-in-bcn/get-fit/sports-facilities",
          "twitterCard": "summary_large_image",
          "ldJsonCount": 0,
          "validLdJsonCount": 0,
          "invalidLdJsonCount": 0
        },
        "recommendations": [
          {
            "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."
          }
        ]
      },
      "layoutAdaptation": {
        "score": 30,
        "urgency": "medium",
        "checks": {
          "testedMobile": true,
          "testedTablet": true,
          "horizontalOverflowOnMobile": false,
          "horizontalOverflowOnTablet": false,
          "mobileSmallTapTargets": 66,
          "tabletSmallTapTargets": 65,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 66,
            "oversizedMedia": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 65,
            "oversizedMedia": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 66 small targets on mobile and 65 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 59,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": true,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": true,
          "externalScriptCount": 8,
          "externalScriptsWithoutIntegrity": 8,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "cache-control": "max-age=300, public",
            "content-encoding": "gzip",
            "content-language": "en",
            "content-length": "14291",
            "content-type": "text/html; charset=UTF-8",
            "date": "Mon, 13 Apr 2026 22:51:44 GMT",
            "etag": "\"1776120703-gzip\"",
            "expires": "Sun, 19 Nov 1978 05:00:00 GMT",
            "last-modified": "Mon, 13 Apr 2026 22:51:43 GMT",
            "server": "nginx",
            "vary": "Cookie,Accept-Encoding",
            "via": "1.1 ca2190123e61f1744d1210c24c87c840.cloudfront.net (CloudFront)",
            "x-amz-cf-id": "JDD22WygAze8y1AMlIfqnhKCI8Z2qh-heeUenBZ--jMCmz0sthrdKA==",
            "x-amz-cf-pop": "IAD12-P5",
            "x-cache": "Miss from cloudfront",
            "x-content-type-options": "nosniff",
            "x-frame-options": "SAMEORIGIN",
            "x-generator": "Drupal 10 (https://www.drupal.org)"
          },
          "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": "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": "8 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 25,
        "urgency": "low",
        "origin": "https://www.barcelona.cat",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://www.barcelona.cat/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/sitemap.xml",
            "found": true,
            "status": 200,
            "contentType": "application/xml; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/manifest.webmanifest",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/favicon.ico",
            "found": true,
            "status": 200,
            "contentType": "image/x-icon"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "low",
            "detail": "Missing beneficial file(s): /.well-known/security.txt, /manifest.webmanifest."
          }
        ]
      },
      "mediaHints": {
        "score": 50,
        "urgency": "medium",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 21,
          "imagesWithLazy": 0,
          "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 21 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 85,
        "urgency": "medium",
        "data": {
          "hasPrintStyles": true,
          "hasReducedMotion": true,
          "media": {
            "totalImages": 26,
            "lazyImages": 1,
            "totalIframes": 1,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "\"Source Sans Pro\", \"Helvetica Neue\", Helvetica, Arial, sans-serif",
            "usesSystemFont": true
          },
          "tracking": {
            "count": 0,
            "scripts": []
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 1/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": "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"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 28,
        "urgency": "low",
        "totalEstimatedSavingsBytes": 267067.15,
        "checks": {
          "hasEffectiveTextCompression": false
        },
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Use modern image compression formats",
            "urgency": "medium",
            "estimatedSavingsBytes": 99577.15,
            "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size."
          },
          {
            "id": "uses-text-compression",
            "title": "Enable Brotli/gzip for text assets",
            "urgency": "medium",
            "estimatedSavingsBytes": 87867,
            "detail": "Compress HTML, CSS, JS, JSON, SVG, and XML responses with Brotli or gzip."
          },
          {
            "id": "uses-optimized-images",
            "title": "Improve image encoding quality/size",
            "urgency": "medium",
            "estimatedSavingsBytes": 79623,
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings."
          }
        ],
        "recommendations": [
          {
            "title": "Use modern image compression formats",
            "urgency": "medium",
            "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size. Estimated savings: 97.24 KB."
          },
          {
            "title": "Enable Brotli/gzip for text assets",
            "urgency": "medium",
            "detail": "Compress HTML, CSS, JS, JSON, SVG, and XML responses with Brotli or gzip. Estimated savings: 85.81 KB."
          },
          {
            "title": "Improve image encoding quality/size",
            "urgency": "medium",
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 77.76 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": 511341.15,
        "totalEstimatedBlockingMs": 1958,
        "opportunities": [
          {
            "id": "render-blocking-resources",
            "title": "Eliminate render-blocking resources",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering.",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1958,
            "displayValue": "Est savings of 1,960 ms",
            "urgency": "high",
            "sourceAuditId": "render-blocking-resources"
          },
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 119875,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 117 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": 99577.15,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 97 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": 91918,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 90 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-css-rules"
          },
          {
            "id": "uses-text-compression",
            "title": "Enable text compression",
            "detail": "Serve text assets with Brotli or gzip to remove avoidable transfer bloat.",
            "estimatedSavingsBytes": 87867,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 86 KiB",
            "urgency": "medium",
            "sourceAuditId": "uses-text-compression"
          },
          {
            "id": "uses-optimized-images",
            "title": "Compress oversized image assets",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss.",
            "estimatedSavingsBytes": 79623,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 78 KiB",
            "urgency": "medium",
            "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": 32481,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 32 KiB",
            "urgency": "low",
            "sourceAuditId": "unused-javascript"
          }
        ],
        "recommendations": [
          {
            "title": "Eliminate render-blocking resources",
            "urgency": "high",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering. Estimated render unblocking: 1958 ms."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "medium",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 117.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: 97.24 KB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "medium",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 89.76 KB."
          },
          {
            "title": "Enable text compression",
            "urgency": "medium",
            "detail": "Serve text assets with Brotli or gzip to remove avoidable transfer bloat. Estimated byte savings: 85.81 KB."
          },
          {
            "title": "Compress oversized image assets",
            "urgency": "medium",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 77.76 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": 10,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 8,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "8 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": 199787.37723463692
        },
        "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: 195.10 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: 195.10 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": "medium",
        "transferBytes": 957267,
        "css": {
          "unusedBytes": 91918,
          "ratio": 0.09602127724031018,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 32481,
          "duplicatedBytes": 0,
          "ratio": 0.03393097223658603,
          "auditIds": [
            "unused-javascript",
            "duplicated-javascript"
          ]
        },
        "html": {
          "estimatedPenalty": 0.25,
          "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": "high",
            "estimatedSavingsBytes": 91918,
            "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": "medium",
            "estimatedSavingsBytes": 32481,
            "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": 957267,
        "estimatedDeferrableBytes": 244274,
        "renderBlockingMs": 1958,
        "breakdown": {
          "offscreenImageSavings": 119875,
          "unusedJavascriptSavings": 32481,
          "unusedCssSavings": 91918
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 119875,
            "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": "medium",
            "estimatedSavingsBytes": 32481,
            "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": "high",
            "estimatedSavingsBytes": 91918,
            "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": "Eliminate render-blocking resources",
            "area": "render-path",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1958,
            "strategy": "Defer scripts/styles not required for first paint and preload only truly critical assets.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-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 www.barcelona.cat",
            "area": "font",
            "urgency": "medium",
            "estimatedSavingsBytes": 90560,
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "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 www.barcelona.cat",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 84135,
            "url": "https://www.barcelona.cat/themes/barcelonacat_theme/images/menu/viula.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 cdn.matomo.cloud",
            "area": "script",
            "urgency": "medium",
            "estimatedSavingsBytes": 76425,
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.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": 65,
        "urgency": "high",
        "providerCount": 8,
        "requestCount": 9,
        "transferBytes": 155532,
        "notGreenCount": 5,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76425,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "cdnjs.cloudflare.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15865,
            "sampleUrl": "https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js",
            "greenCheck": {
              "hostname": "cdnjs.cloudflare.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:34",
              "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/cdnjs.cloudflare.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15565,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7145,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5656,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=JHEKmU&url=https%3A%2F%2Fwww.barcelona.cat%2Fen%2Fwhat-to-do-in-bcn%2Fget-fit%2Fsports-facilities",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "high",
            "detail": "Track 8 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."
          },
          {
            "title": "Prioritize greener alternatives for third-party providers",
            "urgency": "high",
            "detail": "5 third-party script origin(s) are not confirmed green in the Green Web Foundation dataset."
          }
        ]
      },
      "redundancy": {
        "score": 35,
        "urgency": "medium",
        "transferBytes": 957267,
        "estimatedRedundantBytes": 124399,
        "redundancyRatio": 0.1299522494768962,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 91918,
            "displayValue": "Est savings of 90 KiB"
          },
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 32481,
            "displayValue": "Est savings of 32 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 91918,
            "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 unused javascript",
            "urgency": "medium",
            "estimatedSavingsBytes": 32481,
            "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": "Enable and verify text compression",
            "urgency": "medium",
            "estimatedSavingsBytes": 87867,
            "auditId": "uses-text-compression",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "2",
              "title": "Remove unnecessary or redundant information",
              "url": "https://www.w3.org/TR/web-sustainability-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": 19,
        "urgency": "medium",
        "totalTransferBytes": 957267,
        "heavyRequestCount": 4,
        "heavyBytes": 271000,
        "heavyRatio": 0.28309761017563545,
        "heavyRequests": [
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "transferSize": 90560,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "transferSize": 76425,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "cdn.matomo.cloud"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament/fonts/icoajuntament.ttf?8aaig7",
            "transferSize": 54920,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/css/css_evpTRQTawGYS1Ro7RbXq3hBxwat7AU-RJm1V8ZgzeaE.css?delta=5&language=en&theme=barcelonacat_theme&include=eJyFztEOwiAMheEXgnDhA5EDq4gySmiZ7u1dYuJinPGqTf_voriOqpipqseShcW9hkXLBntMI8NNUGo53qh_JzpjFBUT0CMVrohQzwv1nicSt8lhlbls_ZdpSGSXTPdPoBeayQVmFe1oPk71CKTCAcWKriXXdCRyZLv_fSSEx3bzgir-9A-0zibE6jfW4d6bp4dSryhGVlGaXYDQE_H9jbg&tcut5n",
            "transferSize": 49095,
            "resourceType": "stylesheet",
            "mimeType": "text/css",
            "domain": "www.barcelona.cat"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "font",
            "count": 2,
            "transferBytes": 145480
          },
          {
            "resourceType": "script",
            "count": 1,
            "transferBytes": 76425
          },
          {
            "resourceType": "stylesheet",
            "count": 1,
            "transferBytes": 49095
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.barcelona.cat",
            "count": 3,
            "transferBytes": 194575
          },
          {
            "domain": "cdn.matomo.cloud",
            "count": 1,
            "transferBytes": 76425
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Lazy-load offscreen images and media galleries",
            "urgency": "medium",
            "estimatedSavingsBytes": 119875,
            "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": "Defer non-critical UI modules until after first render",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "strategy": "Keep only above-the-fold resources in the initial path; hydrate or import secondary modules later.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 www.barcelona.cat",
            "urgency": "medium",
            "estimatedSavingsBytes": 90560,
            "strategy": "Subset or defer this font so full font payloads are only fetched when needed.",
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 cdn.matomo.cloud",
            "urgency": "medium",
            "estimatedSavingsBytes": 76425,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.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.09,
          "displayValue": "6.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: 6.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-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,
          "displayValue": "Est savings of 90 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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 90 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,
          "displayValue": "Est savings of 97 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 97 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 78 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 78 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,
          "displayValue": "Est savings of 117 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 117 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": "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": 0,
          "displayValue": "Est savings of 1,960 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 Eliminate render-blocking resources\n\n- Lighthouse audit: render-blocking-resources\n- Current value: Est savings of 1,960 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\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": "server-response-time",
          "title": "Reduce initial server response time",
          "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": 0,
          "displayValue": "Root document took 1,010 ms",
          "impact": "high",
          "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 Reduce initial server response time\n\n- Lighthouse audit: server-response-time\n- Current value: Root document took 1,010 ms\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": "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,
          "displayValue": "1,173 elements",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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: 1,173 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"
        },
        {
          "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": 0.75,
          "displayValue": "4.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 Speed Index\n\n- Lighthouse audit: speed-index\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\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": 0.5,
          "displayValue": "Est savings of 32 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 32 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": "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": 0.5,
          "displayValue": "Est savings of 86 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 Enable text compression\n\n- Lighthouse audit: uses-text-compression\n- Current value: Est savings of 86 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\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"
        }
      ]
    },
    {
      "url": "https://barcelona.cat/ca/que-pots-fer-a-bcn/banys-i-platges/esport-les-platges",
      "status": "ok",
      "finalUrl": "https://www.barcelona.cat/ca/que-pots-fer-a-bcn/banys-i-platges/esport-les-platges",
      "performanceScore": 0.7,
      "bestPracticesScore": 1,
      "transferBytes": 1260332,
      "co2Grams": 0.48280974702480006,
      "greenWeb": {
        "page": {
          "hostname": "www.barcelona.cat",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-13T22:38:00.231825",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.barcelona.cat",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76425,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "stylesheet",
            "requestCount": 1,
            "transferBytes": 24654,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15565,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7144,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 4109,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/css/bcn-avisos.css",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "fonts.googleapis.com",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 2484,
            "sampleUrl": "https://fonts.googleapis.com/css?family=Source+Sans+3:200,200i,300,300i,400,400i,500,500i,600,600i,700,700i,900,900i",
            "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
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 268,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=1wfJA2&url=https%3A%2F%2Fwww.barcelona.cat%2Fca%2Fque-pots-fer-a-bcn%2Fbanys-i-platges%2Fesport-les-platges",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 10,
          "greenCount": 4,
          "notGreenCount": 7,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 60,
        "urgency": "high",
        "pageElementOccurrences": 1,
        "uniqueElementsAssessed": 1,
        "reusedFromCacheCount": 1,
        "components": [
          {
            "signature": "form|get|/ca|input|text|query|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "text",
            "fieldName": "query",
            "formContext": "form|get|/ca",
            "hasLabel": true,
            "hasValidationRule": false,
            "hasErrorMessagingHook": false,
            "toolingFriendly": false,
            "assessment": {
              "score": 60,
              "urgency": "high",
              "issues": [
                "No explicit validation rule",
                "No error messaging hook",
                "Missing autocomplete for tooling support"
              ],
              "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.",
                "Provide meaningful autocomplete values to support browsers and assistive tooling."
              ]
            },
            "reusedFromCache": true
          }
        ],
        "recommendations": [
          {
            "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."
          },
          {
            "title": "Missing autocomplete for tooling support",
            "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": "Esports a les platges | Web de Barcelona | Ajuntament de Barcelona",
          "lang": "ca",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "Descobreix tota la informació per fer esport a les platges de Barcelona: activitats esportives, documentació necessària i requisits per practicar-ne.",
          "robots": "",
          "canonical": "https://www.barcelona.cat/ca/que-pots-fer-a-bcn/banys-i-platges/esport-les-platges",
          "ogTitle": "Esports a les platges | Web de Barcelona | Ajuntament de Barcelona",
          "ogDescription": "Descobreix tota la informació per fer esport a les platges de Barcelona: activitats esportives, documentació necessària i requisits per practicar-ne.",
          "ogType": "Web",
          "ogUrl": "https://www.barcelona.cat/ca/que-pots-fer-a-bcn/banys-i-platges/esport-les-platges",
          "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": 39,
          "tabletSmallTapTargets": 35,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 39,
            "oversizedMedia": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 35,
            "oversizedMedia": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 39 small targets on mobile and 35 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 59,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": true,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": true,
          "externalScriptCount": 7,
          "externalScriptsWithoutIntegrity": 7,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "cache-control": "max-age=300, public",
            "content-encoding": "gzip",
            "content-language": "ca",
            "content-length": "11742",
            "content-type": "text/html; charset=UTF-8",
            "date": "Mon, 13 Apr 2026 22:51:58 GMT",
            "etag": "\"1776120718-gzip\"",
            "expires": "Sun, 19 Nov 1978 05:00:00 GMT",
            "last-modified": "Mon, 13 Apr 2026 22:51:58 GMT",
            "server": "nginx",
            "vary": "Cookie,Accept-Encoding",
            "via": "1.1 ca2190123e61f1744d1210c24c87c840.cloudfront.net (CloudFront)",
            "x-amz-cf-id": "AKqQeLBKh_BNsCGNB0XldEBe906sfIH0OUinFkxys9J_5paYcBxetA==",
            "x-amz-cf-pop": "IAD12-P5",
            "x-cache": "Miss from cloudfront",
            "x-content-type-options": "nosniff",
            "x-frame-options": "SAMEORIGIN",
            "x-generator": "Drupal 10 (https://www.drupal.org)"
          },
          "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": "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": "7 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 25,
        "urgency": "low",
        "origin": "https://www.barcelona.cat",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://www.barcelona.cat/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/sitemap.xml",
            "found": true,
            "status": 200,
            "contentType": "application/xml; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/manifest.webmanifest",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/favicon.ico",
            "found": true,
            "status": 200,
            "contentType": "image/x-icon"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "low",
            "detail": "Missing beneficial file(s): /.well-known/security.txt, /manifest.webmanifest."
          }
        ]
      },
      "mediaHints": {
        "score": 34,
        "urgency": "medium",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 15,
          "imagesWithLazy": 4,
          "imagesWithoutLazy": 11
        },
        "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": "11 of 15 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 85,
        "urgency": "medium",
        "data": {
          "hasPrintStyles": true,
          "hasReducedMotion": true,
          "media": {
            "totalImages": 20,
            "lazyImages": 5,
            "totalIframes": 1,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "\"Source Sans Pro\", \"Helvetica Neue\", Helvetica, Arial, sans-serif",
            "usesSystemFont": true
          },
          "tracking": {
            "count": 0,
            "scripts": []
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 5/20 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": "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"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 66,
        "urgency": "high",
        "totalEstimatedSavingsBytes": 832514.1499999999,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Use modern image compression formats",
            "urgency": "high",
            "estimatedSavingsBytes": 457974.14999999997,
            "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": 374540,
            "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: 447.24 KB."
          },
          {
            "title": "Improve image encoding quality/size",
            "urgency": "high",
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 365.76 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": 1058277.15,
        "totalEstimatedBlockingMs": 1630,
        "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": 457974.14999999997,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 447 KiB",
            "urgency": "high",
            "sourceAuditId": "modern-image-formats"
          },
          {
            "id": "uses-optimized-images",
            "title": "Compress oversized image assets",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss.",
            "estimatedSavingsBytes": 374540,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 366 KiB",
            "urgency": "high",
            "sourceAuditId": "uses-optimized-images"
          },
          {
            "id": "render-blocking-resources",
            "title": "Eliminate render-blocking resources",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering.",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1630,
            "displayValue": "Est savings of 1,630 ms",
            "urgency": "high",
            "sourceAuditId": "render-blocking-resources"
          },
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 87109,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 85 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": 83933,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 82 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-css-rules"
          },
          {
            "id": "unused-javascript",
            "title": "Remove unused JavaScript",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code.",
            "estimatedSavingsBytes": 54721,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 53 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-javascript"
          }
        ],
        "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: 447.24 KB."
          },
          {
            "title": "Compress oversized image assets",
            "urgency": "high",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 365.76 KB."
          },
          {
            "title": "Eliminate render-blocking resources",
            "urgency": "high",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering. Estimated render unblocking: 1630 ms."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "medium",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 85.07 KB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "medium",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 81.97 KB."
          },
          {
            "title": "Remove unused JavaScript",
            "urgency": "medium",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 53.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": 10,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 7,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "7 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": 167988.43973463686
        },
        "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: 164.05 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: 164.05 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": "medium",
        "transferBytes": 1260332,
        "css": {
          "unusedBytes": 83933,
          "ratio": 0.06659594456063958,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 54721,
          "duplicatedBytes": 0,
          "ratio": 0.04341792480076678,
          "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": "high",
            "estimatedSavingsBytes": 83933,
            "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": "medium",
            "estimatedSavingsBytes": 54721,
            "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": 20,
        "urgency": "high",
        "transferBytes": 1260332,
        "estimatedDeferrableBytes": 225763,
        "renderBlockingMs": 1630,
        "breakdown": {
          "offscreenImageSavings": 87109,
          "unusedJavascriptSavings": 54721,
          "unusedCssSavings": 83933
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 87109,
            "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": "medium",
            "estimatedSavingsBytes": 54721,
            "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": "high",
            "estimatedSavingsBytes": 83933,
            "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": "Eliminate render-blocking resources",
            "area": "render-path",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1630,
            "strategy": "Defer scripts/styles not required for first paint and preload only truly critical assets.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-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 www.barcelona.cat",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 132259,
            "url": "https://www.barcelona.cat/sites/default/files/styles/destacat_gran/public/Activitats%20Esportives%20organitzades_4.jpg?itok=BGtEX0JK",
            "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": 64,
        "urgency": "high",
        "providerCount": 7,
        "requestCount": 8,
        "transferBytes": 139455,
        "notGreenCount": 5,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76425,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15565,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7144,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 268,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=1wfJA2&url=https%3A%2F%2Fwww.barcelona.cat%2Fca%2Fque-pots-fer-a-bcn%2Fbanys-i-platges%2Fesport-les-platges",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "high",
            "detail": "Track 7 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."
          },
          {
            "title": "Prioritize greener alternatives for third-party providers",
            "urgency": "high",
            "detail": "5 third-party script origin(s) are not confirmed green in the Green Web Foundation dataset."
          }
        ]
      },
      "redundancy": {
        "score": 16,
        "urgency": "medium",
        "transferBytes": 1260332,
        "estimatedRedundantBytes": 138654,
        "redundancyRatio": 0.11001386936140636,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 83933,
            "displayValue": "Est savings of 82 KiB"
          },
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 54721,
            "displayValue": "Est savings of 53 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 83933,
            "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 unused javascript",
            "urgency": "medium",
            "estimatedSavingsBytes": 54721,
            "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 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": 29,
        "urgency": "medium",
        "totalTransferBytes": 1260332,
        "heavyRequestCount": 7,
        "heavyBytes": 628947,
        "heavyRatio": 0.49903279453350385,
        "heavyRequests": [
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/destacat_gran/public/Activitats%20Esportives%20organitzades_4.jpg?itok=BGtEX0JK",
            "transferSize": 132259,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/destacat_gran/public/20150105_surfistes_paola_de_grenet001_3_1.jpg?itok=Th6sVJim",
            "transferSize": 113812,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/destacat_gran/public/pesca02_pixabay_1_1.jpg?itok=rasnPFWG",
            "transferSize": 109038,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "transferSize": 90560,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "transferSize": 76425,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "cdn.matomo.cloud"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament/fonts/icoajuntament.ttf?8aaig7",
            "transferSize": 54919,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/css/css_qDD4BCxE8K-iT7MRORwp32v03DlJblP9-xrYwOBWlQo.css?delta=5&language=ca&theme=barcelonacat_theme&include=eJyFz0FqxTAMBNALxd-LHsiMHTVxcSQjyenP7Wso_FJI6Upi5m0GH4MdB7EnnNXE4vcJ6HXJ0EJNGAWe5CTVupLFqUdwkTb7v0zHRuGs9Pkb-E4HxSzi5oqeysp34B1crizPu25rktGC-dUqb3eiFgl47boTJmNmycCW3v4DXWXJhdNkivj6Ej2dlNGWDsU21-wWVx0d7fGTPAb3kVu1ndbFLnM6YobRF2idlFA&tcut5n",
            "transferSize": 51934,
            "resourceType": "stylesheet",
            "mimeType": "text/css",
            "domain": "www.barcelona.cat"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "image",
            "count": 3,
            "transferBytes": 355109
          },
          {
            "resourceType": "font",
            "count": 2,
            "transferBytes": 145479
          },
          {
            "resourceType": "script",
            "count": 1,
            "transferBytes": 76425
          },
          {
            "resourceType": "stylesheet",
            "count": 1,
            "transferBytes": 51934
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.barcelona.cat",
            "count": 6,
            "transferBytes": 552522
          },
          {
            "domain": "cdn.matomo.cloud",
            "count": 1,
            "transferBytes": 76425
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Lazy-load offscreen images and media galleries",
            "urgency": "medium",
            "estimatedSavingsBytes": 87109,
            "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": "medium",
            "estimatedSavingsBytes": 54721,
            "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": "Defer non-critical UI modules until after first render",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "strategy": "Keep only above-the-fold resources in the initial path; hydrate or import secondary modules later.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 www.barcelona.cat",
            "urgency": "medium",
            "estimatedSavingsBytes": 132259,
            "strategy": "Serve a smaller placeholder first and load this asset only when the user scrolls to or requests the component.",
            "url": "https://www.barcelona.cat/sites/default/files/styles/destacat_gran/public/Activitats%20Esportives%20organitzades_4.jpg?itok=BGtEX0JK",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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.11,
          "displayValue": "6.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: 6.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 53 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 53 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,
          "displayValue": "Est savings of 82 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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 82 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,
          "displayValue": "Est savings of 447 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 447 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 366 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 366 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,
          "displayValue": "Est savings of 85 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 85 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": "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": 0,
          "displayValue": "Est savings of 1,630 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 Eliminate render-blocking resources\n\n- Lighthouse audit: render-blocking-resources\n- Current value: Est savings of 1,630 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\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": "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": 0.88,
          "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 Speed Index\n\n- Lighthouse audit: speed-index\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\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": "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": "1,018 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: 1,018 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://barcelona.cat/ca/que-pots-fer-a-bcn/cultura",
      "status": "ok",
      "finalUrl": "https://www.barcelona.cat/ca/que-pots-fer-a-bcn/cultura",
      "performanceScore": 0.46,
      "bestPracticesScore": 1,
      "transferBytes": 1509084,
      "co2Grams": 0.5781020114376,
      "greenWeb": {
        "page": {
          "hostname": "www.barcelona.cat",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-13T22:38:00.231825",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.barcelona.cat",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76425,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "stylesheet",
            "requestCount": 1,
            "transferBytes": 24654,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "cdnjs.cloudflare.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15870,
            "sampleUrl": "https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js",
            "greenCheck": {
              "hostname": "cdnjs.cloudflare.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:34",
              "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/cdnjs.cloudflare.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15565,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7145,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 4109,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/css/bcn-avisos.css",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "fonts.googleapis.com",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 2483,
            "sampleUrl": "https://fonts.googleapis.com/css?family=Source+Sans+3:200,200i,300,300i,400,400i,500,500i,600,600i,700,700i,900,900i",
            "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
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=bGZQR6&url=https%3A%2F%2Fwww.barcelona.cat%2Fca%2Fque-pots-fer-a-bcn%2Fcultura",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 11,
          "greenCount": 5,
          "notGreenCount": 7,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 60,
        "urgency": "high",
        "pageElementOccurrences": 1,
        "uniqueElementsAssessed": 1,
        "reusedFromCacheCount": 1,
        "components": [
          {
            "signature": "form|get|/ca|input|text|query|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "text",
            "fieldName": "query",
            "formContext": "form|get|/ca",
            "hasLabel": true,
            "hasValidationRule": false,
            "hasErrorMessagingHook": false,
            "toolingFriendly": false,
            "assessment": {
              "score": 60,
              "urgency": "high",
              "issues": [
                "No explicit validation rule",
                "No error messaging hook",
                "Missing autocomplete for tooling support"
              ],
              "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.",
                "Provide meaningful autocomplete values to support browsers and assistive tooling."
              ]
            },
            "reusedFromCache": true
          }
        ],
        "recommendations": [
          {
            "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."
          },
          {
            "title": "Missing autocomplete for tooling support",
            "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": "Cultura 100% | Barcelona.cat | Ajuntament de Barcelona",
          "lang": "ca",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "Tota l'oferta cultural de Barcelona al teu abast: festivals, concerts, museus, literatura i cinema.",
          "robots": "",
          "canonical": "https://www.barcelona.cat/ca/que-pots-fer-a-bcn/cultura",
          "ogTitle": "Cultura 100%",
          "ogDescription": "Viu la cultura de Barcelona. Des de grans concerts i festivals fins a les exposicions dels nostres museus i teatres. Consulta l'agenda oficial i no et perdis cap esdeveniment a la ciutat.",
          "ogType": "Web",
          "ogUrl": "https://www.barcelona.cat/ca/que-pots-fer-a-bcn/cultura",
          "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": 44,
          "tabletSmallTapTargets": 41,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 44,
            "oversizedMedia": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 41,
            "oversizedMedia": 0
          }
        ],
        "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 41 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 59,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": true,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": true,
          "externalScriptCount": 8,
          "externalScriptsWithoutIntegrity": 8,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "cache-control": "max-age=300, public",
            "content-encoding": "gzip",
            "content-language": "ca",
            "content-length": "12795",
            "content-type": "text/html; charset=UTF-8",
            "date": "Mon, 13 Apr 2026 22:52:12 GMT",
            "etag": "\"1776120731-gzip\"",
            "expires": "Sun, 19 Nov 1978 05:00:00 GMT",
            "last-modified": "Mon, 13 Apr 2026 22:52:11 GMT",
            "server": "nginx",
            "vary": "Cookie,Accept-Encoding",
            "via": "1.1 ca2190123e61f1744d1210c24c87c840.cloudfront.net (CloudFront)",
            "x-amz-cf-id": "F_D3nICxdpeE0lyxqTdNwqmJlXtRoKhGLg6PXwMyhl05OWrou74q0w==",
            "x-amz-cf-pop": "IAD12-P5",
            "x-cache": "Miss from cloudfront",
            "x-content-type-options": "nosniff",
            "x-frame-options": "SAMEORIGIN",
            "x-generator": "Drupal 10 (https://www.drupal.org)"
          },
          "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": "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": "8 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 25,
        "urgency": "low",
        "origin": "https://www.barcelona.cat",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://www.barcelona.cat/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/sitemap.xml",
            "found": true,
            "status": 200,
            "contentType": "application/xml; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/manifest.webmanifest",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/favicon.ico",
            "found": true,
            "status": 200,
            "contentType": "image/x-icon"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "low",
            "detail": "Missing beneficial file(s): /.well-known/security.txt, /manifest.webmanifest."
          }
        ]
      },
      "mediaHints": {
        "score": 48,
        "urgency": "medium",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 27,
          "imagesWithLazy": 1,
          "imagesWithoutLazy": 26
        },
        "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": "26 of 27 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 85,
        "urgency": "medium",
        "data": {
          "hasPrintStyles": true,
          "hasReducedMotion": true,
          "media": {
            "totalImages": 32,
            "lazyImages": 2,
            "totalIframes": 1,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "\"Source Sans Pro\", \"Helvetica Neue\", Helvetica, Arial, sans-serif",
            "usesSystemFont": true
          },
          "tracking": {
            "count": 0,
            "scripts": []
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 2/32 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": "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"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 53,
        "urgency": "medium",
        "totalEstimatedSavingsBytes": 794713.6499999999,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Use modern image compression formats",
            "urgency": "high",
            "estimatedSavingsBytes": 512105.64999999997,
            "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": 282608,
            "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: 500.10 KB."
          },
          {
            "title": "Improve image encoding quality/size",
            "urgency": "high",
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 275.98 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": 1002389.6499999999,
        "totalEstimatedBlockingMs": 1775,
        "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": 512105.64999999997,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 500 KiB",
            "urgency": "high",
            "sourceAuditId": "modern-image-formats"
          },
          {
            "id": "uses-optimized-images",
            "title": "Compress oversized image assets",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss.",
            "estimatedSavingsBytes": 282608,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 276 KiB",
            "urgency": "high",
            "sourceAuditId": "uses-optimized-images"
          },
          {
            "id": "render-blocking-resources",
            "title": "Eliminate render-blocking resources",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering.",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1775,
            "displayValue": "Est savings of 1,780 ms",
            "urgency": "high",
            "sourceAuditId": "render-blocking-resources"
          },
          {
            "id": "unused-css-rules",
            "title": "Remove unused CSS",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped.",
            "estimatedSavingsBytes": 91534,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 89 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-css-rules"
          },
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 83661,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 82 KiB",
            "urgency": "medium",
            "sourceAuditId": "offscreen-images"
          },
          {
            "id": "unused-javascript",
            "title": "Remove unused JavaScript",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code.",
            "estimatedSavingsBytes": 32481,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 32 KiB",
            "urgency": "low",
            "sourceAuditId": "unused-javascript"
          }
        ],
        "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: 500.10 KB."
          },
          {
            "title": "Compress oversized image assets",
            "urgency": "high",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 275.98 KB."
          },
          {
            "title": "Eliminate render-blocking resources",
            "urgency": "high",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering. Estimated render unblocking: 1775 ms."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "medium",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 89.39 KB."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "medium",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 81.70 KB."
          },
          {
            "title": "Remove unused JavaScript",
            "urgency": "low",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 31.72 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": 10,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 8,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "8 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": 545599.0522346367
        },
        "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: 532.81 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: 532.81 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": 6,
        "urgency": "medium",
        "transferBytes": 1509084,
        "css": {
          "unusedBytes": 91534,
          "ratio": 0.06065533794010141,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 32481,
          "duplicatedBytes": 0,
          "ratio": 0.021523652758892148,
          "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": "high",
            "estimatedSavingsBytes": 91534,
            "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": "medium",
            "estimatedSavingsBytes": 32481,
            "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": 1509084,
        "estimatedDeferrableBytes": 207676,
        "renderBlockingMs": 1775,
        "breakdown": {
          "offscreenImageSavings": 83661,
          "unusedJavascriptSavings": 32481,
          "unusedCssSavings": 91534
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 83661,
            "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": "medium",
            "estimatedSavingsBytes": 32481,
            "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": "high",
            "estimatedSavingsBytes": 91534,
            "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": "Eliminate render-blocking resources",
            "area": "render-path",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1775,
            "strategy": "Defer scripts/styles not required for first paint and preload only truly critical assets.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-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 www.barcelona.cat",
            "area": "image",
            "urgency": "high",
            "estimatedSavingsBytes": 234300,
            "url": "https://www.barcelona.cat/sites/default/files/styles/distribuidora_interior/public/vela_529x410.jpg?itok=j8dMY-nO",
            "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 www.barcelona.cat",
            "area": "font",
            "urgency": "medium",
            "estimatedSavingsBytes": 90560,
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "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 estatics-nasia.dtibcn.cat",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 85080,
            "url": "https://estatics-nasia.dtibcn.cat/nasia-pro/media/estunen.570x321.792fd017.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": 65,
        "urgency": "high",
        "providerCount": 8,
        "requestCount": 9,
        "transferBytes": 155327,
        "notGreenCount": 5,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76425,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "cdnjs.cloudflare.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15870,
            "sampleUrl": "https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js",
            "greenCheck": {
              "hostname": "cdnjs.cloudflare.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:34",
              "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/cdnjs.cloudflare.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15565,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7145,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=bGZQR6&url=https%3A%2F%2Fwww.barcelona.cat%2Fca%2Fque-pots-fer-a-bcn%2Fcultura",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "high",
            "detail": "Track 8 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."
          },
          {
            "title": "Prioritize greener alternatives for third-party providers",
            "urgency": "high",
            "detail": "5 third-party script origin(s) are not confirmed green in the Green Web Foundation dataset."
          }
        ]
      },
      "redundancy": {
        "score": 15,
        "urgency": "low",
        "transferBytes": 1509084,
        "estimatedRedundantBytes": 124015,
        "redundancyRatio": 0.08217899069899356,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 91534,
            "displayValue": "Est savings of 89 KiB"
          },
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 32481,
            "displayValue": "Est savings of 32 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 91534,
            "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 unused javascript",
            "urgency": "medium",
            "estimatedSavingsBytes": 32481,
            "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 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": 20,
        "urgency": "medium",
        "totalTransferBytes": 1509084,
        "heavyRequestCount": 5,
        "heavyBytes": 505311,
        "heavyRatio": 0.33484617158488195,
        "heavyRequests": [
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/distribuidora_interior/public/vela_529x410.jpg?itok=j8dMY-nO",
            "transferSize": 234300,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "transferSize": 90560,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "transferSize": 76425,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "cdn.matomo.cloud"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament/fonts/icoajuntament.ttf?8aaig7",
            "transferSize": 54921,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/css/css_evpTRQTawGYS1Ro7RbXq3hBxwat7AU-RJm1V8ZgzeaE.css?delta=5&language=ca&theme=barcelonacat_theme&include=eJyFz0FuxCAMBdALwbDogdAHXEJLMMIm07l9kSo1Gk2qrmz9_xY2PmZT7NTU4yjC4n6GRS8GZ5lngUtQ6iV-0nit6B2zqpiAEalyQ4R6PmiMkkjcktMqc139X6Yjkz0K3Z-BbrSTC8wqOtB9TO0K5MoB1Yo-amn5SpTI9rz7SvC9XsXCc2Ve0MS__Qf6YBNi84sNuN_N05fSaKimYyCvRzZxacyOejuT22x9hlpko2TkIUq7CxD6Boxdpuo&tcut5n",
            "transferSize": 49105,
            "resourceType": "stylesheet",
            "mimeType": "text/css",
            "domain": "www.barcelona.cat"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "image",
            "count": 1,
            "transferBytes": 234300
          },
          {
            "resourceType": "font",
            "count": 2,
            "transferBytes": 145481
          },
          {
            "resourceType": "script",
            "count": 1,
            "transferBytes": 76425
          },
          {
            "resourceType": "stylesheet",
            "count": 1,
            "transferBytes": 49105
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.barcelona.cat",
            "count": 4,
            "transferBytes": 428886
          },
          {
            "domain": "cdn.matomo.cloud",
            "count": 1,
            "transferBytes": 76425
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Lazy-load offscreen images and media galleries",
            "urgency": "medium",
            "estimatedSavingsBytes": 83661,
            "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": "Defer non-critical UI modules until after first render",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "strategy": "Keep only above-the-fold resources in the initial path; hydrate or import secondary modules later.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 www.barcelona.cat",
            "urgency": "medium",
            "estimatedSavingsBytes": 234300,
            "strategy": "Serve a smaller placeholder first and load this asset only when the user scrolls to or requests the component.",
            "url": "https://www.barcelona.cat/sites/default/files/styles/distribuidora_interior/public/vela_529x410.jpg?itok=j8dMY-nO",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 www.barcelona.cat",
            "urgency": "medium",
            "estimatedSavingsBytes": 90560,
            "strategy": "Subset or defer this font so full font payloads are only fetched when needed.",
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 cdn.matomo.cloud",
            "urgency": "medium",
            "estimatedSavingsBytes": 76425,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.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.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-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,
          "displayValue": "Est savings of 89 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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 89 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,
          "displayValue": "Est savings of 500 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 500 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 276 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 276 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": "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": 0,
          "displayValue": "Est savings of 1,780 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 Eliminate render-blocking resources\n\n- Lighthouse audit: render-blocking-resources\n- Current value: Est savings of 1,780 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\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": "server-response-time",
          "title": "Reduce initial server response time",
          "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": 0,
          "displayValue": "Root document took 1,000 ms",
          "impact": "high",
          "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 Reduce initial server response time\n\n- Lighthouse audit: server-response-time\n- Current value: Root document took 1,000 ms\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": "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": 0.67,
          "displayValue": "4.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 Speed Index\n\n- Lighthouse audit: speed-index\n- Current value: 4.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\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": 0.5,
          "displayValue": "Est savings of 32 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 32 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.5,
          "displayValue": "Est savings of 82 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 82 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": "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": "1,092 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: 1,092 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://barcelona.cat/es/vivir-en-bcn/con-accesibilidad",
      "status": "ok",
      "finalUrl": "https://www.barcelona.cat/es/vivir-en-bcn/con-accesibilidad",
      "performanceScore": 0.68,
      "bestPracticesScore": 1,
      "transferBytes": 2048512,
      "co2Grams": 0.7847468448768001,
      "greenWeb": {
        "page": {
          "hostname": "www.barcelona.cat",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-13T22:38:00.231825",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.barcelona.cat",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76426,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "stylesheet",
            "requestCount": 1,
            "transferBytes": 24657,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15565,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7142,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 4110,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/css/bcn-avisos.css",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "fonts.googleapis.com",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 2483,
            "sampleUrl": "https://fonts.googleapis.com/css?family=Source+Sans+3:200,200i,300,300i,400,400i,500,500i,600,600i,700,700i,900,900i",
            "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
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=BvGw8u&url=https%3A%2F%2Fwww.barcelona.cat%2Fes%2Fvivir-en-bcn%2Fcon-accesibilidad",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 10,
          "greenCount": 4,
          "notGreenCount": 7,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 60,
        "urgency": "high",
        "pageElementOccurrences": 1,
        "uniqueElementsAssessed": 1,
        "reusedFromCacheCount": 1,
        "components": [
          {
            "signature": "form|get|/es/|input|text|query|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "text",
            "fieldName": "query",
            "formContext": "form|get|/es/",
            "hasLabel": true,
            "hasValidationRule": false,
            "hasErrorMessagingHook": false,
            "toolingFriendly": false,
            "assessment": {
              "score": 60,
              "urgency": "high",
              "issues": [
                "No explicit validation rule",
                "No error messaging hook",
                "Missing autocomplete for tooling support"
              ],
              "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.",
                "Provide meaningful autocomplete values to support browsers and assistive tooling."
              ]
            },
            "reusedFromCache": true
          }
        ],
        "recommendations": [
          {
            "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."
          },
          {
            "title": "Missing autocomplete for tooling support",
            "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": "Accesibilidad | Barcelona.cat | Ayuntamiento de Barcelona",
          "lang": "es",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "Consulta los servicios de transporte, vivienda e inserción laboral para personas con problemas de movilidad en Barcelona.",
          "robots": "",
          "canonical": "https://www.barcelona.cat/es/vivir-en-bcn/con-accesibilidad",
          "ogTitle": "Barcelona, una ciudad accesible para ti",
          "ogDescription": "Trabajamos por una ciudad accesible. Consulta los recursos de transporte adaptado y vivienda para personas con problemas de movilidad en Barcelona.",
          "ogType": "Web",
          "ogUrl": "https://www.barcelona.cat/es/vivir-en-bcn/con-accesibilidad",
          "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": 64,
          "tabletSmallTapTargets": 61,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 64,
            "oversizedMedia": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 61,
            "oversizedMedia": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 64 small targets on mobile and 61 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 59,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": true,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": true,
          "externalScriptCount": 7,
          "externalScriptsWithoutIntegrity": 7,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "cache-control": "max-age=300, public",
            "content-encoding": "gzip",
            "content-language": "es",
            "content-length": "13718",
            "content-type": "text/html; charset=UTF-8",
            "date": "Mon, 13 Apr 2026 22:52:26 GMT",
            "etag": "\"1776120746-gzip\"",
            "expires": "Sun, 19 Nov 1978 05:00:00 GMT",
            "last-modified": "Mon, 13 Apr 2026 22:52:26 GMT",
            "server": "nginx",
            "vary": "Cookie,Accept-Encoding",
            "via": "1.1 ca2190123e61f1744d1210c24c87c840.cloudfront.net (CloudFront)",
            "x-amz-cf-id": "Br-k199R12Dj2RBVWeWol52FJWoNi7fZ-toSsFw3moTsTmTNy8imoA==",
            "x-amz-cf-pop": "IAD12-P5",
            "x-cache": "Miss from cloudfront",
            "x-content-type-options": "nosniff",
            "x-frame-options": "SAMEORIGIN",
            "x-generator": "Drupal 10 (https://www.drupal.org)"
          },
          "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": "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": "7 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 25,
        "urgency": "low",
        "origin": "https://www.barcelona.cat",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://www.barcelona.cat/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/sitemap.xml",
            "found": true,
            "status": 200,
            "contentType": "application/xml; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/manifest.webmanifest",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/favicon.ico",
            "found": true,
            "status": 200,
            "contentType": "image/x-icon"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "low",
            "detail": "Missing beneficial file(s): /.well-known/security.txt, /manifest.webmanifest."
          }
        ]
      },
      "mediaHints": {
        "score": 20,
        "urgency": "low",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 24,
          "imagesWithLazy": 13,
          "imagesWithoutLazy": 11
        },
        "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."
          }
        ]
      },
      "wsgCustom": {
        "score": 85,
        "urgency": "medium",
        "data": {
          "hasPrintStyles": true,
          "hasReducedMotion": true,
          "media": {
            "totalImages": 29,
            "lazyImages": 14,
            "totalIframes": 1,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "\"Source Sans Pro\", \"Helvetica Neue\", Helvetica, Arial, sans-serif",
            "usesSystemFont": true
          },
          "tracking": {
            "count": 0,
            "scripts": []
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 14/29 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": "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"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 100,
        "urgency": "high",
        "totalEstimatedSavingsBytes": 2069111.4000000001,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Use modern image compression formats",
            "urgency": "high",
            "estimatedSavingsBytes": 1130845.4000000001,
            "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": 938266,
            "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: 1.08 MB."
          },
          {
            "title": "Improve image encoding quality/size",
            "urgency": "high",
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 916.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": 2218781.4000000004,
        "totalEstimatedBlockingMs": 1608,
        "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": 1130845.4000000001,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 1,104 KiB",
            "urgency": "high",
            "sourceAuditId": "modern-image-formats"
          },
          {
            "id": "uses-optimized-images",
            "title": "Compress oversized image assets",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss.",
            "estimatedSavingsBytes": 938266,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 916 KiB",
            "urgency": "high",
            "sourceAuditId": "uses-optimized-images"
          },
          {
            "id": "render-blocking-resources",
            "title": "Eliminate render-blocking resources",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering.",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1608,
            "displayValue": "Est savings of 1,610 ms",
            "urgency": "high",
            "sourceAuditId": "render-blocking-resources"
          },
          {
            "id": "unused-css-rules",
            "title": "Remove unused CSS",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped.",
            "estimatedSavingsBytes": 83596,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 82 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-css-rules"
          },
          {
            "id": "unused-javascript",
            "title": "Remove unused JavaScript",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code.",
            "estimatedSavingsBytes": 58173,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 57 KiB",
            "urgency": "medium",
            "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": 7901,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 8 KiB",
            "urgency": "low",
            "sourceAuditId": "offscreen-images"
          }
        ],
        "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.08 MB."
          },
          {
            "title": "Compress oversized image assets",
            "urgency": "high",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 916.28 KB."
          },
          {
            "title": "Eliminate render-blocking resources",
            "urgency": "high",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering. Estimated render unblocking: 1608 ms."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "medium",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 81.64 KB."
          },
          {
            "title": "Remove unused JavaScript",
            "urgency": "medium",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 56.81 KB."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "low",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 7.72 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": 10,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 7,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "7 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": 167988.4332053073
        },
        "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: 164.05 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: 164.05 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": "medium",
        "transferBytes": 2048512,
        "css": {
          "unusedBytes": 83596,
          "ratio": 0.04080815733566608,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 58173,
          "duplicatedBytes": 0,
          "ratio": 0.028397685734816297,
          "auditIds": [
            "unused-javascript",
            "duplicated-javascript"
          ]
        },
        "html": {
          "estimatedPenalty": 0.25,
          "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": "high",
            "estimatedSavingsBytes": 83596,
            "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": "medium",
            "estimatedSavingsBytes": 58173,
            "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": 2048512,
        "estimatedDeferrableBytes": 149670,
        "renderBlockingMs": 1608,
        "breakdown": {
          "offscreenImageSavings": 7901,
          "unusedJavascriptSavings": 58173,
          "unusedCssSavings": 83596
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 7901,
            "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": "medium",
            "estimatedSavingsBytes": 58173,
            "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": "high",
            "estimatedSavingsBytes": 83596,
            "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": "Eliminate render-blocking resources",
            "area": "render-path",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1608,
            "strategy": "Defer scripts/styles not required for first paint and preload only truly critical assets.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-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 www.barcelona.cat",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 144968,
            "url": "https://www.barcelona.cat/sites/default/files/styles/distribuidora_central/public/amb%20accessibilitat-lleure-platges_1.jpg?itok=1zQaB9x8",
            "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": 64,
        "urgency": "high",
        "providerCount": 7,
        "requestCount": 8,
        "transferBytes": 139455,
        "notGreenCount": 5,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76426,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15565,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7142,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=BvGw8u&url=https%3A%2F%2Fwww.barcelona.cat%2Fes%2Fvivir-en-bcn%2Fcon-accesibilidad",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "high",
            "detail": "Track 7 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."
          },
          {
            "title": "Prioritize greener alternatives for third-party providers",
            "urgency": "high",
            "detail": "5 third-party script origin(s) are not confirmed green in the Green Web Foundation dataset."
          }
        ]
      },
      "redundancy": {
        "score": 24,
        "urgency": "medium",
        "transferBytes": 2048512,
        "estimatedRedundantBytes": 141769,
        "redundancyRatio": 0.06920584307048237,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 83596,
            "displayValue": "Est savings of 82 KiB"
          },
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 58173,
            "displayValue": "Est savings of 57 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 83596,
            "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 unused javascript",
            "urgency": "medium",
            "estimatedSavingsBytes": 58173,
            "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 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": 27,
        "urgency": "high",
        "totalTransferBytes": 2048512,
        "heavyRequestCount": 9,
        "heavyBytes": 900260,
        "heavyRatio": 0.4394702105723569,
        "heavyRequests": [
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/distribuidora_central/public/amb%20accessibilitat-lleure-platges_1.jpg?itok=1zQaB9x8",
            "transferSize": 144968,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/destacat_gran/public/amb%20accessibilitat-educaci%C3%B3%20.jpg?itok=edC-2UKO",
            "transferSize": 137717,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/distribuidora_central/public/amb%20accessibilitat-lleure%204573_1.jpg?itok=P2e6LlsC",
            "transferSize": 118494,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/distribuidora_central/public/equipaments_528x228_1.jpg?itok=M_WVCO9N",
            "transferSize": 112997,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/distribuidora_central/public/amb%20accessibilitat-lleure-esports%201590_1.jpg?itok=vSnyOxTT",
            "transferSize": 112245,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "transferSize": 90560,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "transferSize": 76426,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "cdn.matomo.cloud"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament/fonts/icoajuntament.ttf?8aaig7",
            "transferSize": 54919,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/css/css_qDD4BCxE8K-iT7MRORwp32v03DlJblP9-xrYwOBWlQo.css?delta=5&language=es&theme=barcelonacat_theme&include=eJyFz8GOwyAMBNAfCuXQD0ID8SasiI2wSZu_X6RKXa3EqidbM-8y-O5sOIgt4Mwq6l_HoeYloiUqwkiwICe1lldSP3R3JlJG_5-p2MidmR5_ge10kI8iptZQQ1p5Br7A6YrynHVbkYji1K6SeZuJnMThvWsm5FFmsUofWVCwhvsnUJssMXEYrMG_v0BPo8YoS0XDNkbu6tfWK8rtN7l1rj2WrDuti15qdPgIpR8d6Z1O&tcut5n",
            "transferSize": 51934,
            "resourceType": "stylesheet",
            "mimeType": "text/css",
            "domain": "www.barcelona.cat"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "image",
            "count": 5,
            "transferBytes": 626421
          },
          {
            "resourceType": "font",
            "count": 2,
            "transferBytes": 145479
          },
          {
            "resourceType": "script",
            "count": 1,
            "transferBytes": 76426
          },
          {
            "resourceType": "stylesheet",
            "count": 1,
            "transferBytes": 51934
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.barcelona.cat",
            "count": 8,
            "transferBytes": 823834
          },
          {
            "domain": "cdn.matomo.cloud",
            "count": 1,
            "transferBytes": 76426
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Split JavaScript by route or interaction",
            "urgency": "medium",
            "estimatedSavingsBytes": 58173,
            "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": "Defer non-critical UI modules until after first render",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "strategy": "Keep only above-the-fold resources in the initial path; hydrate or import secondary modules later.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 www.barcelona.cat",
            "urgency": "medium",
            "estimatedSavingsBytes": 144968,
            "strategy": "Serve a smaller placeholder first and load this asset only when the user scrolls to or requests the component.",
            "url": "https://www.barcelona.cat/sites/default/files/styles/distribuidora_central/public/amb%20accessibilitat-lleure-platges_1.jpg?itok=1zQaB9x8",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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.06,
          "displayValue": "7.0 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.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,
          "displayValue": "Est savings of 57 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 57 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,
          "displayValue": "Est savings of 82 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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 82 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,
          "displayValue": "Est savings of 1,104 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,104 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 916 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 916 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": "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": 0,
          "displayValue": "Est savings of 1,610 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 Eliminate render-blocking resources\n\n- Lighthouse audit: render-blocking-resources\n- Current value: Est savings of 1,610 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\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": "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,
          "displayValue": "1,146 elements",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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: 1,146 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"
        },
        {
          "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": 0.88,
          "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 Speed Index\n\n- Lighthouse audit: speed-index\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\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": "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 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 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://barcelona.cat/en/what-to-do-in-bcn/montjuic-park/activities/list",
      "status": "ok",
      "finalUrl": "https://www.barcelona.cat/en/what-to-do-in-bcn/montjuic-park/activities/list",
      "performanceScore": 0.64,
      "bestPracticesScore": 1,
      "transferBytes": 1491679,
      "co2Grams": 0.5714344796706,
      "greenWeb": {
        "page": {
          "hostname": "www.barcelona.cat",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-13T22:38:00.231825",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.barcelona.cat",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76425,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "stylesheet",
            "requestCount": 1,
            "transferBytes": 24659,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "cdnjs.cloudflare.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15867,
            "sampleUrl": "https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js",
            "greenCheck": {
              "hostname": "cdnjs.cloudflare.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:34",
              "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/cdnjs.cloudflare.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15565,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7144,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 4111,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/css/bcn-avisos.css",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "fonts.googleapis.com",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 2481,
            "sampleUrl": "https://fonts.googleapis.com/css?family=Source+Sans+3:200,200i,300,300i,400,400i,500,500i,600,600i,700,700i,900,900i",
            "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
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=E7OW2P&url=https%3A%2F%2Fwww.barcelona.cat%2Fen%2Fwhat-to-do-in-bcn%2Fmontjuic-park%2Factivities%2Flist",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 11,
          "greenCount": 5,
          "notGreenCount": 7,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 75,
        "urgency": "high",
        "pageElementOccurrences": 8,
        "uniqueElementsAssessed": 2,
        "reusedFromCacheCount": 2,
        "components": [
          {
            "signature": "form|get|/en|input|text|query|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "text",
            "fieldName": "query",
            "formContext": "form|get|/en",
            "hasLabel": true,
            "hasValidationRule": false,
            "hasErrorMessagingHook": false,
            "toolingFriendly": false,
            "assessment": {
              "score": 60,
              "urgency": "high",
              "issues": [
                "No explicit validation rule",
                "No error messaging hook",
                "Missing autocomplete for tooling support"
              ],
              "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.",
                "Provide meaningful autocomplete values to support browsers and assistive tooling."
              ]
            },
            "reusedFromCache": true
          },
          {
            "signature": "no-form|select|select|anonymous|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "select",
            "fieldName": null,
            "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": "No explicit validation rule",
            "urgency": "medium",
            "detail": "2 unique form control signature(s) on this page include this issue."
          },
          {
            "title": "No error messaging hook",
            "urgency": "medium",
            "detail": "2 unique form control signature(s) on this page include this issue."
          },
          {
            "title": "Missing autocomplete for tooling support",
            "urgency": "medium",
            "detail": "1 unique form control signature(s) on this page include this issue."
          },
          {
            "title": "Missing associated label",
            "urgency": "high",
            "detail": "1 unique form control signature(s) on this page include this issue."
          }
        ]
      },
      "metadata": {
        "score": 25,
        "urgency": "low",
        "checks": {
          "hasTitle": true,
          "hasLang": true,
          "hasDescription": false,
          "hasCanonical": true,
          "hasOpenGraphCore": false,
          "hasTwitterCard": true,
          "hasViewport": true,
          "hasCharset": true,
          "hasValidStructuredData": true,
          "hasInvalidStructuredData": false
        },
        "observed": {
          "title": "The agenda of the park | Barcelona.cat | Ajuntament de Barcelona",
          "lang": "en",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "",
          "robots": "",
          "canonical": "https://www.barcelona.cat/en/what-to-do-in-bcn/montjuic-park/activities/list",
          "ogTitle": "The agenda of the park",
          "ogDescription": "",
          "ogType": "Web",
          "ogUrl": "https://www.barcelona.cat/en/what-to-do-in-bcn/montjuic-park/activities/list",
          "twitterCard": "summary_large_image",
          "ldJsonCount": 0,
          "validLdJsonCount": 0,
          "invalidLdJsonCount": 0
        },
        "recommendations": [
          {
            "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."
          }
        ]
      },
      "layoutAdaptation": {
        "score": 30,
        "urgency": "medium",
        "checks": {
          "testedMobile": true,
          "testedTablet": true,
          "horizontalOverflowOnMobile": false,
          "horizontalOverflowOnTablet": false,
          "mobileSmallTapTargets": 72,
          "tabletSmallTapTargets": 72,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 72,
            "oversizedMedia": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 72,
            "oversizedMedia": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 72 small targets on mobile and 72 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 59,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": true,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": true,
          "externalScriptCount": 8,
          "externalScriptsWithoutIntegrity": 8,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "cache-control": "max-age=300, public",
            "content-encoding": "gzip",
            "content-language": "en",
            "content-length": "12869",
            "content-type": "text/html; charset=UTF-8",
            "date": "Mon, 13 Apr 2026 22:52:42 GMT",
            "etag": "\"1776120760-gzip\"",
            "expires": "Sun, 19 Nov 1978 05:00:00 GMT",
            "last-modified": "Mon, 13 Apr 2026 22:52:40 GMT",
            "server": "nginx",
            "vary": "Cookie,Accept-Encoding",
            "via": "1.1 ca2190123e61f1744d1210c24c87c840.cloudfront.net (CloudFront)",
            "x-amz-cf-id": "7IEvJnqEW88CMFO-TooKbGKcgsw4euBMYSbYGmhzelm2UNH2js2yhw==",
            "x-amz-cf-pop": "IAD12-P5",
            "x-cache": "Miss from cloudfront",
            "x-content-type-options": "nosniff",
            "x-frame-options": "SAMEORIGIN",
            "x-generator": "Drupal 10 (https://www.drupal.org)"
          },
          "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": "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": "8 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 25,
        "urgency": "low",
        "origin": "https://www.barcelona.cat",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://www.barcelona.cat/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/sitemap.xml",
            "found": true,
            "status": 200,
            "contentType": "application/xml; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/manifest.webmanifest",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/favicon.ico",
            "found": true,
            "status": 200,
            "contentType": "image/x-icon"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "low",
            "detail": "Missing beneficial file(s): /.well-known/security.txt, /manifest.webmanifest."
          }
        ]
      },
      "mediaHints": {
        "score": 50,
        "urgency": "medium",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 21,
          "imagesWithLazy": 0,
          "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 21 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 85,
        "urgency": "medium",
        "data": {
          "hasPrintStyles": true,
          "hasReducedMotion": true,
          "media": {
            "totalImages": 26,
            "lazyImages": 1,
            "totalIframes": 1,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "\"Source Sans Pro\", \"Helvetica Neue\", Helvetica, Arial, sans-serif",
            "usesSystemFont": true
          },
          "tracking": {
            "count": 0,
            "scripts": []
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 1/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": "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"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 43,
        "urgency": "medium",
        "totalEstimatedSavingsBytes": 643825.8500000001,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Use modern image compression formats",
            "urgency": "high",
            "estimatedSavingsBytes": 476042.85000000003,
            "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": 167783,
            "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: 464.89 KB."
          },
          {
            "title": "Improve image encoding quality/size",
            "urgency": "high",
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 163.85 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": 1460507.85,
        "totalEstimatedBlockingMs": 1630,
        "opportunities": [
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 692324,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 676 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": 476042.85000000003,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 465 KiB",
            "urgency": "high",
            "sourceAuditId": "modern-image-formats"
          },
          {
            "id": "render-blocking-resources",
            "title": "Eliminate render-blocking resources",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering.",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1630,
            "displayValue": "Est savings of 1,630 ms",
            "urgency": "high",
            "sourceAuditId": "render-blocking-resources"
          },
          {
            "id": "uses-optimized-images",
            "title": "Compress oversized image assets",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss.",
            "estimatedSavingsBytes": 167783,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 164 KiB",
            "urgency": "medium",
            "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": 91877,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 90 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-css-rules"
          },
          {
            "id": "unused-javascript",
            "title": "Remove unused JavaScript",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code.",
            "estimatedSavingsBytes": 32481,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 32 KiB",
            "urgency": "low",
            "sourceAuditId": "unused-javascript"
          }
        ],
        "recommendations": [
          {
            "title": "Lazy-load offscreen images",
            "urgency": "high",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 676.10 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: 464.89 KB."
          },
          {
            "title": "Eliminate render-blocking resources",
            "urgency": "high",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering. Estimated render unblocking: 1630 ms."
          },
          {
            "title": "Compress oversized image assets",
            "urgency": "medium",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 163.85 KB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "medium",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 89.72 KB."
          },
          {
            "title": "Remove unused JavaScript",
            "urgency": "low",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 31.72 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": 10,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 8,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "8 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": 803154.5168179701
        },
        "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: 784.33 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: 784.33 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": 6,
        "urgency": "medium",
        "transferBytes": 1491679,
        "css": {
          "unusedBytes": 91877,
          "ratio": 0.06159301029242887,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 32481,
          "duplicatedBytes": 0,
          "ratio": 0.021774792029652493,
          "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": "high",
            "estimatedSavingsBytes": 91877,
            "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": "medium",
            "estimatedSavingsBytes": 32481,
            "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": 1491679,
        "estimatedDeferrableBytes": 816682,
        "renderBlockingMs": 1630,
        "breakdown": {
          "offscreenImageSavings": 692324,
          "unusedJavascriptSavings": 32481,
          "unusedCssSavings": 91877
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "high",
            "estimatedSavingsBytes": 692324,
            "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": "medium",
            "estimatedSavingsBytes": 32481,
            "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": "high",
            "estimatedSavingsBytes": 91877,
            "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": "Eliminate render-blocking resources",
            "area": "render-path",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1630,
            "strategy": "Defer scripts/styles not required for first paint and preload only truly critical assets.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-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 estatics-nasia.dtibcn.cat",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 97296,
            "url": "https://estatics-nasia.dtibcn.cat/nasia-pro/media/Ruta_Montjuic_30.570x321.695247dc.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 font from www.barcelona.cat",
            "area": "font",
            "urgency": "medium",
            "estimatedSavingsBytes": 90561,
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "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": 65,
        "urgency": "high",
        "providerCount": 8,
        "requestCount": 9,
        "transferBytes": 155323,
        "notGreenCount": 5,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76425,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "cdnjs.cloudflare.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15867,
            "sampleUrl": "https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js",
            "greenCheck": {
              "hostname": "cdnjs.cloudflare.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:34",
              "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/cdnjs.cloudflare.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15565,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7144,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=E7OW2P&url=https%3A%2F%2Fwww.barcelona.cat%2Fen%2Fwhat-to-do-in-bcn%2Fmontjuic-park%2Factivities%2Flist",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "high",
            "detail": "Track 8 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."
          },
          {
            "title": "Prioritize greener alternatives for third-party providers",
            "urgency": "high",
            "detail": "5 third-party script origin(s) are not confirmed green in the Green Web Foundation dataset."
          }
        ]
      },
      "redundancy": {
        "score": 15,
        "urgency": "low",
        "transferBytes": 1491679,
        "estimatedRedundantBytes": 124358,
        "redundancyRatio": 0.08336780232208135,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 91877,
            "displayValue": "Est savings of 90 KiB"
          },
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 32481,
            "displayValue": "Est savings of 32 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 91877,
            "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 unused javascript",
            "urgency": "medium",
            "estimatedSavingsBytes": 32481,
            "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 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": 21,
        "urgency": "medium",
        "totalTransferBytes": 1491679,
        "heavyRequestCount": 4,
        "heavyBytes": 271002,
        "heavyRatio": 0.18167581631168636,
        "heavyRequests": [
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "transferSize": 90561,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "transferSize": 76425,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "cdn.matomo.cloud"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament/fonts/icoajuntament.ttf?8aaig7",
            "transferSize": 54921,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/css/css_evpTRQTawGYS1Ro7RbXq3hBxwat7AU-RJm1V8ZgzeaE.css?delta=5&language=en&theme=barcelonacat_theme&include=eJyFztEOwiAMheEXgnDhA5EDq4gySmiZ7u1dYuJinPGqTf_voriOqpipqseShcW9hkXLBntMI8NNUGo53qh_JzpjFBUT0CMVrohQzwv1nicSt8lhlbls_ZdpSGSXTPdPoBeayQVmFe1oPk71CKTCAcWKriXXdCRyZLv_fSSEx3bzgir-9A-0zibE6jfW4d6bp4dSryhGVlGaXYDQE_H9jbg&tcut5n",
            "transferSize": 49095,
            "resourceType": "stylesheet",
            "mimeType": "text/css",
            "domain": "www.barcelona.cat"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "font",
            "count": 2,
            "transferBytes": 145482
          },
          {
            "resourceType": "script",
            "count": 1,
            "transferBytes": 76425
          },
          {
            "resourceType": "stylesheet",
            "count": 1,
            "transferBytes": 49095
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.barcelona.cat",
            "count": 3,
            "transferBytes": 194577
          },
          {
            "domain": "cdn.matomo.cloud",
            "count": 1,
            "transferBytes": 76425
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Lazy-load offscreen images and media galleries",
            "urgency": "high",
            "estimatedSavingsBytes": 692324,
            "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": "Defer non-critical UI modules until after first render",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "strategy": "Keep only above-the-fold resources in the initial path; hydrate or import secondary modules later.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 www.barcelona.cat",
            "urgency": "medium",
            "estimatedSavingsBytes": 90561,
            "strategy": "Subset or defer this font so full font payloads are only fetched when needed.",
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 cdn.matomo.cloud",
            "urgency": "medium",
            "estimatedSavingsBytes": 76425,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.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.03,
          "displayValue": "7.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: 7.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,
          "displayValue": "Est savings of 90 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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 90 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,
          "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 164 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 164 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,
          "displayValue": "Est savings of 676 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 676 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": "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": 0,
          "displayValue": "Est savings of 1,630 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 Eliminate render-blocking resources\n\n- Lighthouse audit: render-blocking-resources\n- Current value: Est savings of 1,630 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\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": "server-response-time",
          "title": "Reduce initial server response time",
          "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": 0,
          "displayValue": "Root document took 1,690 ms",
          "impact": "high",
          "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 Reduce initial server response time\n\n- Lighthouse audit: server-response-time\n- Current value: Root document took 1,690 ms\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": "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": 0.56,
          "displayValue": "5.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 Speed Index\n\n- Lighthouse audit: speed-index\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\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": 0.5,
          "displayValue": "Est savings of 32 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 32 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": "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": "1,115 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: 1,115 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://barcelona.cat/es/vivir-en-bcn/medio-ambiente-y-sostenibilidad",
      "status": "ok",
      "finalUrl": "https://www.barcelona.cat/es/vivir-en-bcn/medio-ambiente-y-sostenibilidad",
      "performanceScore": 0.65,
      "bestPracticesScore": 1,
      "transferBytes": 2324385,
      "co2Grams": 0.890428659939,
      "greenWeb": {
        "page": {
          "hostname": "www.barcelona.cat",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-13T22:38:00.231825",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.barcelona.cat",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76424,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "stylesheet",
            "requestCount": 1,
            "transferBytes": 24654,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15565,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7146,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 4112,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/css/bcn-avisos.css",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "fonts.googleapis.com",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 2484,
            "sampleUrl": "https://fonts.googleapis.com/css?family=Source+Sans+3:200,200i,300,300i,400,400i,500,500i,600,600i,700,700i,900,900i",
            "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
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=HgqZ9L&url=https%3A%2F%2Fwww.barcelona.cat%2Fes%2Fvivir-en-bcn%2Fmedio-ambiente-y-sostenibilidad",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 10,
          "greenCount": 4,
          "notGreenCount": 7,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 60,
        "urgency": "high",
        "pageElementOccurrences": 1,
        "uniqueElementsAssessed": 1,
        "reusedFromCacheCount": 1,
        "components": [
          {
            "signature": "form|get|/es/|input|text|query|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "text",
            "fieldName": "query",
            "formContext": "form|get|/es/",
            "hasLabel": true,
            "hasValidationRule": false,
            "hasErrorMessagingHook": false,
            "toolingFriendly": false,
            "assessment": {
              "score": 60,
              "urgency": "high",
              "issues": [
                "No explicit validation rule",
                "No error messaging hook",
                "Missing autocomplete for tooling support"
              ],
              "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.",
                "Provide meaningful autocomplete values to support browsers and assistive tooling."
              ]
            },
            "reusedFromCache": true
          }
        ],
        "recommendations": [
          {
            "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."
          },
          {
            "title": "Missing autocomplete for tooling support",
            "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": "Medio ambiente y sostenibilidad | Barcelona.cat | Ayuntamiento de Barcelona",
          "lang": "es",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "Descubre las políticas ambientales de Barcelona y los servicios relacionados: gestión de residuos, espacios verdes, calidad del aire y acciones contra el cambio climático.",
          "robots": "",
          "canonical": "https://www.barcelona.cat/es/vivir-en-bcn/medio-ambiente-y-sostenibilidad",
          "ogTitle": "Gestión del medio ambiente y sostenibilidad en Barcelona",
          "ogDescription": "Conoce las iniciativas de Barcelona para una ciudad más sostenible. Información sobre el reciclaje, la calidad del aire, limpieza y residuos y la lucha contra el cambio climático.",
          "ogType": "Web",
          "ogUrl": "https://www.barcelona.cat/es/vivir-en-bcn/medio-ambiente-y-sostenibilidad",
          "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": 63,
          "tabletSmallTapTargets": 59,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 63,
            "oversizedMedia": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 59,
            "oversizedMedia": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 63 small targets on mobile and 59 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 59,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": true,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": true,
          "externalScriptCount": 7,
          "externalScriptsWithoutIntegrity": 7,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "cache-control": "max-age=300, public",
            "content-encoding": "gzip",
            "content-language": "es",
            "content-length": "13680",
            "content-type": "text/html; charset=UTF-8",
            "date": "Mon, 13 Apr 2026 22:52:56 GMT",
            "etag": "\"1776120775-gzip\"",
            "expires": "Sun, 19 Nov 1978 05:00:00 GMT",
            "last-modified": "Mon, 13 Apr 2026 22:52:55 GMT",
            "server": "nginx",
            "vary": "Cookie,Accept-Encoding",
            "via": "1.1 ca2190123e61f1744d1210c24c87c840.cloudfront.net (CloudFront)",
            "x-amz-cf-id": "nBdYyrb3xXFAZD3kkHcuytQ1yDdAqIWTM-KQhGV8xw1uI2AVAIjIzg==",
            "x-amz-cf-pop": "IAD12-P5",
            "x-cache": "Miss from cloudfront",
            "x-content-type-options": "nosniff",
            "x-frame-options": "SAMEORIGIN",
            "x-generator": "Drupal 10 (https://www.drupal.org)"
          },
          "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": "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": "7 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 25,
        "urgency": "low",
        "origin": "https://www.barcelona.cat",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://www.barcelona.cat/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/sitemap.xml",
            "found": true,
            "status": 200,
            "contentType": "application/xml; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/manifest.webmanifest",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/favicon.ico",
            "found": true,
            "status": 200,
            "contentType": "image/x-icon"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "low",
            "detail": "Missing beneficial file(s): /.well-known/security.txt, /manifest.webmanifest."
          }
        ]
      },
      "mediaHints": {
        "score": 20,
        "urgency": "low",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 27,
          "imagesWithLazy": 16,
          "imagesWithoutLazy": 11
        },
        "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."
          }
        ]
      },
      "wsgCustom": {
        "score": 85,
        "urgency": "medium",
        "data": {
          "hasPrintStyles": true,
          "hasReducedMotion": true,
          "media": {
            "totalImages": 32,
            "lazyImages": 17,
            "totalIframes": 1,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "\"Source Sans Pro\", \"Helvetica Neue\", Helvetica, Arial, sans-serif",
            "usesSystemFont": true
          },
          "tracking": {
            "count": 0,
            "scripts": []
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 17/32 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": "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"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 100,
        "urgency": "high",
        "totalEstimatedSavingsBytes": 2379830.55,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Use modern image compression formats",
            "urgency": "high",
            "estimatedSavingsBytes": 1315152.5499999998,
            "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": 1064678,
            "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: 1.25 MB."
          },
          {
            "title": "Improve image encoding quality/size",
            "urgency": "high",
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 1.02 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": 2525861.55,
        "totalEstimatedBlockingMs": 1637,
        "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": 1315152.5499999998,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 1,284 KiB",
            "urgency": "high",
            "sourceAuditId": "modern-image-formats"
          },
          {
            "id": "uses-optimized-images",
            "title": "Compress oversized image assets",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss.",
            "estimatedSavingsBytes": 1064678,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 1,040 KiB",
            "urgency": "high",
            "sourceAuditId": "uses-optimized-images"
          },
          {
            "id": "render-blocking-resources",
            "title": "Eliminate render-blocking resources",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering.",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1637,
            "displayValue": "Est savings of 1,640 ms",
            "urgency": "high",
            "sourceAuditId": "render-blocking-resources"
          },
          {
            "id": "unused-css-rules",
            "title": "Remove unused CSS",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped.",
            "estimatedSavingsBytes": 84012,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 82 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-css-rules"
          },
          {
            "id": "unused-javascript",
            "title": "Remove unused JavaScript",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code.",
            "estimatedSavingsBytes": 54107,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 53 KiB",
            "urgency": "medium",
            "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": 7912,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 8 KiB",
            "urgency": "low",
            "sourceAuditId": "offscreen-images"
          }
        ],
        "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.25 MB."
          },
          {
            "title": "Compress oversized image assets",
            "urgency": "high",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 1.02 MB."
          },
          {
            "title": "Eliminate render-blocking resources",
            "urgency": "high",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering. Estimated render unblocking: 1637 ms."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "medium",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 82.04 KB."
          },
          {
            "title": "Remove unused JavaScript",
            "urgency": "medium",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 52.84 KB."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "low",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 7.73 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": 10,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 7,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "7 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": 168016.5712639665
        },
        "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: 164.08 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: 164.08 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": 5,
        "urgency": "medium",
        "transferBytes": 2324385,
        "css": {
          "unusedBytes": 84012,
          "ratio": 0.03614375415432469,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 54107,
          "duplicatedBytes": 0,
          "ratio": 0.02327798535956823,
          "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": "high",
            "estimatedSavingsBytes": 84012,
            "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": "medium",
            "estimatedSavingsBytes": 54107,
            "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": 2324385,
        "estimatedDeferrableBytes": 146031,
        "renderBlockingMs": 1637,
        "breakdown": {
          "offscreenImageSavings": 7912,
          "unusedJavascriptSavings": 54107,
          "unusedCssSavings": 84012
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 7912,
            "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": "medium",
            "estimatedSavingsBytes": 54107,
            "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": "high",
            "estimatedSavingsBytes": 84012,
            "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": "Eliminate render-blocking resources",
            "area": "render-path",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1637,
            "strategy": "Defer scripts/styles not required for first paint and preload only truly critical assets.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-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 www.barcelona.cat",
            "area": "image",
            "urgency": "high",
            "estimatedSavingsBytes": 192963,
            "url": "https://www.barcelona.cat/sites/default/files/styles/destacat_gran/public/qualitat_aire_528x228_2.jpg?itok=uYlz-PiO",
            "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": 64,
        "urgency": "high",
        "providerCount": 7,
        "requestCount": 8,
        "transferBytes": 139457,
        "notGreenCount": 5,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76424,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15565,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7146,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=HgqZ9L&url=https%3A%2F%2Fwww.barcelona.cat%2Fes%2Fvivir-en-bcn%2Fmedio-ambiente-y-sostenibilidad",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "high",
            "detail": "Track 7 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."
          },
          {
            "title": "Prioritize greener alternatives for third-party providers",
            "urgency": "high",
            "detail": "5 third-party script origin(s) are not confirmed green in the Green Web Foundation dataset."
          }
        ]
      },
      "redundancy": {
        "score": 13,
        "urgency": "medium",
        "transferBytes": 2324385,
        "estimatedRedundantBytes": 138119,
        "redundancyRatio": 0.05942173951389292,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 84012,
            "displayValue": "Est savings of 82 KiB"
          },
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 54107,
            "displayValue": "Est savings of 53 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 84012,
            "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 unused javascript",
            "urgency": "medium",
            "estimatedSavingsBytes": 54107,
            "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 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": 37,
        "urgency": "high",
        "totalTransferBytes": 2324385,
        "heavyRequestCount": 12,
        "heavyBytes": 1516637,
        "heavyRatio": 0.6524895832661113,
        "heavyRequests": [
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/destacat_gran/public/qualitat_aire_528x228_2.jpg?itok=uYlz-PiO",
            "transferSize": 192963,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/destacat_gran/public/reciclatge_roba_528x228.jpg?itok=9m5o9dzb",
            "transferSize": 176811,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/destacat_gran/public/cuida_los_punts_verds_528x228_3.jpg?itok=O53_f-Ch",
            "transferSize": 174406,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/destacat_gran/public/528x228-_0001_transit_3.jpg?itok=-bCC_-Eq",
            "transferSize": 167879,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/destacat_gran/public/refugi-climatic-528x228-2_1.jpg?itok=ha5iJ5sG",
            "transferSize": 155156,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/destacat_gran/public/v2_recollida_mobles_528x228.jpg?itok=r4jce516",
            "transferSize": 151607,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/destacat_gran/public/recollida-organica_528x228.jpg?itok=OxPi1TMr",
            "transferSize": 116663,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/destacat_petit/public/agenda2030-252x228.jpg?itok=QTvDSN9x",
            "transferSize": 107304,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "transferSize": 90560,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "transferSize": 76424,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "cdn.matomo.cloud"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament/fonts/icoajuntament.ttf?8aaig7",
            "transferSize": 54920,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/css/css_qDD4BCxE8K-iT7MRORwp32v03DlJblP9-xrYwOBWlQo.css?delta=5&language=es&theme=barcelonacat_theme&include=eJyFz0EKwzAMBMAPxfjQB5m1o6YujmQsJU1-X0MhUHDpScvuXITnxoaV2AL2rKL-cxxqniJaoiKMBAuyU2t5JvVdb85ESt9_mYqF3J7p9Q3sQSv5KGJqDTWkmUfgDk5nlGO0LUUiilM7S-ZlJHISh-uvkVDZehcUrOH2D9QmU0wcOmvwVwp0GDVGmfRUo9VHKL0B6qeEHA&tcut5n",
            "transferSize": 51944,
            "resourceType": "stylesheet",
            "mimeType": "text/css",
            "domain": "www.barcelona.cat"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "image",
            "count": 8,
            "transferBytes": 1242789
          },
          {
            "resourceType": "font",
            "count": 2,
            "transferBytes": 145480
          },
          {
            "resourceType": "script",
            "count": 1,
            "transferBytes": 76424
          },
          {
            "resourceType": "stylesheet",
            "count": 1,
            "transferBytes": 51944
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.barcelona.cat",
            "count": 11,
            "transferBytes": 1440213
          },
          {
            "domain": "cdn.matomo.cloud",
            "count": 1,
            "transferBytes": 76424
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Split JavaScript by route or interaction",
            "urgency": "medium",
            "estimatedSavingsBytes": 54107,
            "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": "Defer non-critical UI modules until after first render",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "strategy": "Keep only above-the-fold resources in the initial path; hydrate or import secondary modules later.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 www.barcelona.cat",
            "urgency": "medium",
            "estimatedSavingsBytes": 192963,
            "strategy": "Serve a smaller placeholder first and load this asset only when the user scrolls to or requests the component.",
            "url": "https://www.barcelona.cat/sites/default/files/styles/destacat_gran/public/qualitat_aire_528x228_2.jpg?itok=uYlz-PiO",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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": "10.6 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: 10.6 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 53 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 53 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,
          "displayValue": "Est savings of 82 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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 82 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,
          "displayValue": "Est savings of 1,284 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,284 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 1,040 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 1,040 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": "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": 0,
          "displayValue": "Est savings of 1,640 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 Eliminate render-blocking resources\n\n- Lighthouse audit: render-blocking-resources\n- Current value: Est savings of 1,640 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\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": "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": 0.83,
          "displayValue": "3.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 Speed Index\n\n- Lighthouse audit: speed-index\n- Current value: 3.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\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": "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 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 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": "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": "1,152 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: 1,152 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://barcelona.cat/en/what-to-do-in-bcn/bathing-and-beaches/dogs-area",
      "status": "ok",
      "finalUrl": "https://www.barcelona.cat/en/what-to-do-in-bcn/bathing-and-beaches/dogs-area",
      "performanceScore": 0.41,
      "bestPracticesScore": 1,
      "transferBytes": 3101947,
      "co2Grams": 1.1882981994858,
      "greenWeb": {
        "page": {
          "hostname": "www.barcelona.cat",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-13T22:38:00.231825",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.barcelona.cat",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76426,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "stylesheet",
            "requestCount": 1,
            "transferBytes": 24654,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15566,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7146,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5656,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 4112,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/css/bcn-avisos.css",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "fonts.googleapis.com",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 2483,
            "sampleUrl": "https://fonts.googleapis.com/css?family=Source+Sans+3:200,200i,300,300i,400,400i,500,500i,600,600i,700,700i,900,900i",
            "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
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=tFpSrh&url=https%3A%2F%2Fwww.barcelona.cat%2Fen%2Fwhat-to-do-in-bcn%2Fbathing-and-beaches%2Fdogs-area",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 10,
          "greenCount": 4,
          "notGreenCount": 7,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 60,
        "urgency": "high",
        "pageElementOccurrences": 1,
        "uniqueElementsAssessed": 1,
        "reusedFromCacheCount": 1,
        "components": [
          {
            "signature": "form|get|/en|input|text|query|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "text",
            "fieldName": "query",
            "formContext": "form|get|/en",
            "hasLabel": true,
            "hasValidationRule": false,
            "hasErrorMessagingHook": false,
            "toolingFriendly": false,
            "assessment": {
              "score": 60,
              "urgency": "high",
              "issues": [
                "No explicit validation rule",
                "No error messaging hook",
                "Missing autocomplete for tooling support"
              ],
              "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.",
                "Provide meaningful autocomplete values to support browsers and assistive tooling."
              ]
            },
            "reusedFromCache": true
          }
        ],
        "recommendations": [
          {
            "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."
          },
          {
            "title": "Missing autocomplete for tooling support",
            "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": "Pets on beaches | Barcelona website | Barcelona City Council",
          "lang": "en",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "Consult the beach-access regulations for pets and the pilot test in the Llevant beach area for city residents with dogs.",
          "robots": "",
          "canonical": "https://www.barcelona.cat/en/what-to-do-in-bcn/bathing-and-beaches/dogs-area",
          "ogTitle": "Area for city residents with dogs",
          "ogDescription": "Consult the beach-access regulations for pets and the pilot test in the Llevant beach area for city residents with dogs.",
          "ogType": "Web",
          "ogUrl": "https://www.barcelona.cat/en/what-to-do-in-bcn/bathing-and-beaches/dogs-area",
          "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": 36,
        "urgency": "medium",
        "checks": {
          "testedMobile": true,
          "testedTablet": true,
          "horizontalOverflowOnMobile": false,
          "horizontalOverflowOnTablet": false,
          "mobileSmallTapTargets": 49,
          "tabletSmallTapTargets": 35,
          "fixedWidthOffenders": 3,
          "oversizedMedia": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 1,
            "smallTapTargets": 49,
            "oversizedMedia": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 2,
            "smallTapTargets": 35,
            "oversizedMedia": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 49 small targets on mobile and 35 on tablet."
          },
          {
            "title": "Refactor fixed-width components",
            "urgency": "medium",
            "detail": "3 element(s) exceeded viewport width in tested layouts; use responsive component constraints."
          }
        ]
      },
      "securityLight": {
        "score": 59,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": true,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": true,
          "externalScriptCount": 7,
          "externalScriptsWithoutIntegrity": 7,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "cache-control": "max-age=300, public",
            "content-encoding": "gzip",
            "content-language": "en",
            "content-length": "13583",
            "content-type": "text/html; charset=UTF-8",
            "date": "Mon, 13 Apr 2026 22:53:10 GMT",
            "etag": "\"1776120789-gzip\"",
            "expires": "Sun, 19 Nov 1978 05:00:00 GMT",
            "last-modified": "Mon, 13 Apr 2026 22:53:09 GMT",
            "server": "nginx",
            "vary": "Cookie,Accept-Encoding",
            "via": "1.1 ca2190123e61f1744d1210c24c87c840.cloudfront.net (CloudFront)",
            "x-amz-cf-id": "Ypctw25zd0bwfdIXRx2YxYEgu0mT_35Mw4bbGHDeRPdZR_R84jL4Kw==",
            "x-amz-cf-pop": "IAD12-P5",
            "x-cache": "Miss from cloudfront",
            "x-content-type-options": "nosniff",
            "x-frame-options": "SAMEORIGIN",
            "x-generator": "Drupal 10 (https://www.drupal.org)"
          },
          "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": "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": "7 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 25,
        "urgency": "low",
        "origin": "https://www.barcelona.cat",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://www.barcelona.cat/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/sitemap.xml",
            "found": true,
            "status": 200,
            "contentType": "application/xml; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/manifest.webmanifest",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/favicon.ico",
            "found": true,
            "status": 200,
            "contentType": "image/x-icon"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "low",
            "detail": "Missing beneficial file(s): /.well-known/security.txt, /manifest.webmanifest."
          }
        ]
      },
      "mediaHints": {
        "score": 20,
        "urgency": "low",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 31,
          "imagesWithLazy": 18,
          "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."
          }
        ]
      },
      "wsgCustom": {
        "score": 85,
        "urgency": "medium",
        "data": {
          "hasPrintStyles": true,
          "hasReducedMotion": true,
          "media": {
            "totalImages": 36,
            "lazyImages": 19,
            "totalIframes": 1,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "\"Source Sans Pro\", \"Helvetica Neue\", Helvetica, Arial, sans-serif",
            "usesSystemFont": true
          },
          "tracking": {
            "count": 0,
            "scripts": []
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 19/36 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": "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"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 100,
        "urgency": "high",
        "totalEstimatedSavingsBytes": 3092690.8,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Use modern image compression formats",
            "urgency": "high",
            "estimatedSavingsBytes": 1777841.8,
            "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": 1314849,
            "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: 1.70 MB."
          },
          {
            "title": "Improve image encoding quality/size",
            "urgency": "high",
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 1.25 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": 3560640.8,
        "totalEstimatedBlockingMs": 1660,
        "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": 1777841.8,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 1,736 KiB",
            "urgency": "high",
            "sourceAuditId": "modern-image-formats"
          },
          {
            "id": "uses-optimized-images",
            "title": "Compress oversized image assets",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss.",
            "estimatedSavingsBytes": 1314849,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 1,284 KiB",
            "urgency": "high",
            "sourceAuditId": "uses-optimized-images"
          },
          {
            "id": "uses-responsive-images",
            "title": "Right-size images for viewport",
            "detail": "Avoid sending larger images than the rendered size needs.",
            "estimatedSavingsBytes": 238343,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 233 KiB",
            "urgency": "high",
            "sourceAuditId": "uses-responsive-images"
          },
          {
            "id": "render-blocking-resources",
            "title": "Eliminate render-blocking resources",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering.",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1660,
            "displayValue": "Est savings of 1,660 ms",
            "urgency": "high",
            "sourceAuditId": "render-blocking-resources"
          },
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 91562,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 89 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": 83271,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 81 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-css-rules"
          },
          {
            "id": "unused-javascript",
            "title": "Remove unused JavaScript",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code.",
            "estimatedSavingsBytes": 54774,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 53 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-javascript"
          }
        ],
        "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.70 MB."
          },
          {
            "title": "Compress oversized image assets",
            "urgency": "high",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 1.25 MB."
          },
          {
            "title": "Right-size images for viewport",
            "urgency": "high",
            "detail": "Avoid sending larger images than the rendered size needs. Estimated byte savings: 232.76 KB."
          },
          {
            "title": "Eliminate render-blocking resources",
            "urgency": "high",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering. Estimated render unblocking: 1660 ms."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "medium",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 89.42 KB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "medium",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 81.32 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": 10,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 7,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "7 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": 300517.8519553073
        },
        "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: 293.47 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: 293.47 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": "medium",
        "transferBytes": 3101947,
        "css": {
          "unusedBytes": 83271,
          "ratio": 0.026844752666631635,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 54774,
          "duplicatedBytes": 0,
          "ratio": 0.017657941931309595,
          "auditIds": [
            "unused-javascript",
            "duplicated-javascript"
          ]
        },
        "html": {
          "estimatedPenalty": 0.25,
          "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": "high",
            "estimatedSavingsBytes": 83271,
            "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": "medium",
            "estimatedSavingsBytes": 54774,
            "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": 3101947,
        "estimatedDeferrableBytes": 229607,
        "renderBlockingMs": 1660,
        "breakdown": {
          "offscreenImageSavings": 91562,
          "unusedJavascriptSavings": 54774,
          "unusedCssSavings": 83271
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 91562,
            "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": "medium",
            "estimatedSavingsBytes": 54774,
            "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": "high",
            "estimatedSavingsBytes": 83271,
            "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": "Eliminate render-blocking resources",
            "area": "render-path",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1660,
            "strategy": "Defer scripts/styles not required for first paint and preload only truly critical assets.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-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 www.barcelona.cat",
            "area": "image",
            "urgency": "high",
            "estimatedSavingsBytes": 337718,
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_medium/public/5_area_gossos_710x379.jpg?itok=Yo6UflKO",
            "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": 64,
        "urgency": "high",
        "providerCount": 7,
        "requestCount": 8,
        "transferBytes": 139670,
        "notGreenCount": 5,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76426,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15566,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7146,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5656,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=tFpSrh&url=https%3A%2F%2Fwww.barcelona.cat%2Fen%2Fwhat-to-do-in-bcn%2Fbathing-and-beaches%2Fdogs-area",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "high",
            "detail": "Track 7 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."
          },
          {
            "title": "Prioritize greener alternatives for third-party providers",
            "urgency": "high",
            "detail": "5 third-party script origin(s) are not confirmed green in the Green Web Foundation dataset."
          }
        ]
      },
      "redundancy": {
        "score": 22,
        "urgency": "medium",
        "transferBytes": 3101947,
        "estimatedRedundantBytes": 138045,
        "redundancyRatio": 0.04450269459794123,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 83271,
            "displayValue": "Est savings of 81 KiB"
          },
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 54774,
            "displayValue": "Est savings of 53 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 83271,
            "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 unused javascript",
            "urgency": "medium",
            "estimatedSavingsBytes": 54774,
            "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 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": 44,
        "urgency": "high",
        "totalTransferBytes": 3101947,
        "heavyRequestCount": 14,
        "heavyBytes": 2564018,
        "heavyRatio": 0.8265834329213233,
        "heavyRequests": [
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_medium/public/5_area_gossos_710x379.jpg?itok=Yo6UflKO",
            "transferSize": 337718,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_medium/public/3_area_gossos_710x379.jpg?itok=ykuLZqrP",
            "transferSize": 278620,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_medium/public/2_area_gossos_710x379.jpg?itok=b6m7AXOk",
            "transferSize": 260679,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_medium/public/6_area_gossos_710x379.jpg?itok=8k5ijpb_",
            "transferSize": 235400,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_medium/public/7_area_gossos_710x379.jpg?itok=Coc2fQ3D",
            "transferSize": 230577,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_medium/public/9_area_gossos_710x379.jpg?itok=rtuJFcTl",
            "transferSize": 224741,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_medium/public/8_area_gossos_710x379.jpg?itok=QHgJ9jOk",
            "transferSize": 206360,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://i.ytimg.com/vi/4hBS3YXsMhg/maxresdefault.jpg",
            "transferSize": 176695,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "i.ytimg.com"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_medium/public/1_area_gossos_710x379.jpg?itok=zRA8TA3t",
            "transferSize": 171582,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_medium/public/4_area_gossos_710x379.jpg?itok=j8i2vkrN",
            "transferSize": 167807,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "transferSize": 90560,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "transferSize": 76426,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "cdn.matomo.cloud"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament/fonts/icoajuntament.ttf?8aaig7",
            "transferSize": 54919,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/css/css_qDD4BCxE8K-iT7MRORwp32v03DlJblP9-xrYwOBWlQo.css?delta=6&language=en&theme=barcelonacat_theme&include=eJyFz8FuxCAMBNAfCsuhH4QG4ia0DkbYpJu_L9JKW1VitSdbM-8y-OrFcFCxgDOrqH8ch5qXiJaIpSDBgpzUWl5J_dDdmQiP_pWp2MidmX7-A9vpIB9FTK2hhrSWGfhESVeU-6zbWCLYqV2cyzYTOYnDc9dMKOf07ZASqebINDXSRxYURcPHO1CbLDGVMFiDf36B7katgJeKhm0s3tWvrVfw7S-59VJ75Kw7rYteanT4CKVfKxCiTQ&tcut5n",
            "transferSize": 51934,
            "resourceType": "stylesheet",
            "mimeType": "text/css",
            "domain": "www.barcelona.cat"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "image",
            "count": 10,
            "transferBytes": 2290179
          },
          {
            "resourceType": "font",
            "count": 2,
            "transferBytes": 145479
          },
          {
            "resourceType": "script",
            "count": 1,
            "transferBytes": 76426
          },
          {
            "resourceType": "stylesheet",
            "count": 1,
            "transferBytes": 51934
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.barcelona.cat",
            "count": 12,
            "transferBytes": 2310897
          },
          {
            "domain": "i.ytimg.com",
            "count": 1,
            "transferBytes": 176695
          },
          {
            "domain": "cdn.matomo.cloud",
            "count": 1,
            "transferBytes": 76426
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Lazy-load offscreen images and media galleries",
            "urgency": "medium",
            "estimatedSavingsBytes": 91562,
            "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": "medium",
            "estimatedSavingsBytes": 54774,
            "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": "Defer non-critical UI modules until after first render",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "strategy": "Keep only above-the-fold resources in the initial path; hydrate or import secondary modules later.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 www.barcelona.cat",
            "urgency": "high",
            "estimatedSavingsBytes": 337718,
            "strategy": "Serve a smaller placeholder first and load this asset only when the user scrolls to or requests the component.",
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_medium/public/5_area_gossos_710x379.jpg?itok=Yo6UflKO",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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": "9.9 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: 9.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,
          "displayValue": "Est savings of 53 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 53 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,
          "displayValue": "Est savings of 81 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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 81 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,
          "displayValue": "Est savings of 1,736 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,736 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 1,284 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 1,284 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,
          "displayValue": "Est savings of 89 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 89 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": "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": 0,
          "displayValue": "Est savings of 1,660 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 Eliminate render-blocking resources\n\n- Lighthouse audit: render-blocking-resources\n- Current value: Est savings of 1,660 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\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": "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,
          "displayValue": "1,127 elements",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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: 1,127 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"
        },
        {
          "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": 0.67,
          "displayValue": "4.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 Speed Index\n\n- Lighthouse audit: speed-index\n- Current value: 4.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\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": "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,029 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,029 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://barcelona.cat/en/living-in-bcn/diada",
      "status": "ok",
      "finalUrl": "https://www.barcelona.cat/en/living-in-bcn/diada",
      "performanceScore": 0.66,
      "bestPracticesScore": 1,
      "transferBytes": 1853671,
      "co2Grams": 0.7101068818194001,
      "greenWeb": {
        "page": {
          "hostname": "www.barcelona.cat",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-13T22:38:00.231825",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.barcelona.cat",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76424,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "stylesheet",
            "requestCount": 1,
            "transferBytes": 24657,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15565,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7145,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 4114,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/css/bcn-avisos.css",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "fonts.googleapis.com",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 2483,
            "sampleUrl": "https://fonts.googleapis.com/css?family=Source+Sans+3:200,200i,300,300i,400,400i,500,500i,600,600i,700,700i,900,900i",
            "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
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=cbKN7g&url=https%3A%2F%2Fwww.barcelona.cat%2Fen%2Fliving-in-bcn%2Fdiada",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 10,
          "greenCount": 4,
          "notGreenCount": 7,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 60,
        "urgency": "high",
        "pageElementOccurrences": 1,
        "uniqueElementsAssessed": 1,
        "reusedFromCacheCount": 1,
        "components": [
          {
            "signature": "form|get|/en|input|text|query|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "text",
            "fieldName": "query",
            "formContext": "form|get|/en",
            "hasLabel": true,
            "hasValidationRule": false,
            "hasErrorMessagingHook": false,
            "toolingFriendly": false,
            "assessment": {
              "score": 60,
              "urgency": "high",
              "issues": [
                "No explicit validation rule",
                "No error messaging hook",
                "Missing autocomplete for tooling support"
              ],
              "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.",
                "Provide meaningful autocomplete values to support browsers and assistive tooling."
              ]
            },
            "reusedFromCache": true
          }
        ],
        "recommendations": [
          {
            "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."
          },
          {
            "title": "Missing autocomplete for tooling support",
            "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": "Diada 2025 | Barcelona website | Barcelona City Council",
          "lang": "en",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "Ceremonies, activities, open days, demonstrations, disruptions to public transport and mobility recommendations in Barcelona for Catalan National Day on 11 September.",
          "robots": "",
          "canonical": "https://www.barcelona.cat/en/living-in-bcn/diada",
          "ogTitle": "Diada 2025 | Barcelona website | Barcelona City Council",
          "ogDescription": "Ceremonies, activities, open days, demonstrations, disruptions to public transport and mobility recommendations in Barcelona for Catalan National Day on 11 September.",
          "ogType": "Web",
          "ogUrl": "https://www.barcelona.cat/en/living-in-bcn/diada",
          "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": 42,
          "tabletSmallTapTargets": 38,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 42,
            "oversizedMedia": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 38,
            "oversizedMedia": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 42 small targets on mobile and 38 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 59,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": true,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": true,
          "externalScriptCount": 7,
          "externalScriptsWithoutIntegrity": 7,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "cache-control": "max-age=300, public",
            "content-encoding": "gzip",
            "content-language": "en",
            "content-length": "12011",
            "content-type": "text/html; charset=UTF-8",
            "date": "Mon, 13 Apr 2026 22:53:24 GMT",
            "etag": "\"1776120804-gzip\"",
            "expires": "Sun, 19 Nov 1978 05:00:00 GMT",
            "last-modified": "Mon, 13 Apr 2026 22:53:24 GMT",
            "server": "nginx",
            "vary": "Cookie,Accept-Encoding",
            "via": "1.1 ca2190123e61f1744d1210c24c87c840.cloudfront.net (CloudFront)",
            "x-amz-cf-id": "p5EW54L4HwT9hUjZ4AQONbxvVRjuT2FwF4ymP5aX7mBKGlmxrx_jfw==",
            "x-amz-cf-pop": "IAD12-P5",
            "x-cache": "Miss from cloudfront",
            "x-content-type-options": "nosniff",
            "x-frame-options": "SAMEORIGIN",
            "x-generator": "Drupal 10 (https://www.drupal.org)"
          },
          "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": "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": "7 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 25,
        "urgency": "low",
        "origin": "https://www.barcelona.cat",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://www.barcelona.cat/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/sitemap.xml",
            "found": true,
            "status": 200,
            "contentType": "application/xml; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/manifest.webmanifest",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/favicon.ico",
            "found": true,
            "status": 200,
            "contentType": "image/x-icon"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "low",
            "detail": "Missing beneficial file(s): /.well-known/security.txt, /manifest.webmanifest."
          }
        ]
      },
      "mediaHints": {
        "score": 23,
        "urgency": "low",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 22,
          "imagesWithLazy": 10,
          "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 22 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 85,
        "urgency": "medium",
        "data": {
          "hasPrintStyles": true,
          "hasReducedMotion": true,
          "media": {
            "totalImages": 27,
            "lazyImages": 11,
            "totalIframes": 1,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "\"Source Sans Pro\", \"Helvetica Neue\", Helvetica, Arial, sans-serif",
            "usesSystemFont": true
          },
          "tracking": {
            "count": 0,
            "scripts": []
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 11/27 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": "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"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 89,
        "urgency": "high",
        "totalEstimatedSavingsBytes": 1640661.8000000003,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Use modern image compression formats",
            "urgency": "high",
            "estimatedSavingsBytes": 909768.8000000002,
            "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": 730893,
            "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: 888.45 KB."
          },
          {
            "title": "Improve image encoding quality/size",
            "urgency": "high",
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 713.76 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": 1787265.8000000003,
        "totalEstimatedBlockingMs": 1623,
        "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": 909768.8000000002,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 888 KiB",
            "urgency": "high",
            "sourceAuditId": "modern-image-formats"
          },
          {
            "id": "uses-optimized-images",
            "title": "Compress oversized image assets",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss.",
            "estimatedSavingsBytes": 730893,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 714 KiB",
            "urgency": "high",
            "sourceAuditId": "uses-optimized-images"
          },
          {
            "id": "render-blocking-resources",
            "title": "Eliminate render-blocking resources",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering.",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1623,
            "displayValue": "Est savings of 1,620 ms",
            "urgency": "high",
            "sourceAuditId": "render-blocking-resources"
          },
          {
            "id": "unused-css-rules",
            "title": "Remove unused CSS",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped.",
            "estimatedSavingsBytes": 83963,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 82 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-css-rules"
          },
          {
            "id": "unused-javascript",
            "title": "Remove unused JavaScript",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code.",
            "estimatedSavingsBytes": 54741,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 53 KiB",
            "urgency": "medium",
            "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": 7900,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 8 KiB",
            "urgency": "low",
            "sourceAuditId": "offscreen-images"
          }
        ],
        "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: 888.45 KB."
          },
          {
            "title": "Compress oversized image assets",
            "urgency": "high",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 713.76 KB."
          },
          {
            "title": "Eliminate render-blocking resources",
            "urgency": "high",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering. Estimated render unblocking: 1623 ms."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "medium",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 82.00 KB."
          },
          {
            "title": "Remove unused JavaScript",
            "urgency": "medium",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 53.46 KB."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "low",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 7.71 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": 10,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 7,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "7 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": 167993.1212639665
        },
        "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: 164.06 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: 164.06 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": 5,
        "urgency": "medium",
        "transferBytes": 1853671,
        "css": {
          "unusedBytes": 83963,
          "ratio": 0.045295524394566244,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 54741,
          "duplicatedBytes": 0,
          "ratio": 0.029531130389373304,
          "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": "high",
            "estimatedSavingsBytes": 83963,
            "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": "medium",
            "estimatedSavingsBytes": 54741,
            "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": 1853671,
        "estimatedDeferrableBytes": 146604,
        "renderBlockingMs": 1623,
        "breakdown": {
          "offscreenImageSavings": 7900,
          "unusedJavascriptSavings": 54741,
          "unusedCssSavings": 83963
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 7900,
            "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": "medium",
            "estimatedSavingsBytes": 54741,
            "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": "high",
            "estimatedSavingsBytes": 83963,
            "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": "Eliminate render-blocking resources",
            "area": "render-path",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1623,
            "strategy": "Defer scripts/styles not required for first paint and preload only truly critical assets.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-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 www.barcelona.cat",
            "area": "image",
            "urgency": "high",
            "estimatedSavingsBytes": 211779,
            "url": "https://www.barcelona.cat/sites/default/files/styles/destacat_gran/public/528x228-_0007_180911_p_ofrenafloral_001_4_1.jpg?itok=LIKrmuy7",
            "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": 64,
        "urgency": "high",
        "providerCount": 7,
        "requestCount": 8,
        "transferBytes": 139456,
        "notGreenCount": 5,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76424,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15565,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7145,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=cbKN7g&url=https%3A%2F%2Fwww.barcelona.cat%2Fen%2Fliving-in-bcn%2Fdiada",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "high",
            "detail": "Track 7 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."
          },
          {
            "title": "Prioritize greener alternatives for third-party providers",
            "urgency": "high",
            "detail": "5 third-party script origin(s) are not confirmed green in the Green Web Foundation dataset."
          }
        ]
      },
      "redundancy": {
        "score": 14,
        "urgency": "medium",
        "transferBytes": 1853671,
        "estimatedRedundantBytes": 138704,
        "redundancyRatio": 0.07482665478393954,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 83963,
            "displayValue": "Est savings of 82 KiB"
          },
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 54741,
            "displayValue": "Est savings of 53 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 83963,
            "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 unused javascript",
            "urgency": "medium",
            "estimatedSavingsBytes": 54741,
            "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 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": 35,
        "urgency": "high",
        "totalTransferBytes": 1853671,
        "heavyRequestCount": 10,
        "heavyBytes": 1128226,
        "heavyRatio": 0.608644144511081,
        "heavyRequests": [
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/destacat_gran/public/528x228-_0007_180911_p_ofrenafloral_001_4_1.jpg?itok=LIKrmuy7",
            "transferSize": 211779,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/destacat_gran/public/afectacions_mobilitat_528x228_1.jpg?itok=oX50yECY",
            "transferSize": 173230,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/destacat_gran/public/528x228-_0000_transport_public_v_zambrano_1_2.jpg?itok=9x7igEBS",
            "transferSize": 128514,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/destacat_gran/public/museu-nacional-dart-de-catalunya-mnac_2_1_2_1.jpg?itok=NJ3VFX3s",
            "transferSize": 122202,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/destacat_gran/public/528x228_diada-nacional-de-catalunya-2012-ma_2_1_3_1.jpg?itok=c04LmSMD",
            "transferSize": 113576,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/destacat_gran/public/528x228_la-merce-ball-de-bastons_2_1_3_1.jpg?itok=8HnNkiXe",
            "transferSize": 105088,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "transferSize": 90560,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "transferSize": 76424,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "cdn.matomo.cloud"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament/fonts/icoajuntament.ttf?8aaig7",
            "transferSize": 54920,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/css/css_qDD4BCxE8K-iT7MRORwp32v03DlJblP9-xrYwOBWlQo.css?delta=5&language=en&theme=barcelonacat_theme&include=eJyFz0FqxTAMBNALxd-LHsiMHTVxcSQjyenP7Wso_FJI6Upi5m0GH4MdB7EnnNXE4vcJ6HXJ0EJNGAWe5CTVupLFqUdwkTb7v0zHRuGs9Pkb-E4HxSzi5oqeysp34B1crizPu25rktGC-dUqb3eiFgl47boTJmNmycCW3v4DXWXJhdNkivj6Ej2dlNGWDsU21-wWVx0d7fGTPAb3kVu1ndbFLnM6YobRF2idlFA&tcut5n",
            "transferSize": 51933,
            "resourceType": "stylesheet",
            "mimeType": "text/css",
            "domain": "www.barcelona.cat"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "image",
            "count": 6,
            "transferBytes": 854389
          },
          {
            "resourceType": "font",
            "count": 2,
            "transferBytes": 145480
          },
          {
            "resourceType": "script",
            "count": 1,
            "transferBytes": 76424
          },
          {
            "resourceType": "stylesheet",
            "count": 1,
            "transferBytes": 51933
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.barcelona.cat",
            "count": 9,
            "transferBytes": 1051802
          },
          {
            "domain": "cdn.matomo.cloud",
            "count": 1,
            "transferBytes": 76424
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Split JavaScript by route or interaction",
            "urgency": "medium",
            "estimatedSavingsBytes": 54741,
            "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": "Defer non-critical UI modules until after first render",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "strategy": "Keep only above-the-fold resources in the initial path; hydrate or import secondary modules later.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 www.barcelona.cat",
            "urgency": "medium",
            "estimatedSavingsBytes": 211779,
            "strategy": "Serve a smaller placeholder first and load this asset only when the user scrolls to or requests the component.",
            "url": "https://www.barcelona.cat/sites/default/files/styles/destacat_gran/public/528x228-_0007_180911_p_ofrenafloral_001_4_1.jpg?itok=LIKrmuy7",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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.01,
          "displayValue": "8.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: 8.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 53 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 53 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,
          "displayValue": "Est savings of 82 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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 82 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,
          "displayValue": "Est savings of 888 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 888 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 714 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 714 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": "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": 0,
          "displayValue": "Est savings of 1,620 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 Eliminate render-blocking resources\n\n- Lighthouse audit: render-blocking-resources\n- Current value: Est savings of 1,620 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\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": "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": 0.89,
          "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 Speed Index\n\n- Lighthouse audit: speed-index\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\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": "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 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 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": "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": "1,034 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: 1,034 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://barcelona.cat/es/conocebcn/la-historia/la-barcino-romana",
      "status": "ok",
      "finalUrl": "https://www.barcelona.cat/es/conocebcn/la-historia/la-barcino-romana",
      "performanceScore": 0.56,
      "bestPracticesScore": 1,
      "transferBytes": 1591431,
      "co2Grams": 0.6096476154834,
      "greenWeb": {
        "page": {
          "hostname": "www.barcelona.cat",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-13T22:38:00.231825",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.barcelona.cat",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76426,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "stylesheet",
            "requestCount": 1,
            "transferBytes": 24654,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15566,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7145,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 4118,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/css/bcn-avisos.css",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2862,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "fonts.googleapis.com",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 2483,
            "sampleUrl": "https://fonts.googleapis.com/css?family=Source+Sans+3:200,200i,300,300i,400,400i,500,500i,600,600i,700,700i,900,900i",
            "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
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=O8nBBm&url=https%3A%2F%2Fwww.barcelona.cat%2Fes%2Fconocebcn%2Fla-historia%2Fla-barcino-romana",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 10,
          "greenCount": 4,
          "notGreenCount": 7,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 60,
        "urgency": "high",
        "pageElementOccurrences": 1,
        "uniqueElementsAssessed": 1,
        "reusedFromCacheCount": 1,
        "components": [
          {
            "signature": "form|get|/es/|input|text|query|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "text",
            "fieldName": "query",
            "formContext": "form|get|/es/",
            "hasLabel": true,
            "hasValidationRule": false,
            "hasErrorMessagingHook": false,
            "toolingFriendly": false,
            "assessment": {
              "score": 60,
              "urgency": "high",
              "issues": [
                "No explicit validation rule",
                "No error messaging hook",
                "Missing autocomplete for tooling support"
              ],
              "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.",
                "Provide meaningful autocomplete values to support browsers and assistive tooling."
              ]
            },
            "reusedFromCache": true
          }
        ],
        "recommendations": [
          {
            "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."
          },
          {
            "title": "Missing autocomplete for tooling support",
            "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": "La Barcino romana | Web de Barcelona | Ayuntamiento de Barcelona",
          "lang": "es",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "Las murallas romanas que rodean el corazón de Barcelona abrazan la Barcino que existió entre el siglo I a. C. y los inicios de la Edad Media. Conoce la época romana de Barcelona.",
          "robots": "",
          "canonical": "https://www.barcelona.cat/es/conocebcn/la-historia/la-barcino-romana",
          "ogTitle": "La Barcino romana | Web de Barcelona | Ayuntamiento de Barcelona",
          "ogDescription": "Las murallas romanas que rodean el corazón de Barcelona abrazan la Barcino que existió entre el siglo I a. C. y los inicios de la Edad Media. Conoce la época romana de Barcelona.",
          "ogType": "Web",
          "ogUrl": "https://www.barcelona.cat/es/conocebcn/la-historia/la-barcino-romana",
          "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": 34,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 36,
            "oversizedMedia": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 34,
            "oversizedMedia": 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 34 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 59,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": true,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": true,
          "externalScriptCount": 7,
          "externalScriptsWithoutIntegrity": 7,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "cache-control": "max-age=300, public",
            "content-encoding": "gzip",
            "content-language": "es",
            "content-length": "13711",
            "content-type": "text/html; charset=UTF-8",
            "date": "Mon, 13 Apr 2026 22:53:37 GMT",
            "etag": "\"1776120817-gzip\"",
            "expires": "Sun, 19 Nov 1978 05:00:00 GMT",
            "last-modified": "Mon, 13 Apr 2026 22:53:37 GMT",
            "server": "nginx",
            "vary": "Cookie,Accept-Encoding",
            "via": "1.1 ca2190123e61f1744d1210c24c87c840.cloudfront.net (CloudFront)",
            "x-amz-cf-id": "nD6RDA0s5jGY7LWZZgvxtRxSf5unXZJvUMQtqX3UI9CCmPVhPG6SAw==",
            "x-amz-cf-pop": "IAD12-P5",
            "x-cache": "Miss from cloudfront",
            "x-content-type-options": "nosniff",
            "x-frame-options": "SAMEORIGIN",
            "x-generator": "Drupal 10 (https://www.drupal.org)"
          },
          "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": "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": "7 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 25,
        "urgency": "low",
        "origin": "https://www.barcelona.cat",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://www.barcelona.cat/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/sitemap.xml",
            "found": true,
            "status": 200,
            "contentType": "application/xml; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/manifest.webmanifest",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/favicon.ico",
            "found": true,
            "status": 200,
            "contentType": "image/x-icon"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "low",
            "detail": "Missing beneficial file(s): /.well-known/security.txt, /manifest.webmanifest."
          }
        ]
      },
      "mediaHints": {
        "score": 23,
        "urgency": "low",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 20,
          "imagesWithLazy": 9,
          "imagesWithoutLazy": 11
        },
        "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": "11 of 20 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 85,
        "urgency": "medium",
        "data": {
          "hasPrintStyles": true,
          "hasReducedMotion": true,
          "media": {
            "totalImages": 25,
            "lazyImages": 10,
            "totalIframes": 1,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "\"Source Sans Pro\", \"Helvetica Neue\", Helvetica, Arial, sans-serif",
            "usesSystemFont": true
          },
          "tracking": {
            "count": 0,
            "scripts": []
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 10/25 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": "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"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 82,
        "urgency": "high",
        "totalEstimatedSavingsBytes": 1311480.7,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Use modern image compression formats",
            "urgency": "high",
            "estimatedSavingsBytes": 728421.7,
            "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": 583059,
            "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: 711.35 KB."
          },
          {
            "title": "Improve image encoding quality/size",
            "urgency": "high",
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 569.39 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": 1535107.7,
        "totalEstimatedBlockingMs": 877,
        "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": 728421.7,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 711 KiB",
            "urgency": "high",
            "sourceAuditId": "modern-image-formats"
          },
          {
            "id": "uses-optimized-images",
            "title": "Compress oversized image assets",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss.",
            "estimatedSavingsBytes": 583059,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 569 KiB",
            "urgency": "high",
            "sourceAuditId": "uses-optimized-images"
          },
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 83661,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 82 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": 80843,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 79 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-css-rules"
          },
          {
            "id": "render-blocking-resources",
            "title": "Eliminate render-blocking resources",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering.",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 877,
            "displayValue": "Est savings of 880 ms",
            "urgency": "medium",
            "sourceAuditId": "render-blocking-resources"
          },
          {
            "id": "unused-javascript",
            "title": "Remove unused JavaScript",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code.",
            "estimatedSavingsBytes": 32481,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 32 KiB",
            "urgency": "low",
            "sourceAuditId": "unused-javascript"
          },
          {
            "id": "uses-responsive-images",
            "title": "Right-size images for viewport",
            "detail": "Avoid sending larger images than the rendered size needs.",
            "estimatedSavingsBytes": 26642,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 26 KiB",
            "urgency": "low",
            "sourceAuditId": "uses-responsive-images"
          }
        ],
        "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: 711.35 KB."
          },
          {
            "title": "Compress oversized image assets",
            "urgency": "high",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 569.39 KB."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "medium",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 81.70 KB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "medium",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 78.95 KB."
          },
          {
            "title": "Eliminate render-blocking resources",
            "urgency": "medium",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering. Estimated render unblocking: 877 ms."
          },
          {
            "title": "Remove unused JavaScript",
            "urgency": "low",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 31.72 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": 10,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 7,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "7 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": 168000.50195530726
        },
        "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: 164.06 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: 164.06 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": 5,
        "urgency": "medium",
        "transferBytes": 1591431,
        "css": {
          "unusedBytes": 80843,
          "ratio": 0.05079893504650846,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 32481,
          "duplicatedBytes": 0,
          "ratio": 0.02040993294714003,
          "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": "high",
            "estimatedSavingsBytes": 80843,
            "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": "medium",
            "estimatedSavingsBytes": 32481,
            "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": 1591431,
        "estimatedDeferrableBytes": 196985,
        "renderBlockingMs": 877,
        "breakdown": {
          "offscreenImageSavings": 83661,
          "unusedJavascriptSavings": 32481,
          "unusedCssSavings": 80843
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 83661,
            "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": "medium",
            "estimatedSavingsBytes": 32481,
            "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": 80843,
            "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": "Eliminate render-blocking resources",
            "area": "render-path",
            "urgency": "medium",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 877,
            "strategy": "Defer scripts/styles not required for first paint and preload only truly critical assets.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-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 www.barcelona.cat",
            "area": "image",
            "urgency": "high",
            "estimatedSavingsBytes": 236213,
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_medium/public/0_muhba_pdegrenet_710x379.jpg?itok=Azt22PAX",
            "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 www.barcelona.cat",
            "area": "font",
            "urgency": "medium",
            "estimatedSavingsBytes": 90561,
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "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": 64,
        "urgency": "high",
        "providerCount": 7,
        "requestCount": 8,
        "transferBytes": 139460,
        "notGreenCount": 5,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76426,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15566,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7145,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2862,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=O8nBBm&url=https%3A%2F%2Fwww.barcelona.cat%2Fes%2Fconocebcn%2Fla-historia%2Fla-barcino-romana",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "high",
            "detail": "Track 7 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."
          },
          {
            "title": "Prioritize greener alternatives for third-party providers",
            "urgency": "high",
            "detail": "5 third-party script origin(s) are not confirmed green in the Green Web Foundation dataset."
          }
        ]
      },
      "redundancy": {
        "score": 14,
        "urgency": "low",
        "transferBytes": 1591431,
        "estimatedRedundantBytes": 113324,
        "redundancyRatio": 0.07120886799364848,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 80843,
            "displayValue": "Est savings of 79 KiB"
          },
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 32481,
            "displayValue": "Est savings of 32 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 80843,
            "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 unused javascript",
            "urgency": "medium",
            "estimatedSavingsBytes": 32481,
            "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 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": 19,
        "urgency": "medium",
        "totalTransferBytes": 1591431,
        "heavyRequestCount": 5,
        "heavyBytes": 507217,
        "heavyRatio": 0.31871755671468005,
        "heavyRequests": [
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_medium/public/0_muhba_pdegrenet_710x379.jpg?itok=Azt22PAX",
            "transferSize": 236213,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "transferSize": 90561,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "transferSize": 76426,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "cdn.matomo.cloud"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament/fonts/icoajuntament.ttf?8aaig7",
            "transferSize": 54921,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/css/css_evpTRQTawGYS1Ro7RbXq3hBxwat7AU-RJm1V8ZgzeaE.css?delta=5&language=es&theme=barcelonacat_theme&include=eJyFzsGKwzAMBNAfiuvDfpAZOyJxcSQjydn272sodFnIsieJmXcY3Ac7DmJPOKuJxfcJ6HXJ0EJNGAWe5CTVupLFqUdwkTb7v0zHRuGs9P0b-E4HxSzi5oqeyspXYGuS0YL5s1XerkQtEvDZfiVMxsySgS19_Qe6ypILp8kU8fMlejgpoy0dim0u3i2uOjra7Se5De4jt2o7rYs9zemIGUYvwgyJSg&tcut5n",
            "transferSize": 49096,
            "resourceType": "stylesheet",
            "mimeType": "text/css",
            "domain": "www.barcelona.cat"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "image",
            "count": 1,
            "transferBytes": 236213
          },
          {
            "resourceType": "font",
            "count": 2,
            "transferBytes": 145482
          },
          {
            "resourceType": "script",
            "count": 1,
            "transferBytes": 76426
          },
          {
            "resourceType": "stylesheet",
            "count": 1,
            "transferBytes": 49096
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.barcelona.cat",
            "count": 4,
            "transferBytes": 430791
          },
          {
            "domain": "cdn.matomo.cloud",
            "count": 1,
            "transferBytes": 76426
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Lazy-load offscreen images and media galleries",
            "urgency": "medium",
            "estimatedSavingsBytes": 83661,
            "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": "Defer non-critical UI modules until after first render",
            "urgency": "medium",
            "estimatedSavingsBytes": 0,
            "strategy": "Keep only above-the-fold resources in the initial path; hydrate or import secondary modules later.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 www.barcelona.cat",
            "urgency": "medium",
            "estimatedSavingsBytes": 236213,
            "strategy": "Serve a smaller placeholder first and load this asset only when the user scrolls to or requests the component.",
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_medium/public/0_muhba_pdegrenet_710x379.jpg?itok=Azt22PAX",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 www.barcelona.cat",
            "urgency": "medium",
            "estimatedSavingsBytes": 90561,
            "strategy": "Subset or defer this font so full font payloads are only fetched when needed.",
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 cdn.matomo.cloud",
            "urgency": "medium",
            "estimatedSavingsBytes": 76426,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.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": "9.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: 9.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 32 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 32 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,
          "displayValue": "Est savings of 79 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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 79 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,
          "displayValue": "Est savings of 711 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 711 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 569 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 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\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,
          "displayValue": "Est savings of 82 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 82 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": "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": 0,
          "displayValue": "Est savings of 880 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 Eliminate render-blocking resources\n\n- Lighthouse audit: render-blocking-resources\n- Current value: Est savings of 880 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\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": "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": 0.87,
          "displayValue": "3.6 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 Speed Index\n\n- Lighthouse audit: speed-index\n- Current value: 3.6 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\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": "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": "1,023 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: 1,023 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://barcelona.cat/en/what-to-do-in-bcn/culture/cinemas",
      "status": "ok",
      "finalUrl": "https://www.barcelona.cat/en/what-to-do-in-bcn/culture/cinemas",
      "performanceScore": 0.64,
      "bestPracticesScore": 1,
      "transferBytes": 827716,
      "co2Grams": 0.3170826040824001,
      "greenWeb": {
        "page": {
          "hostname": "www.barcelona.cat",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-13T22:38:00.231825",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.barcelona.cat",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76426,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "stylesheet",
            "requestCount": 1,
            "transferBytes": 24654,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "cdnjs.cloudflare.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15869,
            "sampleUrl": "https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js",
            "greenCheck": {
              "hostname": "cdnjs.cloudflare.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:34",
              "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/cdnjs.cloudflare.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15566,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7147,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 4128,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/css/bcn-avisos.css",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "fonts.googleapis.com",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 2483,
            "sampleUrl": "https://fonts.googleapis.com/css?family=Source+Sans+3:200,200i,300,300i,400,400i,500,500i,600,600i,700,700i,900,900i",
            "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
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=XlfNXl&url=https%3A%2F%2Fwww.barcelona.cat%2Fen%2Fwhat-to-do-in-bcn%2Fculture%2Fcinemas",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 11,
          "greenCount": 5,
          "notGreenCount": 7,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 75,
        "urgency": "high",
        "pageElementOccurrences": 5,
        "uniqueElementsAssessed": 2,
        "reusedFromCacheCount": 2,
        "components": [
          {
            "signature": "form|get|/en|input|text|query|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "text",
            "fieldName": "query",
            "formContext": "form|get|/en",
            "hasLabel": true,
            "hasValidationRule": false,
            "hasErrorMessagingHook": false,
            "toolingFriendly": false,
            "assessment": {
              "score": 60,
              "urgency": "high",
              "issues": [
                "No explicit validation rule",
                "No error messaging hook",
                "Missing autocomplete for tooling support"
              ],
              "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.",
                "Provide meaningful autocomplete values to support browsers and assistive tooling."
              ]
            },
            "reusedFromCache": true
          },
          {
            "signature": "no-form|select|select|anonymous|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "select",
            "fieldName": null,
            "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": "No explicit validation rule",
            "urgency": "medium",
            "detail": "2 unique form control signature(s) on this page include this issue."
          },
          {
            "title": "No error messaging hook",
            "urgency": "medium",
            "detail": "2 unique form control signature(s) on this page include this issue."
          },
          {
            "title": "Missing autocomplete for tooling support",
            "urgency": "medium",
            "detail": "1 unique form control signature(s) on this page include this issue."
          },
          {
            "title": "Missing associated label",
            "urgency": "high",
            "detail": "1 unique form control signature(s) on this page include this issue."
          }
        ]
      },
      "metadata": {
        "score": 25,
        "urgency": "low",
        "checks": {
          "hasTitle": true,
          "hasLang": true,
          "hasDescription": false,
          "hasCanonical": true,
          "hasOpenGraphCore": false,
          "hasTwitterCard": true,
          "hasViewport": true,
          "hasCharset": true,
          "hasValidStructuredData": true,
          "hasInvalidStructuredData": false
        },
        "observed": {
          "title": "Cinemas | Barcelona.cat | Ajuntament de Barcelona",
          "lang": "en",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "",
          "robots": "",
          "canonical": "https://www.barcelona.cat/en/what-to-do-in-bcn/culture/cinemas",
          "ogTitle": "Cinemas",
          "ogDescription": "",
          "ogType": "Web",
          "ogUrl": "https://www.barcelona.cat/en/what-to-do-in-bcn/culture/cinemas",
          "twitterCard": "summary_large_image",
          "ldJsonCount": 0,
          "validLdJsonCount": 0,
          "invalidLdJsonCount": 0
        },
        "recommendations": [
          {
            "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."
          }
        ]
      },
      "layoutAdaptation": {
        "score": 30,
        "urgency": "medium",
        "checks": {
          "testedMobile": true,
          "testedTablet": true,
          "horizontalOverflowOnMobile": false,
          "horizontalOverflowOnTablet": false,
          "mobileSmallTapTargets": 65,
          "tabletSmallTapTargets": 65,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 65,
            "oversizedMedia": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 65,
            "oversizedMedia": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 65 small targets on mobile and 65 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 59,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": true,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": true,
          "externalScriptCount": 8,
          "externalScriptsWithoutIntegrity": 8,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "cache-control": "max-age=300, public",
            "content-encoding": "gzip",
            "content-language": "en",
            "content-length": "11718",
            "content-type": "text/html; charset=UTF-8",
            "date": "Mon, 13 Apr 2026 22:53:51 GMT",
            "etag": "\"1776120830-gzip\"",
            "expires": "Sun, 19 Nov 1978 05:00:00 GMT",
            "last-modified": "Mon, 13 Apr 2026 22:53:50 GMT",
            "server": "nginx",
            "vary": "Cookie,Accept-Encoding",
            "via": "1.1 ca2190123e61f1744d1210c24c87c840.cloudfront.net (CloudFront)",
            "x-amz-cf-id": "U-xIq7N4KM3kFMMgzr_Qe_VmbKHkjOZzQ_J5SpdDaMgI0aIExLIttw==",
            "x-amz-cf-pop": "IAD12-P5",
            "x-cache": "Miss from cloudfront",
            "x-content-type-options": "nosniff",
            "x-frame-options": "SAMEORIGIN",
            "x-generator": "Drupal 10 (https://www.drupal.org)"
          },
          "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": "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": "8 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 25,
        "urgency": "low",
        "origin": "https://www.barcelona.cat",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://www.barcelona.cat/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/sitemap.xml",
            "found": true,
            "status": 200,
            "contentType": "application/xml; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/manifest.webmanifest",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/favicon.ico",
            "found": true,
            "status": 200,
            "contentType": "image/x-icon"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "low",
            "detail": "Missing beneficial file(s): /.well-known/security.txt, /manifest.webmanifest."
          }
        ]
      },
      "mediaHints": {
        "score": 50,
        "urgency": "medium",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 21,
          "imagesWithLazy": 0,
          "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 21 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 85,
        "urgency": "medium",
        "data": {
          "hasPrintStyles": true,
          "hasReducedMotion": true,
          "media": {
            "totalImages": 26,
            "lazyImages": 1,
            "totalIframes": 1,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "\"Source Sans Pro\", \"Helvetica Neue\", Helvetica, Arial, sans-serif",
            "usesSystemFont": true
          },
          "tracking": {
            "count": 0,
            "scripts": []
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 1/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": "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"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 16,
        "urgency": "low",
        "totalEstimatedSavingsBytes": 130442.55,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Use modern image compression formats",
            "urgency": "medium",
            "estimatedSavingsBytes": 72410.55,
            "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size."
          },
          {
            "id": "uses-optimized-images",
            "title": "Improve image encoding quality/size",
            "urgency": "medium",
            "estimatedSavingsBytes": 58032,
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings."
          }
        ],
        "recommendations": [
          {
            "title": "Use modern image compression formats",
            "urgency": "medium",
            "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size. Estimated savings: 70.71 KB."
          },
          {
            "title": "Improve image encoding quality/size",
            "urgency": "medium",
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 56.67 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": 341950.55,
        "totalEstimatedBlockingMs": 1642,
        "opportunities": [
          {
            "id": "render-blocking-resources",
            "title": "Eliminate render-blocking resources",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering.",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1642,
            "displayValue": "Est savings of 1,640 ms",
            "urgency": "high",
            "sourceAuditId": "render-blocking-resources"
          },
          {
            "id": "unused-css-rules",
            "title": "Remove unused CSS",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped.",
            "estimatedSavingsBytes": 91918,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 90 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-css-rules"
          },
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 87109,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 85 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": 72410.55,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 71 KiB",
            "urgency": "medium",
            "sourceAuditId": "modern-image-formats"
          },
          {
            "id": "uses-optimized-images",
            "title": "Compress oversized image assets",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss.",
            "estimatedSavingsBytes": 58032,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 57 KiB",
            "urgency": "medium",
            "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": 32481,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 32 KiB",
            "urgency": "low",
            "sourceAuditId": "unused-javascript"
          }
        ],
        "recommendations": [
          {
            "title": "Eliminate render-blocking resources",
            "urgency": "high",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering. Estimated render unblocking: 1642 ms."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "medium",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 89.76 KB."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "medium",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 85.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: 70.71 KB."
          },
          {
            "title": "Compress oversized image assets",
            "urgency": "medium",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 56.67 KB."
          },
          {
            "title": "Remove unused JavaScript",
            "urgency": "low",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 31.72 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": 10,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 8,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "8 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": 168011.08320530725
        },
        "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: 164.07 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: 164.07 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": "medium",
        "transferBytes": 827716,
        "css": {
          "unusedBytes": 91918,
          "ratio": 0.11105016696548091,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 32481,
          "duplicatedBytes": 0,
          "ratio": 0.039241720590154114,
          "auditIds": [
            "unused-javascript",
            "duplicated-javascript"
          ]
        },
        "html": {
          "estimatedPenalty": 0.25,
          "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": "high",
            "estimatedSavingsBytes": 91918,
            "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": "medium",
            "estimatedSavingsBytes": 32481,
            "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": 827716,
        "estimatedDeferrableBytes": 211508,
        "renderBlockingMs": 1642,
        "breakdown": {
          "offscreenImageSavings": 87109,
          "unusedJavascriptSavings": 32481,
          "unusedCssSavings": 91918
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 87109,
            "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": "medium",
            "estimatedSavingsBytes": 32481,
            "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": "high",
            "estimatedSavingsBytes": 91918,
            "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": "Eliminate render-blocking resources",
            "area": "render-path",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1642,
            "strategy": "Defer scripts/styles not required for first paint and preload only truly critical assets.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-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 www.barcelona.cat",
            "area": "font",
            "urgency": "medium",
            "estimatedSavingsBytes": 90559,
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "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 www.barcelona.cat",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 84135,
            "url": "https://www.barcelona.cat/themes/barcelonacat_theme/images/menu/viula.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 cdn.matomo.cloud",
            "area": "script",
            "urgency": "medium",
            "estimatedSavingsBytes": 76426,
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.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": 65,
        "urgency": "high",
        "providerCount": 8,
        "requestCount": 9,
        "transferBytes": 155330,
        "notGreenCount": 5,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76426,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "cdnjs.cloudflare.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15869,
            "sampleUrl": "https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js",
            "greenCheck": {
              "hostname": "cdnjs.cloudflare.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:34",
              "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/cdnjs.cloudflare.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15566,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7147,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=XlfNXl&url=https%3A%2F%2Fwww.barcelona.cat%2Fen%2Fwhat-to-do-in-bcn%2Fculture%2Fcinemas",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "high",
            "detail": "Track 8 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."
          },
          {
            "title": "Prioritize greener alternatives for third-party providers",
            "urgency": "high",
            "detail": "5 third-party script origin(s) are not confirmed green in the Green Web Foundation dataset."
          }
        ]
      },
      "redundancy": {
        "score": 28,
        "urgency": "low",
        "transferBytes": 827716,
        "estimatedRedundantBytes": 124399,
        "redundancyRatio": 0.15029188755563502,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 91918,
            "displayValue": "Est savings of 90 KiB"
          },
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 32481,
            "displayValue": "Est savings of 32 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 91918,
            "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 unused javascript",
            "urgency": "medium",
            "estimatedSavingsBytes": 32481,
            "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 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": 20,
        "urgency": "medium",
        "totalTransferBytes": 827716,
        "heavyRequestCount": 4,
        "heavyBytes": 271002,
        "heavyRatio": 0.3274094012922307,
        "heavyRequests": [
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "transferSize": 90559,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "transferSize": 76426,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "cdn.matomo.cloud"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament/fonts/icoajuntament.ttf?8aaig7",
            "transferSize": 54921,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/css/css_evpTRQTawGYS1Ro7RbXq3hBxwat7AU-RJm1V8ZgzeaE.css?delta=5&language=en&theme=barcelonacat_theme&include=eJyFztEOwiAMheEXgnDhA5EDq4gySmiZ7u1dYuJinPGqTf_voriOqpipqseShcW9hkXLBntMI8NNUGo53qh_JzpjFBUT0CMVrohQzwv1nicSt8lhlbls_ZdpSGSXTPdPoBeayQVmFe1oPk71CKTCAcWKriXXdCRyZLv_fSSEx3bzgir-9A-0zibE6jfW4d6bp4dSryhGVlGaXYDQE_H9jbg&tcut5n",
            "transferSize": 49096,
            "resourceType": "stylesheet",
            "mimeType": "text/css",
            "domain": "www.barcelona.cat"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "font",
            "count": 2,
            "transferBytes": 145480
          },
          {
            "resourceType": "script",
            "count": 1,
            "transferBytes": 76426
          },
          {
            "resourceType": "stylesheet",
            "count": 1,
            "transferBytes": 49096
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.barcelona.cat",
            "count": 3,
            "transferBytes": 194576
          },
          {
            "domain": "cdn.matomo.cloud",
            "count": 1,
            "transferBytes": 76426
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Lazy-load offscreen images and media galleries",
            "urgency": "medium",
            "estimatedSavingsBytes": 87109,
            "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": "Defer non-critical UI modules until after first render",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "strategy": "Keep only above-the-fold resources in the initial path; hydrate or import secondary modules later.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 www.barcelona.cat",
            "urgency": "medium",
            "estimatedSavingsBytes": 90559,
            "strategy": "Subset or defer this font so full font payloads are only fetched when needed.",
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 cdn.matomo.cloud",
            "urgency": "medium",
            "estimatedSavingsBytes": 76426,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.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.1,
          "displayValue": "6.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: 6.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-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,
          "displayValue": "Est savings of 90 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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 90 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,
          "displayValue": "Est savings of 71 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 71 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 57 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 57 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,
          "displayValue": "Est savings of 85 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 85 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": "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": 0,
          "displayValue": "Est savings of 1,640 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 Eliminate render-blocking resources\n\n- Lighthouse audit: render-blocking-resources\n- Current value: Est savings of 1,640 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\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": "server-response-time",
          "title": "Reduce initial server response time",
          "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": 0,
          "displayValue": "Root document took 1,000 ms",
          "impact": "high",
          "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 Reduce initial server response time\n\n- Lighthouse audit: server-response-time\n- Current value: Root document took 1,000 ms\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": "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,
          "displayValue": "1,053 elements",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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: 1,053 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"
        },
        {
          "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": 0.74,
          "displayValue": "4.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 Speed Index\n\n- Lighthouse audit: speed-index\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\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": 0.5,
          "displayValue": "Est savings of 32 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 32 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"
        }
      ]
    },
    {
      "url": "https://barcelona.cat/en/what-to-do-in-bcn/magic-fountain/choreographies-magic-fountain",
      "status": "ok",
      "finalUrl": "https://www.barcelona.cat/en/what-to-do-in-bcn/magic-fountain/choreographies-magic-fountain",
      "performanceScore": 0.68,
      "bestPracticesScore": 1,
      "transferBytes": 856451,
      "co2Grams": 0.3280904481114001,
      "greenWeb": {
        "page": {
          "hostname": "www.barcelona.cat",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-13T22:38:00.231825",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.barcelona.cat",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76425,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "stylesheet",
            "requestCount": 1,
            "transferBytes": 24654,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15565,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7155,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 4109,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/css/bcn-avisos.css",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "fonts.googleapis.com",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 2483,
            "sampleUrl": "https://fonts.googleapis.com/css?family=Source+Sans+3:200,200i,300,300i,400,400i,500,500i,600,600i,700,700i,900,900i",
            "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
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=hgYFXQ&url=https%3A%2F%2Fwww.barcelona.cat%2Fen%2Fwhat-to-do-in-bcn%2Fmagic-fountain%2Fchoreographies-magic-fountain",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 10,
          "greenCount": 4,
          "notGreenCount": 7,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 60,
        "urgency": "high",
        "pageElementOccurrences": 1,
        "uniqueElementsAssessed": 1,
        "reusedFromCacheCount": 1,
        "components": [
          {
            "signature": "form|get|/en|input|text|query|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "text",
            "fieldName": "query",
            "formContext": "form|get|/en",
            "hasLabel": true,
            "hasValidationRule": false,
            "hasErrorMessagingHook": false,
            "toolingFriendly": false,
            "assessment": {
              "score": 60,
              "urgency": "high",
              "issues": [
                "No explicit validation rule",
                "No error messaging hook",
                "Missing autocomplete for tooling support"
              ],
              "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.",
                "Provide meaningful autocomplete values to support browsers and assistive tooling."
              ]
            },
            "reusedFromCache": true
          }
        ],
        "recommendations": [
          {
            "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."
          },
          {
            "title": "Missing autocomplete for tooling support",
            "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": "Magic Fountain's Choreographies | Barcelona City Council",
          "lang": "en",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "Check out the calendar for times and a description of the choreographies you can see at the Montjuïc Magic Fountain in Barcelona.",
          "robots": "",
          "canonical": "https://www.barcelona.cat/en/what-to-do-in-bcn/magic-fountain/choreographies-magic-fountain",
          "ogTitle": "Choreographies for the Magic Fountain",
          "ogDescription": "A calendar to consult, offering details on the times of all the Barcelona Montjuïc Magic Fountain’s shows and a description of its choreographies.",
          "ogType": "Web",
          "ogUrl": "https://www.barcelona.cat/en/what-to-do-in-bcn/magic-fountain/choreographies-magic-fountain",
          "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": 48,
          "tabletSmallTapTargets": 46,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 48,
            "oversizedMedia": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 46,
            "oversizedMedia": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 48 small targets on mobile and 46 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 59,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": true,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": true,
          "externalScriptCount": 7,
          "externalScriptsWithoutIntegrity": 7,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "cache-control": "max-age=300, public",
            "content-encoding": "gzip",
            "content-language": "en",
            "content-length": "14801",
            "content-type": "text/html; charset=UTF-8",
            "date": "Mon, 13 Apr 2026 22:54:05 GMT",
            "etag": "\"1776120844-gzip\"",
            "expires": "Sun, 19 Nov 1978 05:00:00 GMT",
            "last-modified": "Mon, 13 Apr 2026 22:54:04 GMT",
            "server": "nginx",
            "vary": "Cookie,Accept-Encoding",
            "via": "1.1 ca2190123e61f1744d1210c24c87c840.cloudfront.net (CloudFront)",
            "x-amz-cf-id": "qyN8S_2eaz_k76Mmo2I08eCyCRJ6z7fGgOLLOgWMeAPR9QTf8fT3PQ==",
            "x-amz-cf-pop": "IAD12-P5",
            "x-cache": "Miss from cloudfront",
            "x-content-type-options": "nosniff",
            "x-frame-options": "SAMEORIGIN",
            "x-generator": "Drupal 10 (https://www.drupal.org)"
          },
          "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": "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": "7 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 25,
        "urgency": "low",
        "origin": "https://www.barcelona.cat",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://www.barcelona.cat/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/sitemap.xml",
            "found": true,
            "status": 200,
            "contentType": "application/xml; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/manifest.webmanifest",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/favicon.ico",
            "found": true,
            "status": 200,
            "contentType": "image/x-icon"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "low",
            "detail": "Missing beneficial file(s): /.well-known/security.txt, /manifest.webmanifest."
          }
        ]
      },
      "mediaHints": {
        "score": 39,
        "urgency": "medium",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 17,
          "imagesWithLazy": 3,
          "imagesWithoutLazy": 14
        },
        "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": "14 of 17 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 85,
        "urgency": "medium",
        "data": {
          "hasPrintStyles": true,
          "hasReducedMotion": true,
          "media": {
            "totalImages": 22,
            "lazyImages": 4,
            "totalIframes": 1,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "\"Source Sans Pro\", \"Helvetica Neue\", Helvetica, Arial, sans-serif",
            "usesSystemFont": true
          },
          "tracking": {
            "count": 0,
            "scripts": []
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 4/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": "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"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 15,
        "urgency": "low",
        "totalEstimatedSavingsBytes": 130442.55,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Use modern image compression formats",
            "urgency": "medium",
            "estimatedSavingsBytes": 72410.55,
            "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size."
          },
          {
            "id": "uses-optimized-images",
            "title": "Improve image encoding quality/size",
            "urgency": "medium",
            "estimatedSavingsBytes": 58032,
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings."
          }
        ],
        "recommendations": [
          {
            "title": "Use modern image compression formats",
            "urgency": "medium",
            "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size. Estimated savings: 70.71 KB."
          },
          {
            "title": "Improve image encoding quality/size",
            "urgency": "medium",
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 56.67 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": 355633.55,
        "totalEstimatedBlockingMs": 1493,
        "opportunities": [
          {
            "id": "render-blocking-resources",
            "title": "Eliminate render-blocking resources",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering.",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1493,
            "displayValue": "Est savings of 1,490 ms",
            "urgency": "high",
            "sourceAuditId": "render-blocking-resources"
          },
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 87107,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 85 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": 83195,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 81 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-css-rules"
          },
          {
            "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": 72410.55,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 71 KiB",
            "urgency": "medium",
            "sourceAuditId": "modern-image-formats"
          },
          {
            "id": "uses-optimized-images",
            "title": "Compress oversized image assets",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss.",
            "estimatedSavingsBytes": 58032,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 57 KiB",
            "urgency": "medium",
            "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": 54889,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 54 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-javascript"
          }
        ],
        "recommendations": [
          {
            "title": "Eliminate render-blocking resources",
            "urgency": "high",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering. Estimated render unblocking: 1493 ms."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "medium",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 85.07 KB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "medium",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 81.25 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: 70.71 KB."
          },
          {
            "title": "Compress oversized image assets",
            "urgency": "medium",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 56.67 KB."
          },
          {
            "title": "Remove unused JavaScript",
            "urgency": "medium",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 53.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": 10,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 7,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "7 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": 167998.9772346369
        },
        "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: 164.06 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: 164.06 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": "medium",
        "transferBytes": 856451,
        "css": {
          "unusedBytes": 83195,
          "ratio": 0.09713924089060554,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 54889,
          "duplicatedBytes": 0,
          "ratio": 0.06408889708809962,
          "auditIds": [
            "unused-javascript",
            "duplicated-javascript"
          ]
        },
        "html": {
          "estimatedPenalty": 0.25,
          "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": "high",
            "estimatedSavingsBytes": 83195,
            "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": "medium",
            "estimatedSavingsBytes": 54889,
            "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": 856451,
        "estimatedDeferrableBytes": 225191,
        "renderBlockingMs": 1493,
        "breakdown": {
          "offscreenImageSavings": 87107,
          "unusedJavascriptSavings": 54889,
          "unusedCssSavings": 83195
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 87107,
            "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": "medium",
            "estimatedSavingsBytes": 54889,
            "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": "high",
            "estimatedSavingsBytes": 83195,
            "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": "Eliminate render-blocking resources",
            "area": "render-path",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1493,
            "strategy": "Defer scripts/styles not required for first paint and preload only truly critical assets.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-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 www.barcelona.cat",
            "area": "font",
            "urgency": "medium",
            "estimatedSavingsBytes": 90559,
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "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 www.barcelona.cat",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 84135,
            "url": "https://www.barcelona.cat/themes/barcelonacat_theme/images/menu/viula.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 cdn.matomo.cloud",
            "area": "script",
            "urgency": "medium",
            "estimatedSavingsBytes": 76425,
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.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": 64,
        "urgency": "high",
        "providerCount": 7,
        "requestCount": 8,
        "transferBytes": 139467,
        "notGreenCount": 5,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76425,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15565,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7155,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=hgYFXQ&url=https%3A%2F%2Fwww.barcelona.cat%2Fen%2Fwhat-to-do-in-bcn%2Fmagic-fountain%2Fchoreographies-magic-fountain",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "high",
            "detail": "Track 7 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."
          },
          {
            "title": "Prioritize greener alternatives for third-party providers",
            "urgency": "high",
            "detail": "5 third-party script origin(s) are not confirmed green in the Green Web Foundation dataset."
          }
        ]
      },
      "redundancy": {
        "score": 29,
        "urgency": "medium",
        "transferBytes": 856451,
        "estimatedRedundantBytes": 138084,
        "redundancyRatio": 0.16122813797870514,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 83195,
            "displayValue": "Est savings of 81 KiB"
          },
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 54889,
            "displayValue": "Est savings of 54 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 83195,
            "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 unused javascript",
            "urgency": "medium",
            "estimatedSavingsBytes": 54889,
            "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 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": 20,
        "urgency": "medium",
        "totalTransferBytes": 856451,
        "heavyRequestCount": 4,
        "heavyBytes": 273847,
        "heavyRatio": 0.31974625518564403,
        "heavyRequests": [
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "transferSize": 90559,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "transferSize": 76425,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "cdn.matomo.cloud"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament/fonts/icoajuntament.ttf?8aaig7",
            "transferSize": 54919,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/css/css_qDD4BCxE8K-iT7MRORwp32v03DlJblP9-xrYwOBWlQo.css?delta=5&language=en&theme=barcelonacat_theme&include=eJyFz01uxCAMBeALwbDogdAD3JQRwcg2aXL7ZqbqSJVSdePfb_Nwn92wUreIrSpr-G4eo7oEydS4I8MibyRSC2k49fTG3M7_X2ZgIb9V-vwN7INWConZ1AQj5tKvwDt6PhLvV7-lcULzakerfbkSNbPHK9eVUJ7nLSq6xrf_wBB2Kfd4MkF4TZF2I-loLqNRL5D4yBt-NpdZKBSZA-2GO3anhxqtIUHJPaiGZ72tXGajLwCJms4&tcut5n",
            "transferSize": 51944,
            "resourceType": "stylesheet",
            "mimeType": "text/css",
            "domain": "www.barcelona.cat"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "font",
            "count": 2,
            "transferBytes": 145478
          },
          {
            "resourceType": "script",
            "count": 1,
            "transferBytes": 76425
          },
          {
            "resourceType": "stylesheet",
            "count": 1,
            "transferBytes": 51944
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.barcelona.cat",
            "count": 3,
            "transferBytes": 197422
          },
          {
            "domain": "cdn.matomo.cloud",
            "count": 1,
            "transferBytes": 76425
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Lazy-load offscreen images and media galleries",
            "urgency": "medium",
            "estimatedSavingsBytes": 87107,
            "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": "medium",
            "estimatedSavingsBytes": 54889,
            "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": "Defer non-critical UI modules until after first render",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "strategy": "Keep only above-the-fold resources in the initial path; hydrate or import secondary modules later.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 www.barcelona.cat",
            "urgency": "medium",
            "estimatedSavingsBytes": 90559,
            "strategy": "Subset or defer this font so full font payloads are only fetched when needed.",
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 cdn.matomo.cloud",
            "urgency": "medium",
            "estimatedSavingsBytes": 76425,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.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.09,
          "displayValue": "6.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: 6.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 54 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 54 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,
          "displayValue": "Est savings of 81 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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 81 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,
          "displayValue": "Est savings of 71 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 71 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 57 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 57 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,
          "displayValue": "Est savings of 85 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 85 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": "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": 0,
          "displayValue": "Est savings of 1,490 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 Eliminate render-blocking resources\n\n- Lighthouse audit: render-blocking-resources\n- Current value: Est savings of 1,490 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\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": "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,
          "displayValue": "1,535 elements",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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: 1,535 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"
        },
        {
          "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": 0.86,
          "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 Speed Index\n\n- Lighthouse audit: speed-index\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\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"
        }
      ]
    },
    {
      "url": "https://barcelona.cat/es/vivir-en-bcn/con-ninos-y-ninas",
      "status": "ok",
      "finalUrl": "https://www.barcelona.cat/es/vivir-en-bcn/con-ninos-y-ninas",
      "performanceScore": 0.63,
      "bestPracticesScore": 1,
      "transferBytes": 3087581,
      "co2Grams": 1.1827948520934002,
      "greenWeb": {
        "page": {
          "hostname": "www.barcelona.cat",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-13T22:38:00.231825",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.barcelona.cat",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76425,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "stylesheet",
            "requestCount": 1,
            "transferBytes": 24654,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15565,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7152,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 4109,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/css/bcn-avisos.css",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "fonts.googleapis.com",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 2483,
            "sampleUrl": "https://fonts.googleapis.com/css?family=Source+Sans+3:200,200i,300,300i,400,400i,500,500i,600,600i,700,700i,900,900i",
            "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
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=5hEWq3&url=https%3A%2F%2Fwww.barcelona.cat%2Fes%2Fvivir-en-bcn%2Fcon-ninos-y-ninas",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 10,
          "greenCount": 4,
          "notGreenCount": 7,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 60,
        "urgency": "high",
        "pageElementOccurrences": 1,
        "uniqueElementsAssessed": 1,
        "reusedFromCacheCount": 1,
        "components": [
          {
            "signature": "form|get|/es/|input|text|query|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "text",
            "fieldName": "query",
            "formContext": "form|get|/es/",
            "hasLabel": true,
            "hasValidationRule": false,
            "hasErrorMessagingHook": false,
            "toolingFriendly": false,
            "assessment": {
              "score": 60,
              "urgency": "high",
              "issues": [
                "No explicit validation rule",
                "No error messaging hook",
                "Missing autocomplete for tooling support"
              ],
              "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.",
                "Provide meaningful autocomplete values to support browsers and assistive tooling."
              ]
            },
            "reusedFromCache": true
          }
        ],
        "recommendations": [
          {
            "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."
          },
          {
            "title": "Missing autocomplete for tooling support",
            "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": "Niños y niñas | Barcelona.cat | Ayuntamiento de Barcelona",
          "lang": "es",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "Consulta la agenda de actividades y los servicios de salud y educación para vivir Barcelona con niños y niñas.",
          "robots": "",
          "canonical": "https://www.barcelona.cat/es/vivir-en-bcn/con-ninos-y-ninas",
          "ogTitle": "Barcelona con niños y niñas",
          "ogDescription": "Todo lo que necesitas para vivir la ciudad con niños y niñas: desde agenda municipal hasta recursos educativos y servicios para familias. ¡Explora!",
          "ogType": "Web",
          "ogUrl": "https://www.barcelona.cat/es/vivir-en-bcn/con-ninos-y-ninas",
          "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": 69,
          "tabletSmallTapTargets": 66,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 69,
            "oversizedMedia": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 66,
            "oversizedMedia": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 69 small targets on mobile and 66 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 59,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": true,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": true,
          "externalScriptCount": 7,
          "externalScriptsWithoutIntegrity": 7,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "cache-control": "max-age=300, public",
            "content-encoding": "gzip",
            "content-language": "es",
            "content-length": "14864",
            "content-type": "text/html; charset=UTF-8",
            "date": "Mon, 13 Apr 2026 22:54:18 GMT",
            "etag": "\"1776120858-gzip\"",
            "expires": "Sun, 19 Nov 1978 05:00:00 GMT",
            "last-modified": "Mon, 13 Apr 2026 22:54:18 GMT",
            "server": "nginx",
            "vary": "Cookie,Accept-Encoding",
            "via": "1.1 ca2190123e61f1744d1210c24c87c840.cloudfront.net (CloudFront)",
            "x-amz-cf-id": "1lRSrLD3zbEvfbg8tiVgYJ1kwyZ3ThcBTOGqDHeTojwsG5ykqEm9RQ==",
            "x-amz-cf-pop": "IAD12-P5",
            "x-cache": "Miss from cloudfront",
            "x-content-type-options": "nosniff",
            "x-frame-options": "SAMEORIGIN",
            "x-generator": "Drupal 10 (https://www.drupal.org)"
          },
          "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": "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": "7 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 25,
        "urgency": "low",
        "origin": "https://www.barcelona.cat",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://www.barcelona.cat/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/sitemap.xml",
            "found": true,
            "status": 200,
            "contentType": "application/xml; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/manifest.webmanifest",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/favicon.ico",
            "found": true,
            "status": 200,
            "contentType": "image/x-icon"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "low",
            "detail": "Missing beneficial file(s): /.well-known/security.txt, /manifest.webmanifest."
          }
        ]
      },
      "mediaHints": {
        "score": 20,
        "urgency": "low",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 29,
          "imagesWithLazy": 18,
          "imagesWithoutLazy": 11
        },
        "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."
          }
        ]
      },
      "wsgCustom": {
        "score": 85,
        "urgency": "medium",
        "data": {
          "hasPrintStyles": true,
          "hasReducedMotion": true,
          "media": {
            "totalImages": 34,
            "lazyImages": 19,
            "totalIframes": 1,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "\"Source Sans Pro\", \"Helvetica Neue\", Helvetica, Arial, sans-serif",
            "usesSystemFont": true
          },
          "tracking": {
            "count": 0,
            "scripts": []
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 19/34 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": "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"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 100,
        "urgency": "high",
        "totalEstimatedSavingsBytes": 3454801.8,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Use modern image compression formats",
            "urgency": "high",
            "estimatedSavingsBytes": 1958197.7999999998,
            "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": 1496604,
            "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: 1.87 MB."
          },
          {
            "title": "Improve image encoding quality/size",
            "urgency": "high",
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 1.43 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": 3604478.8,
        "totalEstimatedBlockingMs": 1521,
        "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": 1958197.7999999998,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 1,912 KiB",
            "urgency": "high",
            "sourceAuditId": "modern-image-formats"
          },
          {
            "id": "uses-optimized-images",
            "title": "Compress oversized image assets",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss.",
            "estimatedSavingsBytes": 1496604,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 1,462 KiB",
            "urgency": "high",
            "sourceAuditId": "uses-optimized-images"
          },
          {
            "id": "render-blocking-resources",
            "title": "Eliminate render-blocking resources",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering.",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1521,
            "displayValue": "Est savings of 1,520 ms",
            "urgency": "high",
            "sourceAuditId": "render-blocking-resources"
          },
          {
            "id": "unused-css-rules",
            "title": "Remove unused CSS",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped.",
            "estimatedSavingsBytes": 83599,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 82 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-css-rules"
          },
          {
            "id": "unused-javascript",
            "title": "Remove unused JavaScript",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code.",
            "estimatedSavingsBytes": 58176,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 57 KiB",
            "urgency": "medium",
            "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": 7902,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 8 KiB",
            "urgency": "low",
            "sourceAuditId": "offscreen-images"
          }
        ],
        "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.87 MB."
          },
          {
            "title": "Compress oversized image assets",
            "urgency": "high",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 1.43 MB."
          },
          {
            "title": "Eliminate render-blocking resources",
            "urgency": "high",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering. Estimated render unblocking: 1521 ms."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "medium",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 81.64 KB."
          },
          {
            "title": "Remove unused JavaScript",
            "urgency": "medium",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 56.81 KB."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "low",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 7.72 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": 10,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 7,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "7 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": 167996.05223463685
        },
        "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: 164.06 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: 164.06 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": "medium",
        "transferBytes": 3087581,
        "css": {
          "unusedBytes": 83599,
          "ratio": 0.02707588885927203,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 58176,
          "duplicatedBytes": 0,
          "ratio": 0.018841934835069914,
          "auditIds": [
            "unused-javascript",
            "duplicated-javascript"
          ]
        },
        "html": {
          "estimatedPenalty": 0.25,
          "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": "high",
            "estimatedSavingsBytes": 83599,
            "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": "medium",
            "estimatedSavingsBytes": 58176,
            "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": 16,
        "urgency": "high",
        "transferBytes": 3087581,
        "estimatedDeferrableBytes": 149677,
        "renderBlockingMs": 1521,
        "breakdown": {
          "offscreenImageSavings": 7902,
          "unusedJavascriptSavings": 58176,
          "unusedCssSavings": 83599
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 7902,
            "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": "medium",
            "estimatedSavingsBytes": 58176,
            "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": "high",
            "estimatedSavingsBytes": 83599,
            "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": "Eliminate render-blocking resources",
            "area": "render-path",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1521,
            "strategy": "Defer scripts/styles not required for first paint and preload only truly critical assets.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-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 www.barcelona.cat",
            "area": "image",
            "urgency": "high",
            "estimatedSavingsBytes": 265397,
            "url": "https://www.barcelona.cat/sites/default/files/styles/distribuidora_interior/public/dise-drassanes-13-2-13-al-01_529x410.jpg?itok=2-rbjPFi",
            "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": 64,
        "urgency": "high",
        "providerCount": 7,
        "requestCount": 8,
        "transferBytes": 139464,
        "notGreenCount": 5,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76425,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15565,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7152,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=5hEWq3&url=https%3A%2F%2Fwww.barcelona.cat%2Fes%2Fvivir-en-bcn%2Fcon-ninos-y-ninas",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "high",
            "detail": "Track 7 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."
          },
          {
            "title": "Prioritize greener alternatives for third-party providers",
            "urgency": "high",
            "detail": "5 third-party script origin(s) are not confirmed green in the Green Web Foundation dataset."
          }
        ]
      },
      "redundancy": {
        "score": 23,
        "urgency": "medium",
        "transferBytes": 3087581,
        "estimatedRedundantBytes": 141775,
        "redundancyRatio": 0.04591782369434195,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 83599,
            "displayValue": "Est savings of 82 KiB"
          },
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 58176,
            "displayValue": "Est savings of 57 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 83599,
            "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 unused javascript",
            "urgency": "medium",
            "estimatedSavingsBytes": 58176,
            "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 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": 42,
        "urgency": "high",
        "totalTransferBytes": 3087581,
        "heavyRequestCount": 17,
        "heavyBytes": 2439959,
        "heavyRatio": 0.7902493894087314,
        "heavyRequests": [
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/distribuidora_interior/public/dise-drassanes-13-2-13-al-01_529x410.jpg?itok=2-rbjPFi",
            "transferSize": 265397,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/distribuidora_interior/public/dise-cosmocaixa-8-4-14-vz-02_529x410.jpg?itok=6Q6nH-h2",
            "transferSize": 242350,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/distribuidora_interior/public/museu_musica_sara_guastevi_529x410.jpg?itok=3NnQz2vu",
            "transferSize": 226681,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/destacat_gran/public/amb-estudis-triar-escola-528x228_2.jpg?itok=7-vuyNT4",
            "transferSize": 188822,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/distribuidora_interior/public/museu_xocolata_2_529x410.jpg?itok=9ECf-pD1",
            "transferSize": 174012,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/destacat_gran/public/amb_nens_i_nenes_fem_esports_528x228.jpg?itok=oFqtEhFj",
            "transferSize": 167995,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/destacat_petit/public/anem_parc_64a1708_252x228_1.png?itok=WvwV4g2l",
            "transferSize": 166430,
            "resourceType": "image",
            "mimeType": "image/png",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/destacat_gran/public/amb_nens_i_nenes_lleure_528x228.jpg?itok=rthlEzMl",
            "transferSize": 131279,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/distribuidora_interior/public/dise-museu-blau-20-09-11-vz-023_529x410.jpg?itok=crYeytoy",
            "transferSize": 129022,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/destacat_gran/public/amb_nens_i_nenes_atencio_social_528x228.jpg?itok=eY335nDg",
            "transferSize": 121922,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/destacat_gran/public/amb_nens_i_nenes_infants_sans_528x228.jpg?itok=SDeIbmMy",
            "transferSize": 121884,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/destacat_gran/public/amb_nens_i_nenes_familia_528x228.jpg?itok=1kzT0qDV",
            "transferSize": 121626,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/destacat_gran/public/amb_nens_i_nenes_com_eduquem_528x228.jpg?itok=1nSO8OAL",
            "transferSize": 108700,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "transferSize": 90561,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "transferSize": 76425,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "cdn.matomo.cloud"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament/fonts/icoajuntament.ttf?8aaig7",
            "transferSize": 54919,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/css/css_qDD4BCxE8K-iT7MRORwp32v03DlJblP9-xrYwOBWlQo.css?delta=5&language=es&theme=barcelonacat_theme&include=eJyFz8GOwyAMBNAfCuXQD0ID8SasiI2wSZu_X6RKXa3EqidbM-8y-O5sOIgt4Mwq6l_HoeYloiUqwkiwICe1lldSP3R3JlJG_5-p2MidmR5_ge10kI8iptZQQ1p5Br7A6YrynHVbkYji1K6SeZuJnMThvWsm5FFmsUofWVCwhvsnUJssMXEYrMG_v0BPo8YoS0XDNkbu6tfWK8rtN7l1rj2WrDuti15qdPgIpR8d6Z1O&tcut5n",
            "transferSize": 51934,
            "resourceType": "stylesheet",
            "mimeType": "text/css",
            "domain": "www.barcelona.cat"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "image",
            "count": 13,
            "transferBytes": 2166120
          },
          {
            "resourceType": "font",
            "count": 2,
            "transferBytes": 145480
          },
          {
            "resourceType": "script",
            "count": 1,
            "transferBytes": 76425
          },
          {
            "resourceType": "stylesheet",
            "count": 1,
            "transferBytes": 51934
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.barcelona.cat",
            "count": 16,
            "transferBytes": 2363534
          },
          {
            "domain": "cdn.matomo.cloud",
            "count": 1,
            "transferBytes": 76425
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Split JavaScript by route or interaction",
            "urgency": "medium",
            "estimatedSavingsBytes": 58176,
            "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": "Defer non-critical UI modules until after first render",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "strategy": "Keep only above-the-fold resources in the initial path; hydrate or import secondary modules later.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 www.barcelona.cat",
            "urgency": "high",
            "estimatedSavingsBytes": 265397,
            "strategy": "Serve a smaller placeholder first and load this asset only when the user scrolls to or requests the component.",
            "url": "https://www.barcelona.cat/sites/default/files/styles/distribuidora_interior/public/dise-drassanes-13-2-13-al-01_529x410.jpg?itok=2-rbjPFi",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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": "10.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: 10.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 57 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 57 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,
          "displayValue": "Est savings of 82 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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 82 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,
          "displayValue": "Est savings of 1,912 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,912 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 1,462 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 1,462 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": "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": 0,
          "displayValue": "Est savings of 1,520 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 Eliminate render-blocking resources\n\n- Lighthouse audit: render-blocking-resources\n- Current value: Est savings of 1,520 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\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": "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,
          "displayValue": "1,177 elements",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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: 1,177 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"
        },
        {
          "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": 0.8,
          "displayValue": "4.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 Speed Index\n\n- Lighthouse audit: speed-index\n- Current value: 4.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\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": "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 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 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,015 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,015 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://barcelona.cat/en/discoverbcn/la-ciutadella-knowledge-hub/news",
      "status": "ok",
      "finalUrl": "https://www.barcelona.cat/en/discoverbcn/la-ciutadella-knowledge-hub/news",
      "performanceScore": 0.68,
      "bestPracticesScore": 1,
      "transferBytes": 1877294,
      "co2Grams": 0.7191564137316001,
      "greenWeb": {
        "page": {
          "hostname": "www.barcelona.cat",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-13T22:38:00.231825",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.barcelona.cat",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76426,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "stylesheet",
            "requestCount": 1,
            "transferBytes": 24654,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15565,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "www.youtube.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 11061,
            "sampleUrl": "https://www.youtube.com/iframe_api",
            "greenCheck": {
              "hostname": "www.youtube.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2026-01-10T15:09:17",
              "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.youtube.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7146,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5656,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 4112,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/css/bcn-avisos.css",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "fonts.googleapis.com",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 2483,
            "sampleUrl": "https://fonts.googleapis.com/css?family=Source+Sans+3:200,200i,300,300i,400,400i,500,500i,600,600i,700,700i,900,900i",
            "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
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=jlBr26&url=https%3A%2F%2Fwww.barcelona.cat%2Fen%2Fdiscoverbcn%2Fla-ciutadella-knowledge-hub%2Fnews",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 11,
          "greenCount": 5,
          "notGreenCount": 7,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 37.5,
        "urgency": "medium",
        "pageElementOccurrences": 4,
        "uniqueElementsAssessed": 4,
        "reusedFromCacheCount": 4,
        "components": [
          {
            "signature": "form|get|/en|input|text|query|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "text",
            "fieldName": "query",
            "formContext": "form|get|/en",
            "hasLabel": true,
            "hasValidationRule": false,
            "hasErrorMessagingHook": false,
            "toolingFriendly": false,
            "assessment": {
              "score": 60,
              "urgency": "high",
              "issues": [
                "No explicit validation rule",
                "No error messaging hook",
                "Missing autocomplete for tooling support"
              ],
              "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.",
                "Provide meaningful autocomplete values to support browsers and assistive tooling."
              ]
            },
            "reusedFromCache": true
          },
          {
            "signature": "region|get|self|input|date|datefrom|off|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "date",
            "fieldName": "datefrom",
            "formContext": "region|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": true
          },
          {
            "signature": "region|get|self|input|date|dateto|off|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "date",
            "fieldName": "dateto",
            "formContext": "region|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": true
          },
          {
            "signature": "region|get|self|select|select|actualitat-nr|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "select",
            "fieldName": "actualitat-nr",
            "formContext": "region|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": true
          }
        ],
        "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": "2 unique form control signature(s) on this page include this issue."
          },
          {
            "title": "Missing autocomplete for tooling support",
            "urgency": "medium",
            "detail": "1 unique form control signature(s) on this page include this issue."
          }
        ]
      },
      "metadata": {
        "score": 25,
        "urgency": "low",
        "checks": {
          "hasTitle": true,
          "hasLang": true,
          "hasDescription": false,
          "hasCanonical": true,
          "hasOpenGraphCore": false,
          "hasTwitterCard": true,
          "hasViewport": true,
          "hasCharset": true,
          "hasValidStructuredData": true,
          "hasInvalidStructuredData": false
        },
        "observed": {
          "title": "News | Barcelona.cat | Ajuntament de Barcelona",
          "lang": "en",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "",
          "robots": "",
          "canonical": "https://www.barcelona.cat/en/discoverbcn/la-ciutadella-knowledge-hub/news",
          "ogTitle": "News",
          "ogDescription": "",
          "ogType": "Web",
          "ogUrl": "https://www.barcelona.cat/en/discoverbcn/la-ciutadella-knowledge-hub/news",
          "twitterCard": "summary_large_image",
          "ldJsonCount": 0,
          "validLdJsonCount": 0,
          "invalidLdJsonCount": 0
        },
        "recommendations": [
          {
            "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."
          }
        ]
      },
      "layoutAdaptation": {
        "score": 30,
        "urgency": "medium",
        "checks": {
          "testedMobile": true,
          "testedTablet": true,
          "horizontalOverflowOnMobile": false,
          "horizontalOverflowOnTablet": false,
          "mobileSmallTapTargets": 45,
          "tabletSmallTapTargets": 43,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 45,
            "oversizedMedia": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 43,
            "oversizedMedia": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 45 small targets on mobile and 43 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 59,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": true,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": true,
          "externalScriptCount": 8,
          "externalScriptsWithoutIntegrity": 8,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "cache-control": "max-age=300, public",
            "content-encoding": "gzip",
            "content-language": "en",
            "content-length": "12377",
            "content-type": "text/html; charset=UTF-8",
            "date": "Mon, 13 Apr 2026 22:54:33 GMT",
            "etag": "\"1776120872-gzip\"",
            "expires": "Sun, 19 Nov 1978 05:00:00 GMT",
            "last-modified": "Mon, 13 Apr 2026 22:54:32 GMT",
            "server": "nginx",
            "vary": "Cookie,Accept-Encoding",
            "via": "1.1 ca2190123e61f1744d1210c24c87c840.cloudfront.net (CloudFront)",
            "x-amz-cf-id": "5PTyceGL-WID5wDbtMfJGQOJma5wxxqDlUf0QqY4lBvTVv0v5P8feQ==",
            "x-amz-cf-pop": "IAD12-P5",
            "x-cache": "Miss from cloudfront",
            "x-content-type-options": "nosniff",
            "x-frame-options": "SAMEORIGIN",
            "x-generator": "Drupal 10 (https://www.drupal.org)"
          },
          "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": "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": "8 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 25,
        "urgency": "low",
        "origin": "https://www.barcelona.cat",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://www.barcelona.cat/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/sitemap.xml",
            "found": true,
            "status": 200,
            "contentType": "application/xml; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/manifest.webmanifest",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/favicon.ico",
            "found": true,
            "status": 200,
            "contentType": "image/x-icon"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "low",
            "detail": "Missing beneficial file(s): /.well-known/security.txt, /manifest.webmanifest."
          }
        ]
      },
      "mediaHints": {
        "score": 50,
        "urgency": "medium",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 21,
          "imagesWithLazy": 0,
          "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 21 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 85,
        "urgency": "medium",
        "data": {
          "hasPrintStyles": true,
          "hasReducedMotion": true,
          "media": {
            "totalImages": 26,
            "lazyImages": 1,
            "totalIframes": 1,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "\"Source Sans Pro\", \"Helvetica Neue\", Helvetica, Arial, sans-serif",
            "usesSystemFont": true
          },
          "tracking": {
            "count": 0,
            "scripts": []
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 1/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": "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"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 53,
        "urgency": "medium",
        "totalEstimatedSavingsBytes": 994670.6000000001,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Use modern image compression formats",
            "urgency": "high",
            "estimatedSavingsBytes": 905228.6000000001,
            "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size."
          },
          {
            "id": "uses-optimized-images",
            "title": "Improve image encoding quality/size",
            "urgency": "medium",
            "estimatedSavingsBytes": 89442,
            "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: 884.01 KB."
          },
          {
            "title": "Improve image encoding quality/size",
            "urgency": "medium",
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 87.35 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": 2041612.6,
        "totalEstimatedBlockingMs": 1635,
        "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": 905228.6000000001,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 884 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": 846608,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 827 KiB",
            "urgency": "high",
            "sourceAuditId": "uses-responsive-images"
          },
          {
            "id": "render-blocking-resources",
            "title": "Eliminate render-blocking resources",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering.",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1635,
            "displayValue": "Est savings of 1,640 ms",
            "urgency": "high",
            "sourceAuditId": "render-blocking-resources"
          },
          {
            "id": "uses-optimized-images",
            "title": "Compress oversized image assets",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss.",
            "estimatedSavingsBytes": 89442,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 87 KiB",
            "urgency": "medium",
            "sourceAuditId": "uses-optimized-images"
          },
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 87108,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 85 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": 81378,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 79 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-css-rules"
          },
          {
            "id": "unused-javascript",
            "title": "Remove unused JavaScript",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code.",
            "estimatedSavingsBytes": 31848,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 31 KiB",
            "urgency": "low",
            "sourceAuditId": "unused-javascript"
          }
        ],
        "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: 884.01 KB."
          },
          {
            "title": "Right-size images for viewport",
            "urgency": "high",
            "detail": "Avoid sending larger images than the rendered size needs. Estimated byte savings: 826.77 KB."
          },
          {
            "title": "Eliminate render-blocking resources",
            "urgency": "high",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering. Estimated render unblocking: 1635 ms."
          },
          {
            "title": "Compress oversized image assets",
            "urgency": "medium",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 87.35 KB."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "medium",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 85.07 KB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "medium",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 79.47 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": 10,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 8,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "8 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": 1202479.7352886405
        },
        "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.15 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.15 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": 7,
        "urgency": "medium",
        "transferBytes": 1877294,
        "css": {
          "unusedBytes": 81378,
          "ratio": 0.043348564476315375,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 31848,
          "duplicatedBytes": 0,
          "ratio": 0.016964844078764436,
          "auditIds": [
            "unused-javascript",
            "duplicated-javascript"
          ]
        },
        "html": {
          "estimatedPenalty": 0.25,
          "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": "high",
            "estimatedSavingsBytes": 81378,
            "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": "medium",
            "estimatedSavingsBytes": 31848,
            "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": 1877294,
        "estimatedDeferrableBytes": 200334,
        "renderBlockingMs": 1635,
        "breakdown": {
          "offscreenImageSavings": 87108,
          "unusedJavascriptSavings": 31848,
          "unusedCssSavings": 81378
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 87108,
            "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": "medium",
            "estimatedSavingsBytes": 31848,
            "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": 81378,
            "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": "Eliminate render-blocking resources",
            "area": "render-path",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1635,
            "strategy": "Defer scripts/styles not required for first paint and preload only truly critical assets.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-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 media-edg.barcelona.cat",
            "area": "image",
            "urgency": "high",
            "estimatedSavingsBytes": 374165,
            "url": "https://media-edg.barcelona.cat/wp-content/uploads/2025/06/06133936/FOTO-Castell-Tres-Dragons-800-x-480-3-570x321.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 font from www.barcelona.cat",
            "area": "font",
            "urgency": "medium",
            "estimatedSavingsBytes": 90560,
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "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": 65,
        "urgency": "high",
        "providerCount": 8,
        "requestCount": 10,
        "transferBytes": 150730,
        "notGreenCount": 5,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76426,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15565,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "www.youtube.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 11061,
            "sampleUrl": "https://www.youtube.com/iframe_api",
            "greenCheck": {
              "hostname": "www.youtube.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2026-01-10T15:09:17",
              "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.youtube.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7146,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5656,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=jlBr26&url=https%3A%2F%2Fwww.barcelona.cat%2Fen%2Fdiscoverbcn%2Fla-ciutadella-knowledge-hub%2Fnews",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "high",
            "detail": "Track 8 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."
          },
          {
            "title": "Prioritize greener alternatives for third-party providers",
            "urgency": "high",
            "detail": "5 third-party script origin(s) are not confirmed green in the Green Web Foundation dataset."
          }
        ]
      },
      "redundancy": {
        "score": 23,
        "urgency": "low",
        "transferBytes": 1877294,
        "estimatedRedundantBytes": 113226,
        "redundancyRatio": 0.060313408555079814,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 81378,
            "displayValue": "Est savings of 79 KiB"
          },
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 31848,
            "displayValue": "Est savings of 31 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 81378,
            "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 unused javascript",
            "urgency": "medium",
            "estimatedSavingsBytes": 31848,
            "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 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": 27,
        "urgency": "medium",
        "totalTransferBytes": 1877294,
        "heavyRequestCount": 6,
        "heavyBytes": 906717,
        "heavyRatio": 0.48299147602879466,
        "heavyRequests": [
          {
            "url": "https://media-edg.barcelona.cat/wp-content/uploads/2025/06/06133936/FOTO-Castell-Tres-Dragons-800-x-480-3-570x321.png",
            "transferSize": 374165,
            "resourceType": "image",
            "mimeType": "image/png",
            "domain": "media-edg.barcelona.cat"
          },
          {
            "url": "https://media-edg.barcelona.cat/wp-content/uploads/2025/03/21143604/El-Zoo-de-Barcelona-estrena-Cuidals-2-570x321.png",
            "transferSize": 261542,
            "resourceType": "image",
            "mimeType": "image/png",
            "domain": "media-edg.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "transferSize": 90560,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "transferSize": 76426,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "cdn.matomo.cloud"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament/fonts/icoajuntament.ttf?8aaig7",
            "transferSize": 54920,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/css/css_evpTRQTawGYS1Ro7RbXq3hBxwat7AU-RJm1V8ZgzeaE.css?delta=5&language=en&theme=barcelonacat_theme&include=eJyFzksKwzAMBNAL2XjRA5mxo6YuimUsOW1u30ChH0jpSsPMWwjXUQ0LVYvINsDFYGGiMwabOnzMa1HR8DwerbiEnomlIsOirNR7mUjDroc3Ed73X6ZhJr8Wun0Du9BCIYmYWkeLeapHYGZJYK-2canzkShZ_Pv3I6Ey9i4qqsbTP9C6uJRr3FlHeKVId6NewU43NVpCgtIDxTWFiw&tcut5n",
            "transferSize": 49104,
            "resourceType": "stylesheet",
            "mimeType": "text/css",
            "domain": "www.barcelona.cat"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "image",
            "count": 2,
            "transferBytes": 635707
          },
          {
            "resourceType": "font",
            "count": 2,
            "transferBytes": 145480
          },
          {
            "resourceType": "script",
            "count": 1,
            "transferBytes": 76426
          },
          {
            "resourceType": "stylesheet",
            "count": 1,
            "transferBytes": 49104
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "media-edg.barcelona.cat",
            "count": 2,
            "transferBytes": 635707
          },
          {
            "domain": "www.barcelona.cat",
            "count": 3,
            "transferBytes": 194584
          },
          {
            "domain": "cdn.matomo.cloud",
            "count": 1,
            "transferBytes": 76426
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Lazy-load offscreen images and media galleries",
            "urgency": "medium",
            "estimatedSavingsBytes": 87108,
            "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": "Defer non-critical UI modules until after first render",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "strategy": "Keep only above-the-fold resources in the initial path; hydrate or import secondary modules later.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 media-edg.barcelona.cat",
            "urgency": "high",
            "estimatedSavingsBytes": 374165,
            "strategy": "Serve a smaller placeholder first and load this asset only when the user scrolls to or requests the component.",
            "url": "https://media-edg.barcelona.cat/wp-content/uploads/2025/06/06133936/FOTO-Castell-Tres-Dragons-800-x-480-3-570x321.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 font asset from www.barcelona.cat",
            "urgency": "medium",
            "estimatedSavingsBytes": 90560,
            "strategy": "Subset or defer this font so full font payloads are only fetched when needed.",
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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": "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,
          "displayValue": "Est savings of 79 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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 79 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,
          "displayValue": "Est savings of 884 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 884 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 87 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 87 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,
          "displayValue": "Est savings of 85 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 85 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": "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": 0,
          "displayValue": "Est savings of 1,640 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 Eliminate render-blocking resources\n\n- Lighthouse audit: render-blocking-resources\n- Current value: Est savings of 1,640 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\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": "server-response-time",
          "title": "Reduce initial server response time",
          "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": 0,
          "displayValue": "Root document took 670 ms",
          "impact": "high",
          "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 Reduce initial server response time\n\n- Lighthouse audit: server-response-time\n- Current value: Root document took 670 ms\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": "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,
          "displayValue": "1,027 elements",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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: 1,027 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"
        },
        {
          "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": 0.77,
          "displayValue": "4.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 Speed Index\n\n- Lighthouse audit: speed-index\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\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": 0.5,
          "displayValue": "Est savings of 31 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 31 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"
        }
      ]
    },
    {
      "url": "https://barcelona.cat/ca/que-pots-fer-a-bcn/banys-i-platges",
      "status": "ok",
      "finalUrl": "https://www.barcelona.cat/ca/que-pots-fer-a-bcn/banys-i-platges",
      "performanceScore": 0.5,
      "bestPracticesScore": 1,
      "transferBytes": 7170780,
      "co2Grams": 2.746992441492,
      "greenWeb": {
        "page": {
          "hostname": "www.barcelona.cat",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-13T22:38:00.231825",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.barcelona.cat",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "cdn.jsdelivr.net",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 163435,
            "sampleUrl": "https://cdn.jsdelivr.net/gh/openlayers/openlayers.github.io@master/en/v5.3.0/build/ol.js",
            "greenCheck": {
              "hostname": "cdn.jsdelivr.net",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:39",
              "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/cdn.jsdelivr.net",
              "error": null
            }
          },
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76426,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "stylesheet",
            "requestCount": 1,
            "transferBytes": 24654,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "cdnjs.cloudflare.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 20759,
            "sampleUrl": "https://cdnjs.cloudflare.com/ajax/libs/proj4js/2.2.1/proj4.js",
            "greenCheck": {
              "hostname": "cdnjs.cloudflare.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:34",
              "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/cdnjs.cloudflare.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15566,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7145,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 4109,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/css/bcn-avisos.css",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "fonts.googleapis.com",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 2483,
            "sampleUrl": "https://fonts.googleapis.com/css?family=Source+Sans+3:200,200i,300,300i,400,400i,500,500i,600,600i,700,700i,900,900i",
            "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
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=CywnIn&url=https%3A%2F%2Fwww.barcelona.cat%2Fca%2Fque-pots-fer-a-bcn%2Fbanys-i-platges",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 12,
          "greenCount": 6,
          "notGreenCount": 7,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 60,
        "urgency": "high",
        "pageElementOccurrences": 1,
        "uniqueElementsAssessed": 1,
        "reusedFromCacheCount": 1,
        "components": [
          {
            "signature": "form|get|/ca|input|text|query|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "text",
            "fieldName": "query",
            "formContext": "form|get|/ca",
            "hasLabel": true,
            "hasValidationRule": false,
            "hasErrorMessagingHook": false,
            "toolingFriendly": false,
            "assessment": {
              "score": 60,
              "urgency": "high",
              "issues": [
                "No explicit validation rule",
                "No error messaging hook",
                "Missing autocomplete for tooling support"
              ],
              "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.",
                "Provide meaningful autocomplete values to support browsers and assistive tooling."
              ]
            },
            "reusedFromCache": true
          }
        ],
        "recommendations": [
          {
            "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."
          },
          {
            "title": "Missing autocomplete for tooling support",
            "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": "Banys i platges | Barcelona.cat | Ajuntament de Barcelona",
          "lang": "ca",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "Tota la informació sobre les platges de Barcelona: temporada de bany, localització, serveis, estat del mar i previsió del temps.",
          "robots": "",
          "canonical": "https://www.barcelona.cat/ca/que-pots-fer-a-bcn/banys-i-platges",
          "ogTitle": "Gaudeix de les platges de Barcelona",
          "ogDescription": "Planifica el teu dia de platja. Consulta en temps real l'estat del mar, els serveis disponibles, la temporada de bany i el mapa de les platges de la ciutat.",
          "ogType": "Web",
          "ogUrl": "https://www.barcelona.cat/ca/que-pots-fer-a-bcn/banys-i-platges",
          "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": 44,
        "urgency": "medium",
        "checks": {
          "testedMobile": true,
          "testedTablet": true,
          "horizontalOverflowOnMobile": false,
          "horizontalOverflowOnTablet": false,
          "mobileSmallTapTargets": 43,
          "tabletSmallTapTargets": 45,
          "fixedWidthOffenders": 4,
          "oversizedMedia": 3,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 43,
            "oversizedMedia": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 4,
            "smallTapTargets": 45,
            "oversizedMedia": 3
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 43 small targets on mobile and 45 on tablet."
          },
          {
            "title": "Refactor fixed-width components",
            "urgency": "medium",
            "detail": "4 element(s) exceeded viewport width in tested layouts; use responsive component constraints."
          },
          {
            "title": "Constrain media dimensions",
            "urgency": "medium",
            "detail": "3 media element(s) exceeded viewport width. Apply max-width: 100% and responsive media patterns."
          }
        ]
      },
      "securityLight": {
        "score": 59,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": true,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": true,
          "externalScriptCount": 9,
          "externalScriptsWithoutIntegrity": 9,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "cache-control": "max-age=300, public",
            "content-encoding": "gzip",
            "content-language": "ca",
            "content-length": "15248",
            "content-type": "text/html; charset=UTF-8",
            "date": "Mon, 13 Apr 2026 22:54:47 GMT",
            "etag": "\"1776120886-gzip\"",
            "expires": "Sun, 19 Nov 1978 05:00:00 GMT",
            "last-modified": "Mon, 13 Apr 2026 22:54:46 GMT",
            "server": "nginx",
            "vary": "Cookie,Accept-Encoding",
            "via": "1.1 ca2190123e61f1744d1210c24c87c840.cloudfront.net (CloudFront)",
            "x-amz-cf-id": "Zd1Z-Xa96Tcaz3VeiMam7VmlOcJDMhrtsWyY5Tn6wot9ZYJ2_jGtDA==",
            "x-amz-cf-pop": "IAD12-P5",
            "x-cache": "Miss from cloudfront",
            "x-content-type-options": "nosniff",
            "x-frame-options": "SAMEORIGIN",
            "x-generator": "Drupal 10 (https://www.drupal.org)"
          },
          "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": "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": "9 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 25,
        "urgency": "low",
        "origin": "https://www.barcelona.cat",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://www.barcelona.cat/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/sitemap.xml",
            "found": true,
            "status": 200,
            "contentType": "application/xml; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/manifest.webmanifest",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/favicon.ico",
            "found": true,
            "status": 200,
            "contentType": "image/x-icon"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "low",
            "detail": "Missing beneficial file(s): /.well-known/security.txt, /manifest.webmanifest."
          }
        ]
      },
      "mediaHints": {
        "score": 26,
        "urgency": "low",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 40,
          "imagesWithLazy": 16,
          "imagesWithoutLazy": 24
        },
        "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": "24 of 40 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 85,
        "urgency": "medium",
        "data": {
          "hasPrintStyles": true,
          "hasReducedMotion": true,
          "media": {
            "totalImages": 53,
            "lazyImages": 17,
            "totalIframes": 1,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "\"Source Sans Pro\", \"Helvetica Neue\", Helvetica, Arial, sans-serif",
            "usesSystemFont": true
          },
          "tracking": {
            "count": 0,
            "scripts": []
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 17/53 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": "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"
          }
        ]
      },
      "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": 4867961.35,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Use modern image compression formats",
            "urgency": "high",
            "estimatedSavingsBytes": 3967637.35,
            "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": 900324,
            "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: 3.78 MB."
          },
          {
            "title": "Improve image encoding quality/size",
            "urgency": "high",
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 879.22 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": 9090467.35,
        "totalEstimatedBlockingMs": 1464,
        "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": 3967637.35,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 3,875 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": 3778442,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 3,690 KiB",
            "urgency": "high",
            "sourceAuditId": "offscreen-images"
          },
          {
            "id": "uses-optimized-images",
            "title": "Compress oversized image assets",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss.",
            "estimatedSavingsBytes": 900324,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 879 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": 360428,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 352 KiB",
            "urgency": "high",
            "sourceAuditId": "unused-javascript"
          },
          {
            "id": "render-blocking-resources",
            "title": "Eliminate render-blocking resources",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering.",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1464,
            "displayValue": "Est savings of 1,460 ms",
            "urgency": "high",
            "sourceAuditId": "render-blocking-resources"
          },
          {
            "id": "unused-css-rules",
            "title": "Remove unused CSS",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped.",
            "estimatedSavingsBytes": 83636,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 82 KiB",
            "urgency": "medium",
            "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: 3.78 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.60 MB."
          },
          {
            "title": "Compress oversized image assets",
            "urgency": "high",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 879.22 KB."
          },
          {
            "title": "Remove unused JavaScript",
            "urgency": "high",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 351.98 KB."
          },
          {
            "title": "Eliminate render-blocking resources",
            "urgency": "high",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering. Estimated render unblocking: 1464 ms."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "medium",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 81.68 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": 10,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 9,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "9 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": 4971403.570705308
        },
        "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: 4.74 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: 4.74 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": 8,
        "urgency": "high",
        "transferBytes": 7170780,
        "css": {
          "unusedBytes": 83636,
          "ratio": 0.011663445259790427,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 360428,
          "duplicatedBytes": 0,
          "ratio": 0.05026343019866737,
          "auditIds": [
            "unused-javascript",
            "duplicated-javascript"
          ]
        },
        "html": {
          "estimatedPenalty": 0.25,
          "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": "high",
            "estimatedSavingsBytes": 83636,
            "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": 360428,
            "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": 35,
        "urgency": "high",
        "transferBytes": 7170780,
        "estimatedDeferrableBytes": 4222506,
        "renderBlockingMs": 1464,
        "breakdown": {
          "offscreenImageSavings": 3778442,
          "unusedJavascriptSavings": 360428,
          "unusedCssSavings": 83636
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "high",
            "estimatedSavingsBytes": 3778442,
            "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": 360428,
            "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": "high",
            "estimatedSavingsBytes": 83636,
            "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": "Eliminate render-blocking resources",
            "area": "render-path",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1464,
            "strategy": "Defer scripts/styles not required for first paint and preload only truly critical assets.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-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 www.barcelona.cat",
            "area": "image",
            "urgency": "high",
            "estimatedSavingsBytes": 1071399,
            "url": "https://www.barcelona.cat/sites/default/files/clabsa/camara6.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": 82,
        "urgency": "high",
        "providerCount": 9,
        "requestCount": 10,
        "transferBytes": 323653,
        "notGreenCount": 5,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "cdn.jsdelivr.net",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 163435,
            "sampleUrl": "https://cdn.jsdelivr.net/gh/openlayers/openlayers.github.io@master/en/v5.3.0/build/ol.js",
            "greenCheck": {
              "hostname": "cdn.jsdelivr.net",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:39",
              "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/cdn.jsdelivr.net",
              "error": null
            }
          },
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76426,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "cdnjs.cloudflare.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 20759,
            "sampleUrl": "https://cdnjs.cloudflare.com/ajax/libs/proj4js/2.2.1/proj4.js",
            "greenCheck": {
              "hostname": "cdnjs.cloudflare.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:34",
              "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/cdnjs.cloudflare.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15566,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7145,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=CywnIn&url=https%3A%2F%2Fwww.barcelona.cat%2Fca%2Fque-pots-fer-a-bcn%2Fbanys-i-platges",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "high",
            "detail": "Track 9 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."
          },
          {
            "title": "Prioritize greener alternatives for third-party providers",
            "urgency": "high",
            "detail": "5 third-party script origin(s) are not confirmed green in the Green Web Foundation dataset."
          }
        ]
      },
      "redundancy": {
        "score": 23,
        "urgency": "medium",
        "transferBytes": 7170780,
        "estimatedRedundantBytes": 444064,
        "redundancyRatio": 0.0619268754584578,
        "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": 360428,
            "displayValue": "Est savings of 352 KiB"
          },
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 83636,
            "displayValue": "Est savings of 82 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused javascript",
            "urgency": "high",
            "estimatedSavingsBytes": 360428,
            "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": 83636,
            "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": 50,
        "urgency": "high",
        "totalTransferBytes": 7170780,
        "heavyRequestCount": 16,
        "heavyBytes": 5067012,
        "heavyRatio": 0.7066193635838779,
        "heavyRequests": [
          {
            "url": "https://www.barcelona.cat/sites/default/files/clabsa/camara6.jpg",
            "transferSize": 1071399,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/clabsa/camara1.jpg",
            "transferSize": 860656,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/clabsa/camara2.jpg",
            "transferSize": 489688,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/clabsa/camara4.jpg",
            "transferSize": 448355,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/clabsa/camara5.jpg",
            "transferSize": 442213,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/clabsa/camara3.jpg",
            "transferSize": 381499,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/estatics/geobcn/1.0/api-full-ca.js",
            "transferSize": 275895,
            "resourceType": "script",
            "mimeType": "text/javascript",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/destacat_gran/public/temporada_banys_528x228.jpg?itok=sp5O78tJ",
            "transferSize": 235667,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/destacat_gran/public/20250730_SuportBany_NI_P053_0.jpg?itok=zeKawZ_t",
            "transferSize": 175861,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://cdn.jsdelivr.net/gh/openlayers/openlayers.github.io@master/en/v5.3.0/build/ol.js",
            "transferSize": 163435,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "cdn.jsdelivr.net"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/destacat_gran/public/platja_528x228.jpg?itok=Baq9MmJT",
            "transferSize": 130176,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/destacat_gran/public/528x228-_0001_capsa_5_-_gimnastica.jpg?itok=lez6__Sy",
            "transferSize": 118325,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "transferSize": 90560,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "transferSize": 76426,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "cdn.matomo.cloud"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament/fonts/icoajuntament.ttf?8aaig7",
            "transferSize": 54920,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/css/css_qDD4BCxE8K-iT7MRORwp32v03DlJblP9-xrYwOBWlQo.css?delta=6&language=ca&theme=barcelonacat_theme&include=eJyF0EGKwzAMBdALxfWiBzKyo3FcFMlYctrcfgyFDAUPXUn8_zYSPDob7MgW4Cgq6t_DQS1LhJaQhCGBBTmwtbKi-qG7MxEa_X-mQkZ3FHx-gkpgedSz8FPahjv6KGJqDWpIK8_AD3A6o7xmXSaJQE7tpMJ5JkoSB9cHZkKeNItV-siCAmu4fwO1yRITh8Ea-GsL-DJsDLRUaJDHkZv6tfUKdPtLbp1rj1R0w3XRUw338T3FX4rzrgU&tcut5n",
            "transferSize": 51937,
            "resourceType": "stylesheet",
            "mimeType": "text/css",
            "domain": "www.barcelona.cat"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "image",
            "count": 10,
            "transferBytes": 4353839
          },
          {
            "resourceType": "script",
            "count": 3,
            "transferBytes": 515756
          },
          {
            "resourceType": "font",
            "count": 2,
            "transferBytes": 145480
          },
          {
            "resourceType": "stylesheet",
            "count": 1,
            "transferBytes": 51937
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.barcelona.cat",
            "count": 14,
            "transferBytes": 4827151
          },
          {
            "domain": "cdn.jsdelivr.net",
            "count": 1,
            "transferBytes": 163435
          },
          {
            "domain": "cdn.matomo.cloud",
            "count": 1,
            "transferBytes": 76426
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Lazy-load offscreen images and media galleries",
            "urgency": "high",
            "estimatedSavingsBytes": 3778442,
            "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": 360428,
            "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": "Defer non-critical UI modules until after first render",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "strategy": "Keep only above-the-fold resources in the initial path; hydrate or import secondary modules later.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 www.barcelona.cat",
            "urgency": "high",
            "estimatedSavingsBytes": 1071399,
            "strategy": "Serve a smaller placeholder first and load this asset only when the user scrolls to or requests the component.",
            "url": "https://www.barcelona.cat/sites/default/files/clabsa/camara6.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,
          "displayValue": "22.0 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: 22.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": "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": 0.07,
          "displayValue": "10.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 Speed Index\n\n- Lighthouse audit: speed-index\n- Current value: 10.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\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": 0,
          "displayValue": "Est savings of 352 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 352 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,
          "displayValue": "Est savings of 82 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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 82 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,
          "displayValue": "Est savings of 3,875 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 3,875 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 879 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 879 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,
          "displayValue": "Est savings of 3,690 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 3,690 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": "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": 0,
          "displayValue": "Est savings of 1,460 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 Eliminate render-blocking resources\n\n- Lighthouse audit: render-blocking-resources\n- Current value: Est savings of 1,460 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\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": "server-response-time",
          "title": "Reduce initial server response time",
          "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": 0,
          "displayValue": "Root document took 680 ms",
          "impact": "high",
          "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 Reduce initial server response time\n\n- Lighthouse audit: server-response-time\n- Current value: Root document took 680 ms\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": "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,
          "displayValue": "1,305 elements",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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: 1,305 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"
        },
        {
          "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 7,003 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 7,003 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://barcelona.cat/ca/que-pots-fer-a-bcn/banys-i-platges/platges-sense-residus",
      "status": "ok",
      "finalUrl": "https://www.barcelona.cat/ca/que-pots-fer-a-bcn/banys-i-platges/platges-sense-residus",
      "performanceScore": 0.55,
      "bestPracticesScore": 1,
      "transferBytes": 1264381,
      "co2Grams": 0.48436084361340004,
      "greenWeb": {
        "page": {
          "hostname": "www.barcelona.cat",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-13T22:38:00.231825",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.barcelona.cat",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76425,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "stylesheet",
            "requestCount": 1,
            "transferBytes": 24654,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15566,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7144,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 4110,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/css/bcn-avisos.css",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2860,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "fonts.googleapis.com",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 2484,
            "sampleUrl": "https://fonts.googleapis.com/css?family=Source+Sans+3:200,200i,300,300i,400,400i,500,500i,600,600i,700,700i,900,900i",
            "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
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=UfQIyH&url=https%3A%2F%2Fwww.barcelona.cat%2Fca%2Fque-pots-fer-a-bcn%2Fbanys-i-platges%2Fplatges-sense-residus",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 10,
          "greenCount": 4,
          "notGreenCount": 7,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 60,
        "urgency": "high",
        "pageElementOccurrences": 1,
        "uniqueElementsAssessed": 1,
        "reusedFromCacheCount": 1,
        "components": [
          {
            "signature": "form|get|/ca|input|text|query|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "text",
            "fieldName": "query",
            "formContext": "form|get|/ca",
            "hasLabel": true,
            "hasValidationRule": false,
            "hasErrorMessagingHook": false,
            "toolingFriendly": false,
            "assessment": {
              "score": 60,
              "urgency": "high",
              "issues": [
                "No explicit validation rule",
                "No error messaging hook",
                "Missing autocomplete for tooling support"
              ],
              "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.",
                "Provide meaningful autocomplete values to support browsers and assistive tooling."
              ]
            },
            "reusedFromCache": true
          }
        ],
        "recommendations": [
          {
            "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."
          },
          {
            "title": "Missing autocomplete for tooling support",
            "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": "Platges sense residus | Barcelona.cat | Ajuntament de Barcelona",
          "lang": "ca",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "“El millor residu és el que no es genera” Molts dels residus que es generen a les platges no són biodegradables.",
          "robots": "",
          "canonical": "https://www.barcelona.cat/ca/que-pots-fer-a-bcn/banys-i-platges/platges-sense-residus",
          "ogTitle": "Platges sense residus",
          "ogDescription": "“El millor residu és el que no es genera” Molts dels residus que es generen a les platges no són biodegradables.",
          "ogType": "Web",
          "ogUrl": "https://www.barcelona.cat/ca/que-pots-fer-a-bcn/banys-i-platges/platges-sense-residus",
          "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": 34,
        "urgency": "medium",
        "checks": {
          "testedMobile": true,
          "testedTablet": true,
          "horizontalOverflowOnMobile": false,
          "horizontalOverflowOnTablet": false,
          "mobileSmallTapTargets": 39,
          "tabletSmallTapTargets": 34,
          "fixedWidthOffenders": 2,
          "oversizedMedia": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 1,
            "smallTapTargets": 39,
            "oversizedMedia": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 1,
            "smallTapTargets": 34,
            "oversizedMedia": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 39 small targets on mobile and 34 on tablet."
          },
          {
            "title": "Refactor fixed-width components",
            "urgency": "medium",
            "detail": "2 element(s) exceeded viewport width in tested layouts; use responsive component constraints."
          }
        ]
      },
      "securityLight": {
        "score": 59,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": true,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": true,
          "externalScriptCount": 7,
          "externalScriptsWithoutIntegrity": 7,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "cache-control": "max-age=300, public",
            "content-encoding": "gzip",
            "content-language": "ca",
            "content-length": "11814",
            "content-type": "text/html; charset=UTF-8",
            "date": "Mon, 13 Apr 2026 22:55:08 GMT",
            "etag": "\"1776120907-gzip\"",
            "expires": "Sun, 19 Nov 1978 05:00:00 GMT",
            "last-modified": "Mon, 13 Apr 2026 22:55:07 GMT",
            "server": "nginx",
            "vary": "Cookie,Accept-Encoding",
            "via": "1.1 ca2190123e61f1744d1210c24c87c840.cloudfront.net (CloudFront)",
            "x-amz-cf-id": "yfVDkqGcqOOrorLLb4WewoC6OaP1XZoR3PqUYt3D9HnwVsD_BtLMMQ==",
            "x-amz-cf-pop": "IAD12-P5",
            "x-cache": "Miss from cloudfront",
            "x-content-type-options": "nosniff",
            "x-frame-options": "SAMEORIGIN",
            "x-generator": "Drupal 10 (https://www.drupal.org)"
          },
          "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": "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": "7 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 25,
        "urgency": "low",
        "origin": "https://www.barcelona.cat",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://www.barcelona.cat/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/sitemap.xml",
            "found": true,
            "status": 200,
            "contentType": "application/xml; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/manifest.webmanifest",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/favicon.ico",
            "found": true,
            "status": 200,
            "contentType": "image/x-icon"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "low",
            "detail": "Missing beneficial file(s): /.well-known/security.txt, /manifest.webmanifest."
          }
        ]
      },
      "mediaHints": {
        "score": 34,
        "urgency": "medium",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 15,
          "imagesWithLazy": 4,
          "imagesWithoutLazy": 11
        },
        "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": "11 of 15 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 85,
        "urgency": "medium",
        "data": {
          "hasPrintStyles": true,
          "hasReducedMotion": true,
          "media": {
            "totalImages": 20,
            "lazyImages": 5,
            "totalIframes": 1,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "\"Source Sans Pro\", \"Helvetica Neue\", Helvetica, Arial, sans-serif",
            "usesSystemFont": true
          },
          "tracking": {
            "count": 0,
            "scripts": []
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 5/20 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": "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"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 64,
        "urgency": "high",
        "totalEstimatedSavingsBytes": 810197.3500000001,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Use modern image compression formats",
            "urgency": "high",
            "estimatedSavingsBytes": 440468.35000000003,
            "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": 369729,
            "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: 430.14 KB."
          },
          {
            "title": "Improve image encoding quality/size",
            "urgency": "high",
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 361.06 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": 1086099.35,
        "totalEstimatedBlockingMs": 1634,
        "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": 440468.35000000003,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 430 KiB",
            "urgency": "high",
            "sourceAuditId": "modern-image-formats"
          },
          {
            "id": "uses-optimized-images",
            "title": "Compress oversized image assets",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss.",
            "estimatedSavingsBytes": 369729,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 361 KiB",
            "urgency": "high",
            "sourceAuditId": "uses-optimized-images"
          },
          {
            "id": "render-blocking-resources",
            "title": "Eliminate render-blocking resources",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering.",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1634,
            "displayValue": "Est savings of 1,630 ms",
            "urgency": "high",
            "sourceAuditId": "render-blocking-resources"
          },
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 87111,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 85 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": 83470,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 82 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-css-rules"
          },
          {
            "id": "unused-javascript",
            "title": "Remove unused JavaScript",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code.",
            "estimatedSavingsBytes": 55520,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 54 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-javascript"
          },
          {
            "id": "uses-responsive-images",
            "title": "Right-size images for viewport",
            "detail": "Avoid sending larger images than the rendered size needs.",
            "estimatedSavingsBytes": 49801,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 49 KiB",
            "urgency": "medium",
            "sourceAuditId": "uses-responsive-images"
          }
        ],
        "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: 430.14 KB."
          },
          {
            "title": "Compress oversized image assets",
            "urgency": "high",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 361.06 KB."
          },
          {
            "title": "Eliminate render-blocking resources",
            "urgency": "high",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering. Estimated render unblocking: 1634 ms."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "medium",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 85.07 KB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "medium",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 81.51 KB."
          },
          {
            "title": "Remove unused JavaScript",
            "urgency": "medium",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 54.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": 10,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 7,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "7 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": 167996.84598463692
        },
        "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: 164.06 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: 164.06 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": "medium",
        "transferBytes": 1264381,
        "css": {
          "unusedBytes": 83470,
          "ratio": 0.06601649344620016,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 55520,
          "duplicatedBytes": 0,
          "ratio": 0.043910814857230536,
          "auditIds": [
            "unused-javascript",
            "duplicated-javascript"
          ]
        },
        "html": {
          "estimatedPenalty": 0.25,
          "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": "high",
            "estimatedSavingsBytes": 83470,
            "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": "medium",
            "estimatedSavingsBytes": 55520,
            "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": 20,
        "urgency": "high",
        "transferBytes": 1264381,
        "estimatedDeferrableBytes": 226101,
        "renderBlockingMs": 1634,
        "breakdown": {
          "offscreenImageSavings": 87111,
          "unusedJavascriptSavings": 55520,
          "unusedCssSavings": 83470
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 87111,
            "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": "medium",
            "estimatedSavingsBytes": 55520,
            "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": "high",
            "estimatedSavingsBytes": 83470,
            "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": "Eliminate render-blocking resources",
            "area": "render-path",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1634,
            "strategy": "Defer scripts/styles not required for first paint and preload only truly critical assets.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-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 www.barcelona.cat",
            "area": "image",
            "urgency": "high",
            "estimatedSavingsBytes": 275844,
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_medium/public/ucm_centredelaplatja-710x379.jpg?itok=e4UxN1PE",
            "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 www.barcelona.cat",
            "area": "font",
            "urgency": "medium",
            "estimatedSavingsBytes": 90560,
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "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": 64,
        "urgency": "high",
        "providerCount": 7,
        "requestCount": 8,
        "transferBytes": 139456,
        "notGreenCount": 5,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76425,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15566,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7144,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2860,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=UfQIyH&url=https%3A%2F%2Fwww.barcelona.cat%2Fca%2Fque-pots-fer-a-bcn%2Fbanys-i-platges%2Fplatges-sense-residus",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "high",
            "detail": "Track 7 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."
          },
          {
            "title": "Prioritize greener alternatives for third-party providers",
            "urgency": "high",
            "detail": "5 third-party script origin(s) are not confirmed green in the Green Web Foundation dataset."
          }
        ]
      },
      "redundancy": {
        "score": 26,
        "urgency": "medium",
        "transferBytes": 1264381,
        "estimatedRedundantBytes": 138990,
        "redundancyRatio": 0.10992730830343068,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 83470,
            "displayValue": "Est savings of 82 KiB"
          },
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 55520,
            "displayValue": "Est savings of 54 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 83470,
            "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 unused javascript",
            "urgency": "medium",
            "estimatedSavingsBytes": 55520,
            "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 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": 31,
        "urgency": "medium",
        "totalTransferBytes": 1264381,
        "heavyRequestCount": 6,
        "heavyBytes": 715486,
        "heavyRatio": 0.5658784812489274,
        "heavyRequests": [
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_medium/public/ucm_centredelaplatja-710x379.jpg?itok=e4UxN1PE",
            "transferSize": 275844,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_medium/public/monstre_de_deixalles_-710x379_1.jpg?itok=2Yzz6uHK",
            "transferSize": 165794,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "transferSize": 90560,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "transferSize": 76425,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "cdn.matomo.cloud"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament/fonts/icoajuntament.ttf?8aaig7",
            "transferSize": 54921,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/css/css_qDD4BCxE8K-iT7MRORwp32v03DlJblP9-xrYwOBWlQo.css?delta=6&language=ca&theme=barcelonacat_theme&include=eJyFz8FuxCAMBNAfCsuhH4QG4ia0DkbYpJu_L9JKW1VitSdbM-8y-OrFcFCxgDOrqH8ch5qXiJaIpSDBgpzUWl5J_dDdmQiP_pWp2MidmX7-A9vpIB9FTK2hhrSWGfhESVeU-6zbWCLYqV2cyzYTOYnDc9dMKOf07ZASqebINDXSRxYURcPHO1CbLDGVMFiDf36B7katgJeKhm0s3tWvrVfw7S-59VJ75Kw7rYteanT4CKVfKxCiTQ&tcut5n",
            "transferSize": 51942,
            "resourceType": "stylesheet",
            "mimeType": "text/css",
            "domain": "www.barcelona.cat"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "image",
            "count": 2,
            "transferBytes": 441638
          },
          {
            "resourceType": "font",
            "count": 2,
            "transferBytes": 145481
          },
          {
            "resourceType": "script",
            "count": 1,
            "transferBytes": 76425
          },
          {
            "resourceType": "stylesheet",
            "count": 1,
            "transferBytes": 51942
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.barcelona.cat",
            "count": 5,
            "transferBytes": 639061
          },
          {
            "domain": "cdn.matomo.cloud",
            "count": 1,
            "transferBytes": 76425
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Lazy-load offscreen images and media galleries",
            "urgency": "medium",
            "estimatedSavingsBytes": 87111,
            "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": "medium",
            "estimatedSavingsBytes": 55520,
            "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": "Defer non-critical UI modules until after first render",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "strategy": "Keep only above-the-fold resources in the initial path; hydrate or import secondary modules later.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 www.barcelona.cat",
            "urgency": "high",
            "estimatedSavingsBytes": 275844,
            "strategy": "Serve a smaller placeholder first and load this asset only when the user scrolls to or requests the component.",
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_medium/public/ucm_centredelaplatja-710x379.jpg?itok=e4UxN1PE",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 www.barcelona.cat",
            "urgency": "medium",
            "estimatedSavingsBytes": 90560,
            "strategy": "Subset or defer this font so full font payloads are only fetched when needed.",
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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.01,
          "displayValue": "9.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: 9.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 54 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 54 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,
          "displayValue": "Est savings of 82 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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 82 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,
          "displayValue": "Est savings of 430 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 430 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 361 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 361 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,
          "displayValue": "Est savings of 85 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 85 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": "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": 0,
          "displayValue": "Est savings of 1,630 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 Eliminate render-blocking resources\n\n- Lighthouse audit: render-blocking-resources\n- Current value: Est savings of 1,630 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\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": "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,
          "displayValue": "1,037 elements",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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: 1,037 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"
        },
        {
          "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": 0.83,
          "displayValue": "3.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 Speed Index\n\n- Lighthouse audit: speed-index\n- Current value: 3.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\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"
        }
      ]
    },
    {
      "url": "https://barcelona.cat/es/que-hacer-en-bcn/parque-montjuic/noticias",
      "status": "ok",
      "finalUrl": "https://www.barcelona.cat/es/que-hacer-en-bcn/parque-montjuic/noticias",
      "performanceScore": 0.62,
      "bestPracticesScore": 1,
      "transferBytes": 2180828,
      "co2Grams": 0.8354346433992001,
      "greenWeb": {
        "page": {
          "hostname": "www.barcelona.cat",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-13T22:38:00.231825",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.barcelona.cat",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76425,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31745,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "stylesheet",
            "requestCount": 1,
            "transferBytes": 24654,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15566,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "www.youtube.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 11089,
            "sampleUrl": "https://www.youtube.com/iframe_api",
            "greenCheck": {
              "hostname": "www.youtube.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2026-01-10T15:09:17",
              "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.youtube.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7144,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 4110,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/css/bcn-avisos.css",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2860,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "fonts.googleapis.com",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 2481,
            "sampleUrl": "https://fonts.googleapis.com/css?family=Source+Sans+3:200,200i,300,300i,400,400i,500,500i,600,600i,700,700i,900,900i",
            "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
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=GzOoRH&url=https%3A%2F%2Fwww.barcelona.cat%2Fes%2Fque-hacer-en-bcn%2Fparque-montjuic%2Fnoticias",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 11,
          "greenCount": 5,
          "notGreenCount": 7,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 37.5,
        "urgency": "medium",
        "pageElementOccurrences": 4,
        "uniqueElementsAssessed": 4,
        "reusedFromCacheCount": 4,
        "components": [
          {
            "signature": "form|get|/es/|input|text|query|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "text",
            "fieldName": "query",
            "formContext": "form|get|/es/",
            "hasLabel": true,
            "hasValidationRule": false,
            "hasErrorMessagingHook": false,
            "toolingFriendly": false,
            "assessment": {
              "score": 60,
              "urgency": "high",
              "issues": [
                "No explicit validation rule",
                "No error messaging hook",
                "Missing autocomplete for tooling support"
              ],
              "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.",
                "Provide meaningful autocomplete values to support browsers and assistive tooling."
              ]
            },
            "reusedFromCache": true
          },
          {
            "signature": "region|get|self|input|date|datefrom|off|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "date",
            "fieldName": "datefrom",
            "formContext": "region|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": true
          },
          {
            "signature": "region|get|self|input|date|dateto|off|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "date",
            "fieldName": "dateto",
            "formContext": "region|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": true
          },
          {
            "signature": "region|get|self|select|select|actualitat-nr|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "select",
            "fieldName": "actualitat-nr",
            "formContext": "region|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": true
          }
        ],
        "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": "2 unique form control signature(s) on this page include this issue."
          },
          {
            "title": "Missing autocomplete for tooling support",
            "urgency": "medium",
            "detail": "1 unique form control signature(s) on this page include this issue."
          }
        ]
      },
      "metadata": {
        "score": 25,
        "urgency": "low",
        "checks": {
          "hasTitle": true,
          "hasLang": true,
          "hasDescription": false,
          "hasCanonical": true,
          "hasOpenGraphCore": false,
          "hasTwitterCard": true,
          "hasViewport": true,
          "hasCharset": true,
          "hasValidStructuredData": true,
          "hasInvalidStructuredData": false
        },
        "observed": {
          "title": "Noticias | Barcelona.cat | Ajuntament de Barcelona",
          "lang": "es",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "",
          "robots": "",
          "canonical": "https://www.barcelona.cat/es/que-hacer-en-bcn/parque-montjuic/noticias",
          "ogTitle": "Noticias",
          "ogDescription": "",
          "ogType": "Web",
          "ogUrl": "https://www.barcelona.cat/es/que-hacer-en-bcn/parque-montjuic/noticias",
          "twitterCard": "summary_large_image",
          "ldJsonCount": 0,
          "validLdJsonCount": 0,
          "invalidLdJsonCount": 0
        },
        "recommendations": [
          {
            "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."
          }
        ]
      },
      "layoutAdaptation": {
        "score": 30,
        "urgency": "medium",
        "checks": {
          "testedMobile": true,
          "testedTablet": true,
          "horizontalOverflowOnMobile": false,
          "horizontalOverflowOnTablet": false,
          "mobileSmallTapTargets": 47,
          "tabletSmallTapTargets": 45,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 47,
            "oversizedMedia": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 45,
            "oversizedMedia": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 47 small targets on mobile and 45 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 59,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": true,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": true,
          "externalScriptCount": 8,
          "externalScriptsWithoutIntegrity": 8,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "cache-control": "max-age=300, public",
            "content-encoding": "gzip",
            "content-language": "es",
            "content-length": "12479",
            "content-type": "text/html; charset=UTF-8",
            "date": "Mon, 13 Apr 2026 22:55:21 GMT",
            "etag": "\"1776120920-gzip\"",
            "expires": "Sun, 19 Nov 1978 05:00:00 GMT",
            "last-modified": "Mon, 13 Apr 2026 22:55:20 GMT",
            "server": "nginx",
            "vary": "Cookie,Accept-Encoding",
            "via": "1.1 ca2190123e61f1744d1210c24c87c840.cloudfront.net (CloudFront)",
            "x-amz-cf-id": "RW5RzfhBc10Gtkh8WSiz-NRfGctWegwCclALabbv8yTh0xFJ3j4eaw==",
            "x-amz-cf-pop": "IAD12-P5",
            "x-cache": "Miss from cloudfront",
            "x-content-type-options": "nosniff",
            "x-frame-options": "SAMEORIGIN",
            "x-generator": "Drupal 10 (https://www.drupal.org)"
          },
          "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": "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": "8 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 25,
        "urgency": "low",
        "origin": "https://www.barcelona.cat",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://www.barcelona.cat/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/sitemap.xml",
            "found": true,
            "status": 200,
            "contentType": "application/xml; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/manifest.webmanifest",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/favicon.ico",
            "found": true,
            "status": 200,
            "contentType": "image/x-icon"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "low",
            "detail": "Missing beneficial file(s): /.well-known/security.txt, /manifest.webmanifest."
          }
        ]
      },
      "mediaHints": {
        "score": 50,
        "urgency": "medium",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 21,
          "imagesWithLazy": 0,
          "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 21 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 85,
        "urgency": "medium",
        "data": {
          "hasPrintStyles": true,
          "hasReducedMotion": true,
          "media": {
            "totalImages": 26,
            "lazyImages": 1,
            "totalIframes": 1,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "\"Source Sans Pro\", \"Helvetica Neue\", Helvetica, Arial, sans-serif",
            "usesSystemFont": true
          },
          "tracking": {
            "count": 0,
            "scripts": []
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 1/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": "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"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 55,
        "urgency": "medium",
        "totalEstimatedSavingsBytes": 1189754.6500000001,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Use modern image compression formats",
            "urgency": "high",
            "estimatedSavingsBytes": 1098138.6500000001,
            "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size."
          },
          {
            "id": "uses-optimized-images",
            "title": "Improve image encoding quality/size",
            "urgency": "medium",
            "estimatedSavingsBytes": 91616,
            "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: 1.05 MB."
          },
          {
            "title": "Improve image encoding quality/size",
            "urgency": "medium",
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 89.47 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": 2497805.6500000004,
        "totalEstimatedBlockingMs": 1583,
        "opportunities": [
          {
            "id": "uses-responsive-images",
            "title": "Right-size images for viewport",
            "detail": "Avoid sending larger images than the rendered size needs.",
            "estimatedSavingsBytes": 1111147,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 1,085 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": 1098138.6500000001,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 1,072 KiB",
            "urgency": "high",
            "sourceAuditId": "modern-image-formats"
          },
          {
            "id": "render-blocking-resources",
            "title": "Eliminate render-blocking resources",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering.",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1583,
            "displayValue": "Est savings of 1,580 ms",
            "urgency": "high",
            "sourceAuditId": "render-blocking-resources"
          },
          {
            "id": "uses-optimized-images",
            "title": "Compress oversized image assets",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss.",
            "estimatedSavingsBytes": 91616,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 89 KiB",
            "urgency": "medium",
            "sourceAuditId": "uses-optimized-images"
          },
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 83661,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 82 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": 81395,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 79 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-css-rules"
          },
          {
            "id": "unused-javascript",
            "title": "Remove unused JavaScript",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code.",
            "estimatedSavingsBytes": 31848,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 31 KiB",
            "urgency": "low",
            "sourceAuditId": "unused-javascript"
          }
        ],
        "recommendations": [
          {
            "title": "Right-size images for viewport",
            "urgency": "high",
            "detail": "Avoid sending larger images than the rendered size needs. Estimated byte savings: 1.06 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.05 MB."
          },
          {
            "title": "Eliminate render-blocking resources",
            "urgency": "high",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering. Estimated render unblocking: 1583 ms."
          },
          {
            "title": "Compress oversized image assets",
            "urgency": "medium",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 89.47 KB."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "medium",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 81.70 KB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "medium",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 79.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": 10,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 8,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "8 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": 1475293.9814013038
        },
        "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.41 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.41 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": "medium",
        "transferBytes": 2180828,
        "css": {
          "unusedBytes": 81395,
          "ratio": 0.03732298007912591,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 31848,
          "duplicatedBytes": 0,
          "ratio": 0.014603627612998367,
          "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": "high",
            "estimatedSavingsBytes": 81395,
            "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": "medium",
            "estimatedSavingsBytes": 31848,
            "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": 2180828,
        "estimatedDeferrableBytes": 196904,
        "renderBlockingMs": 1583,
        "breakdown": {
          "offscreenImageSavings": 83661,
          "unusedJavascriptSavings": 31848,
          "unusedCssSavings": 81395
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 83661,
            "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": "medium",
            "estimatedSavingsBytes": 31848,
            "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": 81395,
            "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": "Eliminate render-blocking resources",
            "area": "render-path",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1583,
            "strategy": "Defer scripts/styles not required for first paint and preload only truly critical assets.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-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 media-edg.barcelona.cat",
            "area": "image",
            "urgency": "high",
            "estimatedSavingsBytes": 440155,
            "url": "https://media-edg.barcelona.cat/wp-content/uploads/2026/03/26182455/Obres-Endesa-Miramar-Tarongers-570x321.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 font from www.barcelona.cat",
            "area": "font",
            "urgency": "medium",
            "estimatedSavingsBytes": 90560,
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "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": 65,
        "urgency": "high",
        "providerCount": 8,
        "requestCount": 10,
        "transferBytes": 150544,
        "notGreenCount": 5,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76425,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31745,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15566,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "www.youtube.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 11089,
            "sampleUrl": "https://www.youtube.com/iframe_api",
            "greenCheck": {
              "hostname": "www.youtube.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2026-01-10T15:09:17",
              "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.youtube.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7144,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2860,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=GzOoRH&url=https%3A%2F%2Fwww.barcelona.cat%2Fes%2Fque-hacer-en-bcn%2Fparque-montjuic%2Fnoticias",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "high",
            "detail": "Track 8 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."
          },
          {
            "title": "Prioritize greener alternatives for third-party providers",
            "urgency": "high",
            "detail": "5 third-party script origin(s) are not confirmed green in the Green Web Foundation dataset."
          }
        ]
      },
      "redundancy": {
        "score": 13,
        "urgency": "low",
        "transferBytes": 2180828,
        "estimatedRedundantBytes": 113243,
        "redundancyRatio": 0.051926607692124274,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 81395,
            "displayValue": "Est savings of 79 KiB"
          },
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 31848,
            "displayValue": "Est savings of 31 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 81395,
            "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 unused javascript",
            "urgency": "medium",
            "estimatedSavingsBytes": 31848,
            "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 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": 31,
        "urgency": "high",
        "totalTransferBytes": 2180828,
        "heavyRequestCount": 7,
        "heavyBytes": 1249180,
        "heavyRatio": 0.5728007894249341,
        "heavyRequests": [
          {
            "url": "https://media-edg.barcelona.cat/wp-content/uploads/2026/03/26182455/Obres-Endesa-Miramar-Tarongers-570x321.png",
            "transferSize": 440155,
            "resourceType": "image",
            "mimeType": "image/png",
            "domain": "media-edg.barcelona.cat"
          },
          {
            "url": "https://media-edg.barcelona.cat/wp-content/uploads/2026/03/09145120/MNAC-570x321.png",
            "transferSize": 277714,
            "resourceType": "image",
            "mimeType": "image/png",
            "domain": "media-edg.barcelona.cat"
          },
          {
            "url": "https://media-edg.barcelona.cat/wp-content/uploads/2026/02/03122103/santa-eulalia-2026-570x321.png",
            "transferSize": 260301,
            "resourceType": "image",
            "mimeType": "image/png",
            "domain": "media-edg.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "transferSize": 90560,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "transferSize": 76425,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "cdn.matomo.cloud"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament/fonts/icoajuntament.ttf?8aaig7",
            "transferSize": 54920,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/css/css_evpTRQTawGYS1Ro7RbXq3hBxwat7AU-RJm1V8ZgzeaE.css?delta=5&language=es&theme=barcelonacat_theme&include=eJyFzksKwzAMBNAL2XjRA5mxo6YuimUsOW1u30ChH0jpSsPMWwjXUQ0LVYvINsDFYGGiMwabOnzMa1HR8DwerbiEnomlIsOirNR7mUjDroc3Ed73X6ZhJr8Wun0Du9BCIYmYWkeLeapHYGZJYK-2canzkShZ_Pv3I6Ey9i4qqsbTP9C6uJRr3FlHeKVId6NewU43NVpCgtIDxTWFiw&tcut5n",
            "transferSize": 49105,
            "resourceType": "stylesheet",
            "mimeType": "text/css",
            "domain": "www.barcelona.cat"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "image",
            "count": 3,
            "transferBytes": 978170
          },
          {
            "resourceType": "font",
            "count": 2,
            "transferBytes": 145480
          },
          {
            "resourceType": "script",
            "count": 1,
            "transferBytes": 76425
          },
          {
            "resourceType": "stylesheet",
            "count": 1,
            "transferBytes": 49105
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "media-edg.barcelona.cat",
            "count": 3,
            "transferBytes": 978170
          },
          {
            "domain": "www.barcelona.cat",
            "count": 3,
            "transferBytes": 194585
          },
          {
            "domain": "cdn.matomo.cloud",
            "count": 1,
            "transferBytes": 76425
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Lazy-load offscreen images and media galleries",
            "urgency": "medium",
            "estimatedSavingsBytes": 83661,
            "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": "Defer non-critical UI modules until after first render",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "strategy": "Keep only above-the-fold resources in the initial path; hydrate or import secondary modules later.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 media-edg.barcelona.cat",
            "urgency": "high",
            "estimatedSavingsBytes": 440155,
            "strategy": "Serve a smaller placeholder first and load this asset only when the user scrolls to or requests the component.",
            "url": "https://media-edg.barcelona.cat/wp-content/uploads/2026/03/26182455/Obres-Endesa-Miramar-Tarongers-570x321.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": "10.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: 10.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 31 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 31 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,
          "displayValue": "Est savings of 79 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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 79 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,
          "displayValue": "Est savings of 1,072 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,072 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 89 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 89 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,
          "displayValue": "Est savings of 82 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 82 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": "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": 0,
          "displayValue": "Est savings of 1,580 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 Eliminate render-blocking resources\n\n- Lighthouse audit: render-blocking-resources\n- Current value: Est savings of 1,580 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\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": "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": 0.87,
          "displayValue": "3.6 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 Speed Index\n\n- Lighthouse audit: speed-index\n- Current value: 3.6 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\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": "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": "1,054 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: 1,054 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://barcelona.cat/ca/que-pots-fer-a-bcn/banys-i-platges/zona-de-banys-del-forum",
      "status": "ok",
      "finalUrl": "https://www.barcelona.cat/ca/que-pots-fer-a-bcn/banys-i-platges/zona-de-banys-del-forum",
      "performanceScore": 0.63,
      "bestPracticesScore": 0.96,
      "transferBytes": 1300494,
      "co2Grams": 0.4981950622115999,
      "greenWeb": {
        "page": {
          "hostname": "www.barcelona.cat",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-13T22:38:00.231825",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.barcelona.cat",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76426,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "stylesheet",
            "requestCount": 1,
            "transferBytes": 24657,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15565,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7145,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 4111,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/css/bcn-avisos.css",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "fonts.googleapis.com",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 2483,
            "sampleUrl": "https://fonts.googleapis.com/css?family=Source+Sans+3:200,200i,300,300i,400,400i,500,500i,600,600i,700,700i,900,900i",
            "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
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=uSmFBD&url=https%3A%2F%2Fwww.barcelona.cat%2Fca%2Fque-pots-fer-a-bcn%2Fbanys-i-platges%2Fzona-de-banys-del-forum",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 10,
          "greenCount": 4,
          "notGreenCount": 7,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 60,
        "urgency": "high",
        "pageElementOccurrences": 1,
        "uniqueElementsAssessed": 1,
        "reusedFromCacheCount": 1,
        "components": [
          {
            "signature": "form|get|/ca|input|text|query|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "text",
            "fieldName": "query",
            "formContext": "form|get|/ca",
            "hasLabel": true,
            "hasValidationRule": false,
            "hasErrorMessagingHook": false,
            "toolingFriendly": false,
            "assessment": {
              "score": 60,
              "urgency": "high",
              "issues": [
                "No explicit validation rule",
                "No error messaging hook",
                "Missing autocomplete for tooling support"
              ],
              "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.",
                "Provide meaningful autocomplete values to support browsers and assistive tooling."
              ]
            },
            "reusedFromCache": true
          }
        ],
        "recommendations": [
          {
            "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."
          },
          {
            "title": "Missing autocomplete for tooling support",
            "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": "Zona banys del Fòrum | Web Barcelona | Ajuntament Barcelona",
          "lang": "ca",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "A la zona de banys del Fòrum pots accedir a l’aigua a través d’escales i prendre el sol a les zones habilitades. Disposa de servei de bany assistit.",
          "robots": "",
          "canonical": "https://www.barcelona.cat/ca/que-pots-fer-a-bcn/banys-i-platges/zona-de-banys-del-forum",
          "ogTitle": "Zona de banys del Fòrum",
          "ogDescription": "La zona de banys del Fòrum ofereix la possibilitat de banyar-se o prendre el sol, però no disposa de sorra, i l'accés a l'aigua es fa directament des de superfícies pavimentades mitjançant escales. També té una àrea per a persones amb discapacitat que disposa de servei de suport al bany.",
          "ogType": "Web",
          "ogUrl": "https://www.barcelona.cat/ca/que-pots-fer-a-bcn/banys-i-platges/zona-de-banys-del-forum",
          "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": 32,
        "urgency": "medium",
        "checks": {
          "testedMobile": true,
          "testedTablet": true,
          "horizontalOverflowOnMobile": false,
          "horizontalOverflowOnTablet": false,
          "mobileSmallTapTargets": 41,
          "tabletSmallTapTargets": 39,
          "fixedWidthOffenders": 1,
          "oversizedMedia": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 1,
            "smallTapTargets": 41,
            "oversizedMedia": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 39,
            "oversizedMedia": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 41 small targets on mobile and 39 on tablet."
          },
          {
            "title": "Refactor fixed-width components",
            "urgency": "medium",
            "detail": "1 element(s) exceeded viewport width in tested layouts; use responsive component constraints."
          }
        ]
      },
      "securityLight": {
        "score": 59,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": true,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": true,
          "externalScriptCount": 7,
          "externalScriptsWithoutIntegrity": 7,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "cache-control": "max-age=300, public",
            "content-encoding": "gzip",
            "content-language": "ca",
            "content-length": "12610",
            "content-type": "text/html; charset=UTF-8",
            "date": "Mon, 13 Apr 2026 22:55:35 GMT",
            "etag": "\"1776120935-gzip\"",
            "expires": "Sun, 19 Nov 1978 05:00:00 GMT",
            "last-modified": "Mon, 13 Apr 2026 22:55:35 GMT",
            "server": "nginx",
            "vary": "Cookie,Accept-Encoding",
            "via": "1.1 ca2190123e61f1744d1210c24c87c840.cloudfront.net (CloudFront)",
            "x-amz-cf-id": "feagJQOxpaA05O1h91WlUjZWrSdpjeLPn2pYdFA03FOwi944LAkroA==",
            "x-amz-cf-pop": "IAD12-P5",
            "x-cache": "Miss from cloudfront",
            "x-content-type-options": "nosniff",
            "x-frame-options": "SAMEORIGIN",
            "x-generator": "Drupal 10 (https://www.drupal.org)"
          },
          "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": "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": "7 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 25,
        "urgency": "low",
        "origin": "https://www.barcelona.cat",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://www.barcelona.cat/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/sitemap.xml",
            "found": true,
            "status": 200,
            "contentType": "application/xml; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/manifest.webmanifest",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/favicon.ico",
            "found": true,
            "status": 200,
            "contentType": "image/x-icon"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "low",
            "detail": "Missing beneficial file(s): /.well-known/security.txt, /manifest.webmanifest."
          }
        ]
      },
      "mediaHints": {
        "score": 42,
        "urgency": "medium",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 15,
          "imagesWithLazy": 2,
          "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 15 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 85,
        "urgency": "medium",
        "data": {
          "hasPrintStyles": true,
          "hasReducedMotion": true,
          "media": {
            "totalImages": 20,
            "lazyImages": 3,
            "totalIframes": 1,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "\"Source Sans Pro\", \"Helvetica Neue\", Helvetica, Arial, sans-serif",
            "usesSystemFont": true
          },
          "tracking": {
            "count": 0,
            "scripts": []
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 3/20 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": "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"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 63,
        "urgency": "high",
        "totalEstimatedSavingsBytes": 824744.6499999999,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Use modern image compression formats",
            "urgency": "high",
            "estimatedSavingsBytes": 444053.64999999997,
            "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": 380691,
            "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: 433.65 KB."
          },
          {
            "title": "Improve image encoding quality/size",
            "urgency": "high",
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 371.77 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": 1049119.65,
        "totalEstimatedBlockingMs": 2080,
        "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": 444053.64999999997,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 434 KiB",
            "urgency": "high",
            "sourceAuditId": "modern-image-formats"
          },
          {
            "id": "uses-optimized-images",
            "title": "Compress oversized image assets",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss.",
            "estimatedSavingsBytes": 380691,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 372 KiB",
            "urgency": "high",
            "sourceAuditId": "uses-optimized-images"
          },
          {
            "id": "render-blocking-resources",
            "title": "Eliminate render-blocking resources",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering.",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 2080,
            "displayValue": "Est savings of 2,080 ms",
            "urgency": "high",
            "sourceAuditId": "render-blocking-resources"
          },
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 87109,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 85 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": 82979,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 81 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-css-rules"
          },
          {
            "id": "unused-javascript",
            "title": "Remove unused JavaScript",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code.",
            "estimatedSavingsBytes": 54287,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 53 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-javascript"
          }
        ],
        "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: 433.65 KB."
          },
          {
            "title": "Compress oversized image assets",
            "urgency": "high",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 371.77 KB."
          },
          {
            "title": "Eliminate render-blocking resources",
            "urgency": "high",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering. Estimated render unblocking: 2080 ms."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "medium",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 85.07 KB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "medium",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 81.03 KB."
          },
          {
            "title": "Remove unused JavaScript",
            "urgency": "medium",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 53.01 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": 10,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 7,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "7 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": 167994.42695530728
        },
        "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: 164.06 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: 164.06 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": "medium",
        "transferBytes": 1300494,
        "css": {
          "unusedBytes": 82979,
          "ratio": 0.06380575381355084,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 54287,
          "duplicatedBytes": 0,
          "ratio": 0.041743368289280845,
          "auditIds": [
            "unused-javascript",
            "duplicated-javascript"
          ]
        },
        "html": {
          "estimatedPenalty": 0.25,
          "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": "high",
            "estimatedSavingsBytes": 82979,
            "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": "medium",
            "estimatedSavingsBytes": 54287,
            "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": 20,
        "urgency": "high",
        "transferBytes": 1300494,
        "estimatedDeferrableBytes": 224375,
        "renderBlockingMs": 2080,
        "breakdown": {
          "offscreenImageSavings": 87109,
          "unusedJavascriptSavings": 54287,
          "unusedCssSavings": 82979
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 87109,
            "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": "medium",
            "estimatedSavingsBytes": 54287,
            "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": "high",
            "estimatedSavingsBytes": 82979,
            "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": "Eliminate render-blocking resources",
            "area": "render-path",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 2080,
            "strategy": "Defer scripts/styles not required for first paint and preload only truly critical assets.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-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 www.barcelona.cat",
            "area": "image",
            "urgency": "high",
            "estimatedSavingsBytes": 213296,
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_platges/public/platges/552233113111414.jpg?itok=vcwjn_Ho",
            "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 www.barcelona.cat",
            "area": "font",
            "urgency": "medium",
            "estimatedSavingsBytes": 90561,
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "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": 64,
        "urgency": "high",
        "providerCount": 7,
        "requestCount": 8,
        "transferBytes": 139458,
        "notGreenCount": 5,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76426,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15565,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7145,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=uSmFBD&url=https%3A%2F%2Fwww.barcelona.cat%2Fca%2Fque-pots-fer-a-bcn%2Fbanys-i-platges%2Fzona-de-banys-del-forum",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "high",
            "detail": "Track 7 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."
          },
          {
            "title": "Prioritize greener alternatives for third-party providers",
            "urgency": "high",
            "detail": "5 third-party script origin(s) are not confirmed green in the Green Web Foundation dataset."
          }
        ]
      },
      "redundancy": {
        "score": 26,
        "urgency": "medium",
        "transferBytes": 1300494,
        "estimatedRedundantBytes": 137266,
        "redundancyRatio": 0.1055491221028317,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 82979,
            "displayValue": "Est savings of 81 KiB"
          },
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 54287,
            "displayValue": "Est savings of 53 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 82979,
            "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 unused javascript",
            "urgency": "medium",
            "estimatedSavingsBytes": 54287,
            "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 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": 30,
        "urgency": "medium",
        "totalTransferBytes": 1300494,
        "heavyRequestCount": 6,
        "heavyBytes": 694277,
        "heavyRatio": 0.5338563653503976,
        "heavyRequests": [
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_platges/public/platges/552233113111414.jpg?itok=vcwjn_Ho",
            "transferSize": 213296,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_platges/public/platges/873092113110314.jpg?itok=sMhQ4KjT",
            "transferSize": 207130,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "transferSize": 90561,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "transferSize": 76426,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "cdn.matomo.cloud"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament/fonts/icoajuntament.ttf?8aaig7",
            "transferSize": 54919,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/css/css_qDD4BCxE8K-iT7MRORwp32v03DlJblP9-xrYwOBWlQo.css?delta=6&language=ca&theme=barcelonacat_theme&include=eJyFz9EKwjAMBdAfWumDH1RuY5zVLhlNNre_dyAMhIpPudx7XoLHIo6JxRPWYmrxcwLmMmQ04qoCgiddubVyZYuHXoKr1mP_ZWaMHNbCr2_gd544ZlU3b5gTXaUHbhDas269bayaUYP5XouMPVFIA86_esJqoWcAEZuVXLlrdDm6ZBBLl39gbjpkknSwhnimxJtzE9TBdnOeYobxG293khk&tcut5n",
            "transferSize": 51945,
            "resourceType": "stylesheet",
            "mimeType": "text/css",
            "domain": "www.barcelona.cat"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "image",
            "count": 2,
            "transferBytes": 420426
          },
          {
            "resourceType": "font",
            "count": 2,
            "transferBytes": 145480
          },
          {
            "resourceType": "script",
            "count": 1,
            "transferBytes": 76426
          },
          {
            "resourceType": "stylesheet",
            "count": 1,
            "transferBytes": 51945
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.barcelona.cat",
            "count": 5,
            "transferBytes": 617851
          },
          {
            "domain": "cdn.matomo.cloud",
            "count": 1,
            "transferBytes": 76426
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Lazy-load offscreen images and media galleries",
            "urgency": "medium",
            "estimatedSavingsBytes": 87109,
            "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": "medium",
            "estimatedSavingsBytes": 54287,
            "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": "Defer non-critical UI modules until after first render",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "strategy": "Keep only above-the-fold resources in the initial path; hydrate or import secondary modules later.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 www.barcelona.cat",
            "urgency": "medium",
            "estimatedSavingsBytes": 213296,
            "strategy": "Serve a smaller placeholder first and load this asset only when the user scrolls to or requests the component.",
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_platges/public/platges/552233113111414.jpg?itok=vcwjn_Ho",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 www.barcelona.cat",
            "urgency": "medium",
            "estimatedSavingsBytes": 90561,
            "strategy": "Subset or defer this font so full font payloads are only fetched when needed.",
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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.01,
          "displayValue": "8.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: 8.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 53 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 53 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,
          "displayValue": "Est savings of 81 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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 81 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,
          "displayValue": "Est savings of 434 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 434 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": "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 85 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 85 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": "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": 0,
          "displayValue": "Est savings of 2,080 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 Eliminate render-blocking resources\n\n- Lighthouse audit: render-blocking-resources\n- Current value: Est savings of 2,080 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\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": "server-response-time",
          "title": "Reduce initial server response time",
          "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": 0,
          "displayValue": "Root document took 660 ms",
          "impact": "high",
          "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 Reduce initial server response time\n\n- Lighthouse audit: server-response-time\n- Current value: Root document took 660 ms\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": "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,
          "displayValue": "1,076 elements",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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: 1,076 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"
        },
        {
          "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": 0.77,
          "displayValue": "4.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 Speed Index\n\n- Lighthouse audit: speed-index\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\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"
        }
      ]
    },
    {
      "url": "https://barcelona.cat/es/que-hacer-en-bcn/ponte-en-forma/clubs-asociaciones-y-penas",
      "status": "ok",
      "finalUrl": "https://www.barcelona.cat/es/que-hacer-en-bcn/ponte-en-forma/clubs-asociaciones-y-penas",
      "performanceScore": 0.64,
      "bestPracticesScore": 1,
      "transferBytes": 875393,
      "co2Grams": 0.3353467759902,
      "greenWeb": {
        "page": {
          "hostname": "www.barcelona.cat",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-13T22:38:00.231825",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.barcelona.cat",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76425,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31745,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "stylesheet",
            "requestCount": 1,
            "transferBytes": 24654,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "cdnjs.cloudflare.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15873,
            "sampleUrl": "https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js",
            "greenCheck": {
              "hostname": "cdnjs.cloudflare.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:34",
              "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/cdnjs.cloudflare.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15565,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7144,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 4110,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/css/bcn-avisos.css",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "fonts.googleapis.com",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 2484,
            "sampleUrl": "https://fonts.googleapis.com/css?family=Source+Sans+3:200,200i,300,300i,400,400i,500,500i,600,600i,700,700i,900,900i",
            "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
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=GNCgMk&url=https%3A%2F%2Fwww.barcelona.cat%2Fes%2Fque-hacer-en-bcn%2Fponte-en-forma%2Fclubs-asociaciones-y-penas",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 11,
          "greenCount": 5,
          "notGreenCount": 7,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 75,
        "urgency": "high",
        "pageElementOccurrences": 6,
        "uniqueElementsAssessed": 2,
        "reusedFromCacheCount": 2,
        "components": [
          {
            "signature": "form|get|/es/|input|text|query|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "text",
            "fieldName": "query",
            "formContext": "form|get|/es/",
            "hasLabel": true,
            "hasValidationRule": false,
            "hasErrorMessagingHook": false,
            "toolingFriendly": false,
            "assessment": {
              "score": 60,
              "urgency": "high",
              "issues": [
                "No explicit validation rule",
                "No error messaging hook",
                "Missing autocomplete for tooling support"
              ],
              "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.",
                "Provide meaningful autocomplete values to support browsers and assistive tooling."
              ]
            },
            "reusedFromCache": true
          },
          {
            "signature": "no-form|select|select|anonymous|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "select",
            "fieldName": null,
            "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": "No explicit validation rule",
            "urgency": "medium",
            "detail": "2 unique form control signature(s) on this page include this issue."
          },
          {
            "title": "No error messaging hook",
            "urgency": "medium",
            "detail": "2 unique form control signature(s) on this page include this issue."
          },
          {
            "title": "Missing autocomplete for tooling support",
            "urgency": "medium",
            "detail": "1 unique form control signature(s) on this page include this issue."
          },
          {
            "title": "Missing associated label",
            "urgency": "high",
            "detail": "1 unique form control signature(s) on this page include this issue."
          }
        ]
      },
      "metadata": {
        "score": 25,
        "urgency": "low",
        "checks": {
          "hasTitle": true,
          "hasLang": true,
          "hasDescription": false,
          "hasCanonical": true,
          "hasOpenGraphCore": false,
          "hasTwitterCard": true,
          "hasViewport": true,
          "hasCharset": true,
          "hasValidStructuredData": true,
          "hasInvalidStructuredData": false
        },
        "observed": {
          "title": "Clubs, asociaciones y peñas | Barcelona.cat | Ajuntament de Barcelona",
          "lang": "es",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "",
          "robots": "",
          "canonical": "https://www.barcelona.cat/es/que-hacer-en-bcn/ponte-en-forma/clubs-asociaciones-y-penas",
          "ogTitle": "Clubs, asociaciones y peñas",
          "ogDescription": "",
          "ogType": "Web",
          "ogUrl": "https://www.barcelona.cat/es/que-hacer-en-bcn/ponte-en-forma/clubs-asociaciones-y-penas",
          "twitterCard": "summary_large_image",
          "ldJsonCount": 0,
          "validLdJsonCount": 0,
          "invalidLdJsonCount": 0
        },
        "recommendations": [
          {
            "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."
          }
        ]
      },
      "layoutAdaptation": {
        "score": 30,
        "urgency": "medium",
        "checks": {
          "testedMobile": true,
          "testedTablet": true,
          "horizontalOverflowOnMobile": false,
          "horizontalOverflowOnTablet": false,
          "mobileSmallTapTargets": 63,
          "tabletSmallTapTargets": 62,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 63,
            "oversizedMedia": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 62,
            "oversizedMedia": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 63 small targets on mobile and 62 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 59,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": true,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": true,
          "externalScriptCount": 8,
          "externalScriptsWithoutIntegrity": 8,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "cache-control": "max-age=300, public",
            "content-encoding": "gzip",
            "content-language": "es",
            "content-length": "11902",
            "content-type": "text/html; charset=UTF-8",
            "date": "Mon, 13 Apr 2026 22:55:50 GMT",
            "etag": "\"1776120949-gzip\"",
            "expires": "Sun, 19 Nov 1978 05:00:00 GMT",
            "last-modified": "Mon, 13 Apr 2026 22:55:49 GMT",
            "server": "nginx",
            "vary": "Cookie,Accept-Encoding",
            "via": "1.1 ca2190123e61f1744d1210c24c87c840.cloudfront.net (CloudFront)",
            "x-amz-cf-id": "mC2Td-F1t2s_N-zZ3II95jR0jLfc5cjAg9Nex-jy9DJB7YLDBu3B9w==",
            "x-amz-cf-pop": "IAD12-P5",
            "x-cache": "Miss from cloudfront",
            "x-content-type-options": "nosniff",
            "x-frame-options": "SAMEORIGIN",
            "x-generator": "Drupal 10 (https://www.drupal.org)"
          },
          "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": "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": "8 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 25,
        "urgency": "low",
        "origin": "https://www.barcelona.cat",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://www.barcelona.cat/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/sitemap.xml",
            "found": true,
            "status": 200,
            "contentType": "application/xml; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/manifest.webmanifest",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/favicon.ico",
            "found": true,
            "status": 200,
            "contentType": "image/x-icon"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "low",
            "detail": "Missing beneficial file(s): /.well-known/security.txt, /manifest.webmanifest."
          }
        ]
      },
      "mediaHints": {
        "score": 50,
        "urgency": "medium",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 21,
          "imagesWithLazy": 0,
          "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 21 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 85,
        "urgency": "medium",
        "data": {
          "hasPrintStyles": true,
          "hasReducedMotion": true,
          "media": {
            "totalImages": 26,
            "lazyImages": 1,
            "totalIframes": 1,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "\"Source Sans Pro\", \"Helvetica Neue\", Helvetica, Arial, sans-serif",
            "usesSystemFont": true
          },
          "tracking": {
            "count": 0,
            "scripts": []
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 1/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": "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"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 18,
        "urgency": "low",
        "totalEstimatedSavingsBytes": 155867.55,
        "checks": {
          "hasEffectiveTextCompression": false
        },
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Use modern image compression formats",
            "urgency": "medium",
            "estimatedSavingsBytes": 72410.55,
            "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size."
          },
          {
            "id": "uses-optimized-images",
            "title": "Improve image encoding quality/size",
            "urgency": "medium",
            "estimatedSavingsBytes": 58032,
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings."
          },
          {
            "id": "uses-text-compression",
            "title": "Enable Brotli/gzip for text assets",
            "urgency": "low",
            "estimatedSavingsBytes": 25425,
            "detail": "Compress HTML, CSS, JS, JSON, SVG, and XML responses with Brotli or gzip."
          }
        ],
        "recommendations": [
          {
            "title": "Use modern image compression formats",
            "urgency": "medium",
            "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size. Estimated savings: 70.71 KB."
          },
          {
            "title": "Improve image encoding quality/size",
            "urgency": "medium",
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 56.67 KB."
          },
          {
            "title": "Enable Brotli/gzip for text assets",
            "urgency": "low",
            "detail": "Compress HTML, CSS, JS, JSON, SVG, and XML responses with Brotli or gzip. Estimated savings: 24.83 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": 367392.55,
        "totalEstimatedBlockingMs": 1596,
        "opportunities": [
          {
            "id": "render-blocking-resources",
            "title": "Eliminate render-blocking resources",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering.",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1596,
            "displayValue": "Est savings of 1,600 ms",
            "urgency": "high",
            "sourceAuditId": "render-blocking-resources"
          },
          {
            "id": "unused-css-rules",
            "title": "Remove unused CSS",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped.",
            "estimatedSavingsBytes": 91934,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 90 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-css-rules"
          },
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 87110,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 85 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": 72410.55,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 71 KiB",
            "urgency": "medium",
            "sourceAuditId": "modern-image-formats"
          },
          {
            "id": "uses-optimized-images",
            "title": "Compress oversized image assets",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss.",
            "estimatedSavingsBytes": 58032,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 57 KiB",
            "urgency": "medium",
            "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": 32481,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 32 KiB",
            "urgency": "low",
            "sourceAuditId": "unused-javascript"
          },
          {
            "id": "uses-text-compression",
            "title": "Enable text compression",
            "detail": "Serve text assets with Brotli or gzip to remove avoidable transfer bloat.",
            "estimatedSavingsBytes": 25425,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 25 KiB",
            "urgency": "low",
            "sourceAuditId": "uses-text-compression"
          }
        ],
        "recommendations": [
          {
            "title": "Eliminate render-blocking resources",
            "urgency": "high",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering. Estimated render unblocking: 1596 ms."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "medium",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 89.78 KB."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "medium",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 85.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: 70.71 KB."
          },
          {
            "title": "Compress oversized image assets",
            "urgency": "medium",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 56.67 KB."
          },
          {
            "title": "Remove unused JavaScript",
            "urgency": "low",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 31.72 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": 10,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 8,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "8 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": 167991.01473463688
        },
        "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: 164.05 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: 164.05 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": "medium",
        "transferBytes": 875393,
        "css": {
          "unusedBytes": 91934,
          "ratio": 0.10502025947203142,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 32481,
          "duplicatedBytes": 0,
          "ratio": 0.03710447764604012,
          "auditIds": [
            "unused-javascript",
            "duplicated-javascript"
          ]
        },
        "html": {
          "estimatedPenalty": 0.25,
          "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": "high",
            "estimatedSavingsBytes": 91934,
            "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": "medium",
            "estimatedSavingsBytes": 32481,
            "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": 875393,
        "estimatedDeferrableBytes": 211525,
        "renderBlockingMs": 1596,
        "breakdown": {
          "offscreenImageSavings": 87110,
          "unusedJavascriptSavings": 32481,
          "unusedCssSavings": 91934
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 87110,
            "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": "medium",
            "estimatedSavingsBytes": 32481,
            "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": "high",
            "estimatedSavingsBytes": 91934,
            "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": "Eliminate render-blocking resources",
            "area": "render-path",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1596,
            "strategy": "Defer scripts/styles not required for first paint and preload only truly critical assets.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-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 www.barcelona.cat",
            "area": "font",
            "urgency": "medium",
            "estimatedSavingsBytes": 90559,
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "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 www.barcelona.cat",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 84137,
            "url": "https://www.barcelona.cat/themes/barcelonacat_theme/images/menu/viula.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 cdn.matomo.cloud",
            "area": "script",
            "urgency": "medium",
            "estimatedSavingsBytes": 76425,
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.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": 65,
        "urgency": "high",
        "providerCount": 8,
        "requestCount": 9,
        "transferBytes": 155328,
        "notGreenCount": 5,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76425,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31745,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "cdnjs.cloudflare.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15873,
            "sampleUrl": "https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js",
            "greenCheck": {
              "hostname": "cdnjs.cloudflare.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:34",
              "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/cdnjs.cloudflare.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15565,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7144,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=GNCgMk&url=https%3A%2F%2Fwww.barcelona.cat%2Fes%2Fque-hacer-en-bcn%2Fponte-en-forma%2Fclubs-asociaciones-y-penas",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "high",
            "detail": "Track 8 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."
          },
          {
            "title": "Prioritize greener alternatives for third-party providers",
            "urgency": "high",
            "detail": "5 third-party script origin(s) are not confirmed green in the Green Web Foundation dataset."
          }
        ]
      },
      "redundancy": {
        "score": 43,
        "urgency": "medium",
        "transferBytes": 875393,
        "estimatedRedundantBytes": 124415,
        "redundancyRatio": 0.14212473711807155,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 91934,
            "displayValue": "Est savings of 90 KiB"
          },
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 32481,
            "displayValue": "Est savings of 32 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 91934,
            "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 unused javascript",
            "urgency": "medium",
            "estimatedSavingsBytes": 32481,
            "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": "Enable and verify text compression",
            "urgency": "medium",
            "estimatedSavingsBytes": 25425,
            "auditId": "uses-text-compression",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "2",
              "title": "Remove unnecessary or redundant information",
              "url": "https://www.w3.org/TR/web-sustainability-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": 19,
        "urgency": "medium",
        "totalTransferBytes": 875393,
        "heavyRequestCount": 4,
        "heavyBytes": 271008,
        "heavyRatio": 0.30958438095803825,
        "heavyRequests": [
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "transferSize": 90559,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "transferSize": 76425,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "cdn.matomo.cloud"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament/fonts/icoajuntament.ttf?8aaig7",
            "transferSize": 54921,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/css/css_evpTRQTawGYS1Ro7RbXq3hBxwat7AU-RJm1V8ZgzeaE.css?delta=5&language=es&theme=barcelonacat_theme&include=eJyFztEOwiAMheEXgnDhA5EDq4gySmiZ7u1dYuJinPGqTf_voriOqpipqseShcW9hkXLBntMI8NNUGo53qh_JzpjFBUT0CMVrohQzwv1nicSt8lhlbls_ZdpSGSXTPdPoBeayQVmFe1oPk71CKTCAcWKriXXdCRyZLv_fSSEx3bzgir-9A-0zibE6jfW4d6bp4dSryhGVlGaXYDQE_H9jbg&tcut5n",
            "transferSize": 49103,
            "resourceType": "stylesheet",
            "mimeType": "text/css",
            "domain": "www.barcelona.cat"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "font",
            "count": 2,
            "transferBytes": 145480
          },
          {
            "resourceType": "script",
            "count": 1,
            "transferBytes": 76425
          },
          {
            "resourceType": "stylesheet",
            "count": 1,
            "transferBytes": 49103
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.barcelona.cat",
            "count": 3,
            "transferBytes": 194583
          },
          {
            "domain": "cdn.matomo.cloud",
            "count": 1,
            "transferBytes": 76425
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Lazy-load offscreen images and media galleries",
            "urgency": "medium",
            "estimatedSavingsBytes": 87110,
            "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": "Defer non-critical UI modules until after first render",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "strategy": "Keep only above-the-fold resources in the initial path; hydrate or import secondary modules later.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 www.barcelona.cat",
            "urgency": "medium",
            "estimatedSavingsBytes": 90559,
            "strategy": "Subset or defer this font so full font payloads are only fetched when needed.",
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 cdn.matomo.cloud",
            "urgency": "medium",
            "estimatedSavingsBytes": 76425,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.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": "9.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: 9.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 32 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 32 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,
          "displayValue": "Est savings of 90 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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 90 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,
          "displayValue": "Est savings of 71 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 71 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 57 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 57 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,
          "displayValue": "Est savings of 85 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 85 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": "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": 0,
          "displayValue": "Est savings of 1,600 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 Eliminate render-blocking resources\n\n- Lighthouse audit: render-blocking-resources\n- Current value: Est savings of 1,600 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\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": 0,
          "displayValue": "Est savings of 25 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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- Current value: Est savings of 25 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\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": "server-response-time",
          "title": "Reduce initial server response time",
          "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": 0,
          "displayValue": "Root document took 1,130 ms",
          "impact": "high",
          "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 Reduce initial server response time\n\n- Lighthouse audit: server-response-time\n- Current value: Root document took 1,130 ms\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": "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,
          "displayValue": "1,080 elements",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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: 1,080 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"
        },
        {
          "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": 0.75,
          "displayValue": "4.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 Speed Index\n\n- Lighthouse audit: speed-index\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\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"
        }
      ]
    },
    {
      "url": "https://barcelona.cat/en/what-to-do-in-bcn/bathing-and-beaches/sant-sebastia-beach",
      "status": "ok",
      "finalUrl": "https://www.barcelona.cat/en/what-to-do-in-bcn/bathing-and-beaches/sant-sebastia-beach",
      "performanceScore": 0.62,
      "bestPracticesScore": 0.96,
      "transferBytes": 1566652,
      "co2Grams": 0.6001552414728001,
      "greenWeb": {
        "page": {
          "hostname": "www.barcelona.cat",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-13T22:38:00.231825",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.barcelona.cat",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76425,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "stylesheet",
            "requestCount": 1,
            "transferBytes": 24654,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15565,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7146,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5656,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 4111,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/css/bcn-avisos.css",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "fonts.googleapis.com",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 2483,
            "sampleUrl": "https://fonts.googleapis.com/css?family=Source+Sans+3:200,200i,300,300i,400,400i,500,500i,600,600i,700,700i,900,900i",
            "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
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=XucZWd&url=https%3A%2F%2Fwww.barcelona.cat%2Fen%2Fwhat-to-do-in-bcn%2Fbathing-and-beaches%2Fsant-sebastia-beach",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 10,
          "greenCount": 4,
          "notGreenCount": 7,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 60,
        "urgency": "high",
        "pageElementOccurrences": 1,
        "uniqueElementsAssessed": 1,
        "reusedFromCacheCount": 1,
        "components": [
          {
            "signature": "form|get|/en|input|text|query|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "text",
            "fieldName": "query",
            "formContext": "form|get|/en",
            "hasLabel": true,
            "hasValidationRule": false,
            "hasErrorMessagingHook": false,
            "toolingFriendly": false,
            "assessment": {
              "score": 60,
              "urgency": "high",
              "issues": [
                "No explicit validation rule",
                "No error messaging hook",
                "Missing autocomplete for tooling support"
              ],
              "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.",
                "Provide meaningful autocomplete values to support browsers and assistive tooling."
              ]
            },
            "reusedFromCache": true
          }
        ],
        "recommendations": [
          {
            "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."
          },
          {
            "title": "Missing autocomplete for tooling support",
            "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": "Sant Sebastià beach | Barcelona | Barcelona City Council",
          "lang": "en",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "Sant Sebastià beach is one of the largest in Barcelona and is home to some major sport clubs. It has showers and adapted toilets.",
          "robots": "",
          "canonical": "https://www.barcelona.cat/en/what-to-do-in-bcn/bathing-and-beaches/sant-sebastia-beach",
          "ogTitle": "Sant Sebastià beach",
          "ogDescription": "This is one of Barcelona’s oldest and largest beaches, well-known for its sports clubs, which organise maritime activities. It also has adapted parking spaces, accessible routes and adapted toilets and showers.",
          "ogType": "Web",
          "ogUrl": "https://www.barcelona.cat/en/what-to-do-in-bcn/bathing-and-beaches/sant-sebastia-beach",
          "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": 34,
        "urgency": "medium",
        "checks": {
          "testedMobile": true,
          "testedTablet": true,
          "horizontalOverflowOnMobile": false,
          "horizontalOverflowOnTablet": false,
          "mobileSmallTapTargets": 41,
          "tabletSmallTapTargets": 39,
          "fixedWidthOffenders": 2,
          "oversizedMedia": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 1,
            "smallTapTargets": 41,
            "oversizedMedia": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 1,
            "smallTapTargets": 39,
            "oversizedMedia": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 41 small targets on mobile and 39 on tablet."
          },
          {
            "title": "Refactor fixed-width components",
            "urgency": "medium",
            "detail": "2 element(s) exceeded viewport width in tested layouts; use responsive component constraints."
          }
        ]
      },
      "securityLight": {
        "score": 59,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": true,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": true,
          "externalScriptCount": 7,
          "externalScriptsWithoutIntegrity": 7,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "cache-control": "max-age=300, public",
            "content-encoding": "gzip",
            "content-language": "en",
            "content-length": "11870",
            "content-type": "text/html; charset=UTF-8",
            "date": "Mon, 13 Apr 2026 22:56:04 GMT",
            "etag": "\"1776120964-gzip\"",
            "expires": "Sun, 19 Nov 1978 05:00:00 GMT",
            "last-modified": "Mon, 13 Apr 2026 22:56:04 GMT",
            "server": "nginx",
            "vary": "Cookie,Accept-Encoding",
            "via": "1.1 ca2190123e61f1744d1210c24c87c840.cloudfront.net (CloudFront)",
            "x-amz-cf-id": "HM_dlQ6f43tmtSYXlp3AgcK64h3ujhSNEciDmbEpJVkzl9C7zIaUqA==",
            "x-amz-cf-pop": "IAD12-P5",
            "x-cache": "Miss from cloudfront",
            "x-content-type-options": "nosniff",
            "x-frame-options": "SAMEORIGIN",
            "x-generator": "Drupal 10 (https://www.drupal.org)"
          },
          "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": "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": "7 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 25,
        "urgency": "low",
        "origin": "https://www.barcelona.cat",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://www.barcelona.cat/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/sitemap.xml",
            "found": true,
            "status": 200,
            "contentType": "application/xml; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/manifest.webmanifest",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/favicon.ico",
            "found": true,
            "status": 200,
            "contentType": "image/x-icon"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "low",
            "detail": "Missing beneficial file(s): /.well-known/security.txt, /manifest.webmanifest."
          }
        ]
      },
      "mediaHints": {
        "score": 39,
        "urgency": "medium",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 16,
          "imagesWithLazy": 3,
          "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 16 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 85,
        "urgency": "medium",
        "data": {
          "hasPrintStyles": true,
          "hasReducedMotion": true,
          "media": {
            "totalImages": 21,
            "lazyImages": 4,
            "totalIframes": 1,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "\"Source Sans Pro\", \"Helvetica Neue\", Helvetica, Arial, sans-serif",
            "usesSystemFont": true
          },
          "tracking": {
            "count": 0,
            "scripts": []
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 4/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": "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"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 83,
        "urgency": "high",
        "totalEstimatedSavingsBytes": 1298455.5,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Use modern image compression formats",
            "urgency": "high",
            "estimatedSavingsBytes": 697140.5,
            "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": 601315,
            "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: 680.80 KB."
          },
          {
            "title": "Improve image encoding quality/size",
            "urgency": "high",
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 587.22 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": 1519241.5,
        "totalEstimatedBlockingMs": 1638,
        "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": 697140.5,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 681 KiB",
            "urgency": "high",
            "sourceAuditId": "modern-image-formats"
          },
          {
            "id": "uses-optimized-images",
            "title": "Compress oversized image assets",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss.",
            "estimatedSavingsBytes": 601315,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 587 KiB",
            "urgency": "high",
            "sourceAuditId": "uses-optimized-images"
          },
          {
            "id": "render-blocking-resources",
            "title": "Eliminate render-blocking resources",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering.",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1638,
            "displayValue": "Est savings of 1,640 ms",
            "urgency": "high",
            "sourceAuditId": "render-blocking-resources"
          },
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 83661,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 82 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": 83293,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 81 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-css-rules"
          },
          {
            "id": "unused-javascript",
            "title": "Remove unused JavaScript",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code.",
            "estimatedSavingsBytes": 53832,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 53 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-javascript"
          }
        ],
        "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: 680.80 KB."
          },
          {
            "title": "Compress oversized image assets",
            "urgency": "high",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 587.22 KB."
          },
          {
            "title": "Eliminate render-blocking resources",
            "urgency": "high",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering. Estimated render unblocking: 1638 ms."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "medium",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 81.70 KB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "medium",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 81.34 KB."
          },
          {
            "title": "Remove unused JavaScript",
            "urgency": "medium",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 52.57 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": 10,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 7,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "7 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": 168002.7272346369
        },
        "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: 164.07 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: 164.07 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": "medium",
        "transferBytes": 1566652,
        "css": {
          "unusedBytes": 83293,
          "ratio": 0.053166242407375726,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 53832,
          "duplicatedBytes": 0,
          "ratio": 0.03436117274289376,
          "auditIds": [
            "unused-javascript",
            "duplicated-javascript"
          ]
        },
        "html": {
          "estimatedPenalty": 0.25,
          "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": "high",
            "estimatedSavingsBytes": 83293,
            "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": "medium",
            "estimatedSavingsBytes": 53832,
            "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": 1566652,
        "estimatedDeferrableBytes": 220786,
        "renderBlockingMs": 1638,
        "breakdown": {
          "offscreenImageSavings": 83661,
          "unusedJavascriptSavings": 53832,
          "unusedCssSavings": 83293
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 83661,
            "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": "medium",
            "estimatedSavingsBytes": 53832,
            "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": "high",
            "estimatedSavingsBytes": 83293,
            "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": "Eliminate render-blocking resources",
            "area": "render-path",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1638,
            "strategy": "Defer scripts/styles not required for first paint and preload only truly critical assets.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-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 www.barcelona.cat",
            "area": "image",
            "urgency": "high",
            "estimatedSavingsBytes": 268338,
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_platges/public/platges/337225309013014.jpg?itok=fbU0YtCM",
            "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 www.barcelona.cat",
            "area": "font",
            "urgency": "medium",
            "estimatedSavingsBytes": 90560,
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "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": 64,
        "urgency": "high",
        "providerCount": 7,
        "requestCount": 8,
        "transferBytes": 139668,
        "notGreenCount": 5,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76425,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15565,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7146,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5656,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=XucZWd&url=https%3A%2F%2Fwww.barcelona.cat%2Fen%2Fwhat-to-do-in-bcn%2Fbathing-and-beaches%2Fsant-sebastia-beach",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "high",
            "detail": "Track 7 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."
          },
          {
            "title": "Prioritize greener alternatives for third-party providers",
            "urgency": "high",
            "detail": "5 third-party script origin(s) are not confirmed green in the Green Web Foundation dataset."
          }
        ]
      },
      "redundancy": {
        "score": 25,
        "urgency": "medium",
        "transferBytes": 1566652,
        "estimatedRedundantBytes": 137125,
        "redundancyRatio": 0.08752741515026949,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 83293,
            "displayValue": "Est savings of 81 KiB"
          },
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 53832,
            "displayValue": "Est savings of 53 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 83293,
            "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 unused javascript",
            "urgency": "medium",
            "estimatedSavingsBytes": 53832,
            "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 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": 34,
        "urgency": "medium",
        "totalTransferBytes": 1566652,
        "heavyRequestCount": 7,
        "heavyBytes": 979477,
        "heavyRatio": 0.6252039380794203,
        "heavyRequests": [
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_platges/public/platges/337225309013014.jpg?itok=fbU0YtCM",
            "transferSize": 268338,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_platges/public/platges/530194313012615.jpg?itok=vo0349Qw",
            "transferSize": 229887,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_platges/public/platges/541371812111414.jpg?itok=mSqSjqTd",
            "transferSize": 207410,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "transferSize": 90560,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "transferSize": 76425,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "cdn.matomo.cloud"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament/fonts/icoajuntament.ttf?8aaig7",
            "transferSize": 54921,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/css/css_qDD4BCxE8K-iT7MRORwp32v03DlJblP9-xrYwOBWlQo.css?delta=6&language=en&theme=barcelonacat_theme&include=eJyFz9EKwjAMBdAfWumDH1RuY5zVLhlNNre_dyAMhIpPudx7XoLHIo6JxRPWYmrxcwLmMmQ04qoCgiddubVyZYuHXoKr1mP_ZWaMHNbCr2_gd544ZlU3b5gTXaUHbhDas269bayaUYP5XouMPVFIA86_esJqoWcAEZuVXLlrdDm6ZBBLl39gbjpkknSwhnimxJtzE9TBdnOeYobxG293khk&tcut5n",
            "transferSize": 51936,
            "resourceType": "stylesheet",
            "mimeType": "text/css",
            "domain": "www.barcelona.cat"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "image",
            "count": 3,
            "transferBytes": 705635
          },
          {
            "resourceType": "font",
            "count": 2,
            "transferBytes": 145481
          },
          {
            "resourceType": "script",
            "count": 1,
            "transferBytes": 76425
          },
          {
            "resourceType": "stylesheet",
            "count": 1,
            "transferBytes": 51936
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.barcelona.cat",
            "count": 6,
            "transferBytes": 903052
          },
          {
            "domain": "cdn.matomo.cloud",
            "count": 1,
            "transferBytes": 76425
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Lazy-load offscreen images and media galleries",
            "urgency": "medium",
            "estimatedSavingsBytes": 83661,
            "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": "medium",
            "estimatedSavingsBytes": 53832,
            "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": "Defer non-critical UI modules until after first render",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "strategy": "Keep only above-the-fold resources in the initial path; hydrate or import secondary modules later.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 www.barcelona.cat",
            "urgency": "high",
            "estimatedSavingsBytes": 268338,
            "strategy": "Serve a smaller placeholder first and load this asset only when the user scrolls to or requests the component.",
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_platges/public/platges/337225309013014.jpg?itok=fbU0YtCM",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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.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: 11.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 53 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 53 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,
          "displayValue": "Est savings of 81 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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 81 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,
          "displayValue": "Est savings of 681 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 681 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 587 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 587 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,
          "displayValue": "Est savings of 82 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 82 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": "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": 0,
          "displayValue": "Est savings of 1,640 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 Eliminate render-blocking resources\n\n- Lighthouse audit: render-blocking-resources\n- Current value: Est savings of 1,640 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\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": "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,
          "displayValue": "1,054 elements",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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: 1,054 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"
        },
        {
          "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": 0.8,
          "displayValue": "4.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 Speed Index\n\n- Lighthouse audit: speed-index\n- Current value: 4.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\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"
        }
      ]
    },
    {
      "url": "https://barcelona.cat/en/what-to-do-in-bcn/magic-fountain/how-it-works",
      "status": "ok",
      "finalUrl": "https://www.barcelona.cat/en/what-to-do-in-bcn/magic-fountain/how-it-works",
      "performanceScore": 0.45,
      "bestPracticesScore": 1,
      "transferBytes": 1492865,
      "co2Grams": 0.571888814211,
      "greenWeb": {
        "page": {
          "hostname": "www.barcelona.cat",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-13T22:38:00.231825",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.barcelona.cat",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76424,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31747,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "stylesheet",
            "requestCount": 1,
            "transferBytes": 24654,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15566,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7146,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 4110,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/css/bcn-avisos.css",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "fonts.googleapis.com",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 2483,
            "sampleUrl": "https://fonts.googleapis.com/css?family=Source+Sans+3:200,200i,300,300i,400,400i,500,500i,600,600i,700,700i,900,900i",
            "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
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=X32pfH&url=https%3A%2F%2Fwww.barcelona.cat%2Fen%2Fwhat-to-do-in-bcn%2Fmagic-fountain%2Fhow-it-works",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 10,
          "greenCount": 4,
          "notGreenCount": 7,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 60,
        "urgency": "high",
        "pageElementOccurrences": 1,
        "uniqueElementsAssessed": 1,
        "reusedFromCacheCount": 1,
        "components": [
          {
            "signature": "form|get|/en|input|text|query|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "text",
            "fieldName": "query",
            "formContext": "form|get|/en",
            "hasLabel": true,
            "hasValidationRule": false,
            "hasErrorMessagingHook": false,
            "toolingFriendly": false,
            "assessment": {
              "score": 60,
              "urgency": "high",
              "issues": [
                "No explicit validation rule",
                "No error messaging hook",
                "Missing autocomplete for tooling support"
              ],
              "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.",
                "Provide meaningful autocomplete values to support browsers and assistive tooling."
              ]
            },
            "reusedFromCache": true
          }
        ],
        "recommendations": [
          {
            "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."
          },
          {
            "title": "Missing autocomplete for tooling support",
            "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": "How the Magic Fountain works | Barcelona City Council",
          "lang": "en",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "Discover how the Magic Fountain works: how sequences are generated, how much power it needs, the number of motors, light bulbs and much more.",
          "robots": "",
          "canonical": "https://www.barcelona.cat/en/what-to-do-in-bcn/magic-fountain/how-it-works",
          "ogTitle": "How it works",
          "ogDescription": "Do you know how 2,610 litres of water per second are moved around, or how the 44 water jets and the 4,780 light bulbs in the Magic Fountain are coordinated to create spectacular sequences of water and light? Find out here!",
          "ogType": "Web",
          "ogUrl": "https://www.barcelona.cat/en/what-to-do-in-bcn/magic-fountain/how-it-works",
          "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": 34,
        "urgency": "medium",
        "checks": {
          "testedMobile": true,
          "testedTablet": true,
          "horizontalOverflowOnMobile": false,
          "horizontalOverflowOnTablet": false,
          "mobileSmallTapTargets": 40,
          "tabletSmallTapTargets": 33,
          "fixedWidthOffenders": 2,
          "oversizedMedia": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 1,
            "smallTapTargets": 40,
            "oversizedMedia": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 1,
            "smallTapTargets": 33,
            "oversizedMedia": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 40 small targets on mobile and 33 on tablet."
          },
          {
            "title": "Refactor fixed-width components",
            "urgency": "medium",
            "detail": "2 element(s) exceeded viewport width in tested layouts; use responsive component constraints."
          }
        ]
      },
      "securityLight": {
        "score": 59,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": true,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": true,
          "externalScriptCount": 7,
          "externalScriptsWithoutIntegrity": 7,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "cache-control": "max-age=300, public",
            "content-encoding": "gzip",
            "content-language": "en",
            "content-length": "12004",
            "content-type": "text/html; charset=UTF-8",
            "date": "Mon, 13 Apr 2026 22:56:18 GMT",
            "etag": "\"1776120978-gzip\"",
            "expires": "Sun, 19 Nov 1978 05:00:00 GMT",
            "last-modified": "Mon, 13 Apr 2026 22:56:18 GMT",
            "server": "nginx",
            "vary": "Cookie,Accept-Encoding",
            "via": "1.1 ca2190123e61f1744d1210c24c87c840.cloudfront.net (CloudFront)",
            "x-amz-cf-id": "Vdbfa0IBE3JaP7c7TEEgr-1BePuEmsA-iNOi1BKgVxFKR_gGUjqmWw==",
            "x-amz-cf-pop": "IAD12-P5",
            "x-cache": "Miss from cloudfront",
            "x-content-type-options": "nosniff",
            "x-frame-options": "SAMEORIGIN",
            "x-generator": "Drupal 10 (https://www.drupal.org)"
          },
          "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": "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": "7 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 25,
        "urgency": "low",
        "origin": "https://www.barcelona.cat",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://www.barcelona.cat/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/sitemap.xml",
            "found": true,
            "status": 200,
            "contentType": "application/xml; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/manifest.webmanifest",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/favicon.ico",
            "found": true,
            "status": 200,
            "contentType": "image/x-icon"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "low",
            "detail": "Missing beneficial file(s): /.well-known/security.txt, /manifest.webmanifest."
          }
        ]
      },
      "mediaHints": {
        "score": 21,
        "urgency": "low",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 21,
          "imagesWithLazy": 10,
          "imagesWithoutLazy": 11
        },
        "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": "11 of 21 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 85,
        "urgency": "medium",
        "data": {
          "hasPrintStyles": true,
          "hasReducedMotion": true,
          "media": {
            "totalImages": 26,
            "lazyImages": 11,
            "totalIframes": 1,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "\"Source Sans Pro\", \"Helvetica Neue\", Helvetica, Arial, sans-serif",
            "usesSystemFont": true
          },
          "tracking": {
            "count": 0,
            "scripts": []
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 11/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": "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"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 76,
        "urgency": "high",
        "totalEstimatedSavingsBytes": 1131779.35,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Use modern image compression formats",
            "urgency": "high",
            "estimatedSavingsBytes": 635813.3500000001,
            "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": 495966,
            "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: 620.91 KB."
          },
          {
            "title": "Improve image encoding quality/size",
            "urgency": "high",
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 484.34 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": 1434934.35,
        "totalEstimatedBlockingMs": 1633,
        "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": 635813.3500000001,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 621 KiB",
            "urgency": "high",
            "sourceAuditId": "modern-image-formats"
          },
          {
            "id": "uses-optimized-images",
            "title": "Compress oversized image assets",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss.",
            "estimatedSavingsBytes": 495966,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 484 KiB",
            "urgency": "high",
            "sourceAuditId": "uses-optimized-images"
          },
          {
            "id": "render-blocking-resources",
            "title": "Eliminate render-blocking resources",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering.",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1633,
            "displayValue": "Est savings of 1,630 ms",
            "urgency": "high",
            "sourceAuditId": "render-blocking-resources"
          },
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 87110,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 85 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": 83597,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 82 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-css-rules"
          },
          {
            "id": "uses-responsive-images",
            "title": "Right-size images for viewport",
            "detail": "Avoid sending larger images than the rendered size needs.",
            "estimatedSavingsBytes": 77549,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 76 KiB",
            "urgency": "medium",
            "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": 54899,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 54 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-javascript"
          }
        ],
        "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: 620.91 KB."
          },
          {
            "title": "Compress oversized image assets",
            "urgency": "high",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 484.34 KB."
          },
          {
            "title": "Eliminate render-blocking resources",
            "urgency": "high",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering. Estimated render unblocking: 1633 ms."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "medium",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 85.07 KB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "medium",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 81.64 KB."
          },
          {
            "title": "Right-size images for viewport",
            "urgency": "medium",
            "detail": "Avoid sending larger images than the rendered size needs. Estimated byte savings: 75.73 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": 10,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 7,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "7 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": 167993.55876396652
        },
        "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: 164.06 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: 164.06 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": "medium",
        "transferBytes": 1492865,
        "css": {
          "unusedBytes": 83597,
          "ratio": 0.05599769570590777,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 54899,
          "duplicatedBytes": 0,
          "ratio": 0.03677425621204865,
          "auditIds": [
            "unused-javascript",
            "duplicated-javascript"
          ]
        },
        "html": {
          "estimatedPenalty": 0.25,
          "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": "high",
            "estimatedSavingsBytes": 83597,
            "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": "medium",
            "estimatedSavingsBytes": 54899,
            "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": 1492865,
        "estimatedDeferrableBytes": 225606,
        "renderBlockingMs": 1633,
        "breakdown": {
          "offscreenImageSavings": 87110,
          "unusedJavascriptSavings": 54899,
          "unusedCssSavings": 83597
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 87110,
            "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": "medium",
            "estimatedSavingsBytes": 54899,
            "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": "high",
            "estimatedSavingsBytes": 83597,
            "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": "Eliminate render-blocking resources",
            "area": "render-path",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1633,
            "strategy": "Defer scripts/styles not required for first paint and preload only truly critical assets.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-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 www.barcelona.cat",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 165646,
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_medium/public/_dsc0225.jpg?itok=H8h4EuRB",
            "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": 64,
        "urgency": "high",
        "providerCount": 7,
        "requestCount": 8,
        "transferBytes": 139459,
        "notGreenCount": 5,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76424,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31747,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15566,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7146,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=X32pfH&url=https%3A%2F%2Fwww.barcelona.cat%2Fen%2Fwhat-to-do-in-bcn%2Fmagic-fountain%2Fhow-it-works",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "high",
            "detail": "Track 7 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."
          },
          {
            "title": "Prioritize greener alternatives for third-party providers",
            "urgency": "high",
            "detail": "5 third-party script origin(s) are not confirmed green in the Green Web Foundation dataset."
          }
        ]
      },
      "redundancy": {
        "score": 25,
        "urgency": "medium",
        "transferBytes": 1492865,
        "estimatedRedundantBytes": 138496,
        "redundancyRatio": 0.09277195191795641,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 83597,
            "displayValue": "Est savings of 82 KiB"
          },
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 54899,
            "displayValue": "Est savings of 54 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 83597,
            "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 unused javascript",
            "urgency": "medium",
            "estimatedSavingsBytes": 54899,
            "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 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": 37,
        "urgency": "high",
        "totalTransferBytes": 1492865,
        "heavyRequestCount": 9,
        "heavyBytes": 962218,
        "heavyRatio": 0.6445445502439939,
        "heavyRequests": [
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_medium/public/_dsc0225.jpg?itok=H8h4EuRB",
            "transferSize": 165646,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_medium/public/_dsc0112.jpg?itok=7m0dL-XN",
            "transferSize": 159595,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_medium/public/cascades-3i4-002.jpg?itok=t_kVP8eB",
            "transferSize": 131735,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_medium/public/cascada-2palau-n.jpg?itok=h9CduMqi",
            "transferSize": 117134,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_medium/public/conjunt-montjuic-001.jpg?itok=PeUQfXAl",
            "transferSize": 114268,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "transferSize": 90561,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "transferSize": 76424,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "cdn.matomo.cloud"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament/fonts/icoajuntament.ttf?8aaig7",
            "transferSize": 54921,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/css/css_qDD4BCxE8K-iT7MRORwp32v03DlJblP9-xrYwOBWlQo.css?delta=6&language=en&theme=barcelonacat_theme&include=eJyFz8FuxCAMBNAfCsuhH4QG4ia0DkbYpJu_L9JKW1VitSdbM-8y-OrFcFCxgDOrqH8ch5qXiJaIpSDBgpzUWl5J_dDdmQiP_pWp2MidmX7-A9vpIB9FTK2hhrSWGfhESVeU-6zbWCLYqV2cyzYTOYnDc9dMKOf07ZASqebINDXSRxYURcPHO1CbLDGVMFiDf36B7katgJeKhm0s3tWvrVfw7S-59VJ75Kw7rYteanT4CKVfKxCiTQ&tcut5n",
            "transferSize": 51934,
            "resourceType": "stylesheet",
            "mimeType": "text/css",
            "domain": "www.barcelona.cat"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "image",
            "count": 5,
            "transferBytes": 688378
          },
          {
            "resourceType": "font",
            "count": 2,
            "transferBytes": 145482
          },
          {
            "resourceType": "script",
            "count": 1,
            "transferBytes": 76424
          },
          {
            "resourceType": "stylesheet",
            "count": 1,
            "transferBytes": 51934
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.barcelona.cat",
            "count": 8,
            "transferBytes": 885794
          },
          {
            "domain": "cdn.matomo.cloud",
            "count": 1,
            "transferBytes": 76424
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Lazy-load offscreen images and media galleries",
            "urgency": "medium",
            "estimatedSavingsBytes": 87110,
            "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": "medium",
            "estimatedSavingsBytes": 54899,
            "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": "Defer non-critical UI modules until after first render",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "strategy": "Keep only above-the-fold resources in the initial path; hydrate or import secondary modules later.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 www.barcelona.cat",
            "urgency": "medium",
            "estimatedSavingsBytes": 165646,
            "strategy": "Serve a smaller placeholder first and load this asset only when the user scrolls to or requests the component.",
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_medium/public/_dsc0225.jpg?itok=H8h4EuRB",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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.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: 11.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 54 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 54 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,
          "displayValue": "Est savings of 82 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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 82 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,
          "displayValue": "Est savings of 621 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 621 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 484 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 484 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,
          "displayValue": "Est savings of 85 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 85 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": "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": 0,
          "displayValue": "Est savings of 1,630 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 Eliminate render-blocking resources\n\n- Lighthouse audit: render-blocking-resources\n- Current value: Est savings of 1,630 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\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": "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,
          "displayValue": "1,020 elements",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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: 1,020 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"
        },
        {
          "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": 0.78,
          "displayValue": "4.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 Speed Index\n\n- Lighthouse audit: speed-index\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\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"
        }
      ]
    },
    {
      "url": "https://barcelona.cat/ca/que-pots-fer-a-bcn/banys-i-platges/historia-de-les-platges",
      "status": "ok",
      "finalUrl": "https://www.barcelona.cat/ca/que-pots-fer-a-bcn/banys-i-platges/historia-de-les-platges",
      "performanceScore": 0.51,
      "bestPracticesScore": 1,
      "transferBytes": 2193446,
      "co2Grams": 0.8402683645044,
      "greenWeb": {
        "page": {
          "hostname": "www.barcelona.cat",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-13T22:38:00.231825",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.barcelona.cat",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76426,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "stylesheet",
            "requestCount": 1,
            "transferBytes": 24654,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15566,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7145,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 4112,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/css/bcn-avisos.css",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2862,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "fonts.googleapis.com",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 2484,
            "sampleUrl": "https://fonts.googleapis.com/css?family=Source+Sans+3:200,200i,300,300i,400,400i,500,500i,600,600i,700,700i,900,900i",
            "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
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=QE1p4a&url=https%3A%2F%2Fwww.barcelona.cat%2Fca%2Fque-pots-fer-a-bcn%2Fbanys-i-platges%2Fhistoria-de-les-platges",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 10,
          "greenCount": 4,
          "notGreenCount": 7,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 60,
        "urgency": "high",
        "pageElementOccurrences": 1,
        "uniqueElementsAssessed": 1,
        "reusedFromCacheCount": 1,
        "components": [
          {
            "signature": "form|get|/ca|input|text|query|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "text",
            "fieldName": "query",
            "formContext": "form|get|/ca",
            "hasLabel": true,
            "hasValidationRule": false,
            "hasErrorMessagingHook": false,
            "toolingFriendly": false,
            "assessment": {
              "score": 60,
              "urgency": "high",
              "issues": [
                "No explicit validation rule",
                "No error messaging hook",
                "Missing autocomplete for tooling support"
              ],
              "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.",
                "Provide meaningful autocomplete values to support browsers and assistive tooling."
              ]
            },
            "reusedFromCache": true
          }
        ],
        "recommendations": [
          {
            "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."
          },
          {
            "title": "Missing autocomplete for tooling support",
            "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": "Història de les platges | Web Barcelona | Ajuntament Barcelona",
          "lang": "ca",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "Descobriu la història de les platges de Barcelona i com ha influït la costa i el mar en el desenvolupament de la ciutat.",
          "robots": "",
          "canonical": "https://www.barcelona.cat/ca/que-pots-fer-a-bcn/banys-i-platges/historia-de-les-platges",
          "ogTitle": "Història de les platges",
          "ogDescription": "Coneix de quina manera ha influït el mar en el desenvolupament de Barcelona: com a porta d’entrada de noves cultures, com a eix comercial i com a espai col·lectiu d’oci i cultura a partir del segle XIX.",
          "ogType": "Web",
          "ogUrl": "https://www.barcelona.cat/ca/que-pots-fer-a-bcn/banys-i-platges/historia-de-les-platges",
          "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": 34,
        "urgency": "medium",
        "checks": {
          "testedMobile": true,
          "testedTablet": true,
          "horizontalOverflowOnMobile": false,
          "horizontalOverflowOnTablet": false,
          "mobileSmallTapTargets": 38,
          "tabletSmallTapTargets": 33,
          "fixedWidthOffenders": 2,
          "oversizedMedia": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 1,
            "smallTapTargets": 38,
            "oversizedMedia": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 1,
            "smallTapTargets": 33,
            "oversizedMedia": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 38 small targets on mobile and 33 on tablet."
          },
          {
            "title": "Refactor fixed-width components",
            "urgency": "medium",
            "detail": "2 element(s) exceeded viewport width in tested layouts; use responsive component constraints."
          }
        ]
      },
      "securityLight": {
        "score": 59,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": true,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": true,
          "externalScriptCount": 7,
          "externalScriptsWithoutIntegrity": 7,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "cache-control": "max-age=300, public",
            "content-encoding": "gzip",
            "content-language": "ca",
            "content-length": "18472",
            "content-type": "text/html; charset=UTF-8",
            "date": "Mon, 13 Apr 2026 22:56:31 GMT",
            "etag": "\"1776120991-gzip\"",
            "expires": "Sun, 19 Nov 1978 05:00:00 GMT",
            "last-modified": "Mon, 13 Apr 2026 22:56:31 GMT",
            "server": "nginx",
            "vary": "Cookie,Accept-Encoding",
            "via": "1.1 ca2190123e61f1744d1210c24c87c840.cloudfront.net (CloudFront)",
            "x-amz-cf-id": "P_naxSiMeum2fqkVGoUJdjJtvzo6gekpJvtCh-twldFzS1Y7duKK6A==",
            "x-amz-cf-pop": "IAD12-P5",
            "x-cache": "Miss from cloudfront",
            "x-content-type-options": "nosniff",
            "x-frame-options": "SAMEORIGIN",
            "x-generator": "Drupal 10 (https://www.drupal.org)"
          },
          "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": "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": "7 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 25,
        "urgency": "low",
        "origin": "https://www.barcelona.cat",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://www.barcelona.cat/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/sitemap.xml",
            "found": true,
            "status": 200,
            "contentType": "application/xml; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/manifest.webmanifest",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/favicon.ico",
            "found": true,
            "status": 200,
            "contentType": "image/x-icon"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "low",
            "detail": "Missing beneficial file(s): /.well-known/security.txt, /manifest.webmanifest."
          }
        ]
      },
      "mediaHints": {
        "score": 29,
        "urgency": "low",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 17,
          "imagesWithLazy": 6,
          "imagesWithoutLazy": 11
        },
        "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": "11 of 17 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 85,
        "urgency": "medium",
        "data": {
          "hasPrintStyles": true,
          "hasReducedMotion": true,
          "media": {
            "totalImages": 22,
            "lazyImages": 7,
            "totalIframes": 1,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "\"Source Sans Pro\", \"Helvetica Neue\", Helvetica, Arial, sans-serif",
            "usesSystemFont": true
          },
          "tracking": {
            "count": 0,
            "scripts": []
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 7/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": "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"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 100,
        "urgency": "high",
        "totalEstimatedSavingsBytes": 2272503.85,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Use modern image compression formats",
            "urgency": "high",
            "estimatedSavingsBytes": 1231334.85,
            "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": 1041169,
            "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: 1.17 MB."
          },
          {
            "title": "Improve image encoding quality/size",
            "urgency": "high",
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 1016.77 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": 2652709.85,
        "totalEstimatedBlockingMs": 1659,
        "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": 1231334.85,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 1,202 KiB",
            "urgency": "high",
            "sourceAuditId": "modern-image-formats"
          },
          {
            "id": "uses-optimized-images",
            "title": "Compress oversized image assets",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss.",
            "estimatedSavingsBytes": 1041169,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 1,017 KiB",
            "urgency": "high",
            "sourceAuditId": "uses-optimized-images"
          },
          {
            "id": "uses-responsive-images",
            "title": "Right-size images for viewport",
            "detail": "Avoid sending larger images than the rendered size needs.",
            "estimatedSavingsBytes": 153915,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 150 KiB",
            "urgency": "high",
            "sourceAuditId": "uses-responsive-images"
          },
          {
            "id": "render-blocking-resources",
            "title": "Eliminate render-blocking resources",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering.",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1659,
            "displayValue": "Est savings of 1,660 ms",
            "urgency": "high",
            "sourceAuditId": "render-blocking-resources"
          },
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 87109,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 85 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": 83486,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 82 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-css-rules"
          },
          {
            "id": "unused-javascript",
            "title": "Remove unused JavaScript",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code.",
            "estimatedSavingsBytes": 55696,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 54 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-javascript"
          }
        ],
        "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.17 MB."
          },
          {
            "title": "Compress oversized image assets",
            "urgency": "high",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 1016.77 KB."
          },
          {
            "title": "Right-size images for viewport",
            "urgency": "high",
            "detail": "Avoid sending larger images than the rendered size needs. Estimated byte savings: 150.31 KB."
          },
          {
            "title": "Eliminate render-blocking resources",
            "urgency": "high",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering. Estimated render unblocking: 1659 ms."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "medium",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 85.07 KB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "medium",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 81.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": 10,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 7,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "7 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": 167990.92070530728
        },
        "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: 164.05 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: 164.05 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": "medium",
        "transferBytes": 2193446,
        "css": {
          "unusedBytes": 83486,
          "ratio": 0.03806157069743226,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 55696,
          "duplicatedBytes": 0,
          "ratio": 0.025392008738760834,
          "auditIds": [
            "unused-javascript",
            "duplicated-javascript"
          ]
        },
        "html": {
          "estimatedPenalty": 0.25,
          "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": "high",
            "estimatedSavingsBytes": 83486,
            "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": "medium",
            "estimatedSavingsBytes": 55696,
            "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": 2193446,
        "estimatedDeferrableBytes": 226291,
        "renderBlockingMs": 1659,
        "breakdown": {
          "offscreenImageSavings": 87109,
          "unusedJavascriptSavings": 55696,
          "unusedCssSavings": 83486
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 87109,
            "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": "medium",
            "estimatedSavingsBytes": 55696,
            "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": "high",
            "estimatedSavingsBytes": 83486,
            "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": "Eliminate render-blocking resources",
            "area": "render-path",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1659,
            "strategy": "Defer scripts/styles not required for first paint and preload only truly critical assets.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-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 www.barcelona.cat",
            "area": "image",
            "urgency": "high",
            "estimatedSavingsBytes": 480781,
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_medium/public/platges7186188803_dd14b08728_c_2.jpg?itok=DN5OwBPD",
            "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 www.barcelona.cat",
            "area": "font",
            "urgency": "medium",
            "estimatedSavingsBytes": 90560,
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "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": 64,
        "urgency": "high",
        "providerCount": 7,
        "requestCount": 8,
        "transferBytes": 139460,
        "notGreenCount": 5,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76426,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15566,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7145,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2862,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=QE1p4a&url=https%3A%2F%2Fwww.barcelona.cat%2Fca%2Fque-pots-fer-a-bcn%2Fbanys-i-platges%2Fhistoria-de-les-platges",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "high",
            "detail": "Track 7 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."
          },
          {
            "title": "Prioritize greener alternatives for third-party providers",
            "urgency": "high",
            "detail": "5 third-party script origin(s) are not confirmed green in the Green Web Foundation dataset."
          }
        ]
      },
      "redundancy": {
        "score": 23,
        "urgency": "medium",
        "transferBytes": 2193446,
        "estimatedRedundantBytes": 139182,
        "redundancyRatio": 0.06345357943619309,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 83486,
            "displayValue": "Est savings of 82 KiB"
          },
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 55696,
            "displayValue": "Est savings of 54 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 83486,
            "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 unused javascript",
            "urgency": "medium",
            "estimatedSavingsBytes": 55696,
            "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 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": 38,
        "urgency": "high",
        "totalTransferBytes": 2193446,
        "heavyRequestCount": 7,
        "heavyBytes": 1637500,
        "heavyRatio": 0.7465421988961661,
        "heavyRequests": [
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_medium/public/platges7186188803_dd14b08728_c_2.jpg?itok=DN5OwBPD",
            "transferSize": 480781,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_medium/public/bcn002046.jpg?itok=12uz3zFf",
            "transferSize": 457843,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_medium/public/bcn001547.jpg?itok=Fe7A4Q1l",
            "transferSize": 425037,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "transferSize": 90560,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "transferSize": 76426,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "cdn.matomo.cloud"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament/fonts/icoajuntament.ttf?8aaig7",
            "transferSize": 54919,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/css/css_qDD4BCxE8K-iT7MRORwp32v03DlJblP9-xrYwOBWlQo.css?delta=6&language=ca&theme=barcelonacat_theme&include=eJyFz8FuxCAMBNAfCsuhH4QG4ia0DkbYpJu_L9JKW1VitSdbM-8y-OrFcFCxgDOrqH8ch5qXiJaIpSDBgpzUWl5J_dDdmQiP_pWp2MidmX7-A9vpIB9FTK2hhrSWGfhESVeU-6zbWCLYqV2cyzYTOYnDc9dMKOf07ZASqebINDXSRxYURcPHO1CbLDGVMFiDf36B7katgJeKhm0s3tWvrVfw7S-59VJ75Kw7rYteanT4CKVfKxCiTQ&tcut5n",
            "transferSize": 51934,
            "resourceType": "stylesheet",
            "mimeType": "text/css",
            "domain": "www.barcelona.cat"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "image",
            "count": 3,
            "transferBytes": 1363661
          },
          {
            "resourceType": "font",
            "count": 2,
            "transferBytes": 145479
          },
          {
            "resourceType": "script",
            "count": 1,
            "transferBytes": 76426
          },
          {
            "resourceType": "stylesheet",
            "count": 1,
            "transferBytes": 51934
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.barcelona.cat",
            "count": 6,
            "transferBytes": 1561074
          },
          {
            "domain": "cdn.matomo.cloud",
            "count": 1,
            "transferBytes": 76426
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Lazy-load offscreen images and media galleries",
            "urgency": "medium",
            "estimatedSavingsBytes": 87109,
            "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": "medium",
            "estimatedSavingsBytes": 55696,
            "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": "Defer non-critical UI modules until after first render",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "strategy": "Keep only above-the-fold resources in the initial path; hydrate or import secondary modules later.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 www.barcelona.cat",
            "urgency": "high",
            "estimatedSavingsBytes": 480781,
            "strategy": "Serve a smaller placeholder first and load this asset only when the user scrolls to or requests the component.",
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_medium/public/platges7186188803_dd14b08728_c_2.jpg?itok=DN5OwBPD",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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": "13.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: 13.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 54 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 54 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,
          "displayValue": "Est savings of 82 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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 82 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,
          "displayValue": "Est savings of 1,202 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,202 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 1,017 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 1,017 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,
          "displayValue": "Est savings of 85 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 85 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": "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": 0,
          "displayValue": "Est savings of 1,660 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 Eliminate render-blocking resources\n\n- Lighthouse audit: render-blocking-resources\n- Current value: Est savings of 1,660 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\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": "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,
          "displayValue": "1,105 elements",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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: 1,105 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"
        },
        {
          "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": 0.83,
          "displayValue": "3.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 Speed Index\n\n- Lighthouse audit: speed-index\n- Current value: 3.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\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"
        }
      ]
    },
    {
      "url": "https://barcelona.cat/es/que-hacer-en-bcn/fuente-magica/horarios-de-la-fuente-magica",
      "status": "ok",
      "finalUrl": "https://www.barcelona.cat/es/que-hacer-en-bcn/fuente-magica/horarios-de-la-fuente-magica",
      "performanceScore": 0.53,
      "bestPracticesScore": 0.79,
      "transferBytes": 3424930,
      "co2Grams": 1.3120269793020003,
      "greenWeb": {
        "page": {
          "hostname": "www.barcelona.cat",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-13T22:38:00.231825",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.barcelona.cat",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76424,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "geoportal.barcelona.cat",
            "resourceType": "script",
            "requestCount": 7,
            "transferBytes": 49104,
            "sampleUrl": "https://geoportal.barcelona.cat/planolbcn/widgetguia/es/",
            "greenCheck": {
              "hostname": "geoportal.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.864845",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/geoportal.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "stylesheet",
            "requestCount": 1,
            "transferBytes": 24654,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15565,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7145,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 4117,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/css/bcn-avisos.css",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2860,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "fonts.googleapis.com",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 2483,
            "sampleUrl": "https://fonts.googleapis.com/css?family=Source+Sans+3:200,200i,300,300i,400,400i,500,500i,600,600i,700,700i,900,900i",
            "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
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=hixIaB&url=https%3A%2F%2Fwww.barcelona.cat%2Fes%2Fque-hacer-en-bcn%2Ffuente-magica%2Fhorarios-de-la-fuente-magica",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 11,
          "greenCount": 4,
          "notGreenCount": 8,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 60,
        "urgency": "high",
        "pageElementOccurrences": 1,
        "uniqueElementsAssessed": 1,
        "reusedFromCacheCount": 1,
        "components": [
          {
            "signature": "form|get|/es/|input|text|query|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "text",
            "fieldName": "query",
            "formContext": "form|get|/es/",
            "hasLabel": true,
            "hasValidationRule": false,
            "hasErrorMessagingHook": false,
            "toolingFriendly": false,
            "assessment": {
              "score": 60,
              "urgency": "high",
              "issues": [
                "No explicit validation rule",
                "No error messaging hook",
                "Missing autocomplete for tooling support"
              ],
              "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.",
                "Provide meaningful autocomplete values to support browsers and assistive tooling."
              ]
            },
            "reusedFromCache": true
          }
        ],
        "recommendations": [
          {
            "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."
          },
          {
            "title": "Missing autocomplete for tooling support",
            "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": "Horarios Fuente Mágica | Barcelona | Ayuntamiento Barcelona",
          "lang": "es",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "Consulta el horario de funcionamiento y coreografías de la Fuente Mágica de Montjuïc y planifica la visita a un espectáculo de música e iluminación.",
          "robots": "",
          "canonical": "https://www.barcelona.cat/es/que-hacer-en-bcn/fuente-magica/horarios-de-la-fuente-magica",
          "ogTitle": "Horarios de la Fuente Mágica",
          "ogDescription": "Si quieres saber cuándo está iluminada la Fuente Mágica de Montjuïc, el horario de las coreografías durante el año o cómo llegar, aquí encontrarás toda la información para organizar la visita.",
          "ogType": "Web",
          "ogUrl": "https://www.barcelona.cat/es/que-hacer-en-bcn/fuente-magica/horarios-de-la-fuente-magica",
          "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": 35,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 37,
            "oversizedMedia": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 35,
            "oversizedMedia": 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 35 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 59,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": true,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": true,
          "externalScriptCount": 7,
          "externalScriptsWithoutIntegrity": 7,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "cache-control": "max-age=300, public",
            "content-encoding": "gzip",
            "content-language": "es",
            "content-length": "11525",
            "content-type": "text/html; charset=UTF-8",
            "date": "Mon, 13 Apr 2026 22:56:45 GMT",
            "etag": "\"1776121005-gzip\"",
            "expires": "Sun, 19 Nov 1978 05:00:00 GMT",
            "last-modified": "Mon, 13 Apr 2026 22:56:45 GMT",
            "server": "nginx",
            "vary": "Cookie,Accept-Encoding",
            "via": "1.1 ca2190123e61f1744d1210c24c87c840.cloudfront.net (CloudFront)",
            "x-amz-cf-id": "lsHrj5s9DLDMCIgqkznzSGaZm3nU8ATx_gnnm6i68Uu-VpvYzYdR_A==",
            "x-amz-cf-pop": "IAD12-P5",
            "x-cache": "Miss from cloudfront",
            "x-content-type-options": "nosniff",
            "x-frame-options": "SAMEORIGIN",
            "x-generator": "Drupal 10 (https://www.drupal.org)"
          },
          "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": "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": "7 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 25,
        "urgency": "low",
        "origin": "https://www.barcelona.cat",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://www.barcelona.cat/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/sitemap.xml",
            "found": true,
            "status": 200,
            "contentType": "application/xml; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/manifest.webmanifest",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/favicon.ico",
            "found": true,
            "status": 200,
            "contentType": "image/x-icon"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "low",
            "detail": "Missing beneficial file(s): /.well-known/security.txt, /manifest.webmanifest."
          }
        ]
      },
      "mediaHints": {
        "score": 35,
        "urgency": "medium",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 16,
          "imagesWithLazy": 4,
          "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 16 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 85,
        "urgency": "medium",
        "data": {
          "hasPrintStyles": true,
          "hasReducedMotion": true,
          "media": {
            "totalImages": 21,
            "lazyImages": 5,
            "totalIframes": 1,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "\"Source Sans Pro\", \"Helvetica Neue\", Helvetica, Arial, sans-serif",
            "usesSystemFont": true
          },
          "tracking": {
            "count": 0,
            "scripts": []
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 5/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": "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"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 57,
        "urgency": "medium",
        "totalEstimatedSavingsBytes": 1935704.1,
        "checks": {
          "hasEffectiveTextCompression": false
        },
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Use modern image compression formats",
            "urgency": "high",
            "estimatedSavingsBytes": 1422775.1,
            "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": 490565,
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings."
          },
          {
            "id": "uses-text-compression",
            "title": "Enable Brotli/gzip for text assets",
            "urgency": "low",
            "estimatedSavingsBytes": 18066,
            "detail": "Compress HTML, CSS, JS, JSON, SVG, and XML responses with Brotli or gzip."
          },
          {
            "id": "unminified-javascript",
            "title": "Minify JavaScript before transfer",
            "urgency": "low",
            "estimatedSavingsBytes": 4298,
            "detail": "Minify JS bundles so transport compression produces better results with fewer bytes."
          }
        ],
        "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.36 MB."
          },
          {
            "title": "Improve image encoding quality/size",
            "urgency": "high",
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 479.07 KB."
          },
          {
            "title": "Enable Brotli/gzip for text assets",
            "urgency": "low",
            "detail": "Compress HTML, CSS, JS, JSON, SVG, and XML responses with Brotli or gzip. Estimated savings: 17.64 KB."
          },
          {
            "title": "Minify JavaScript before transfer",
            "urgency": "low",
            "detail": "Minify JS bundles so transport compression produces better results with fewer bytes. Estimated savings: 4.20 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": 2951356.1,
        "totalEstimatedBlockingMs": 2792,
        "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": 1422775.1,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 1,389 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": 830825,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 811 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": 490565,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 479 KiB",
            "urgency": "high",
            "sourceAuditId": "uses-optimized-images"
          },
          {
            "id": "render-blocking-resources",
            "title": "Eliminate render-blocking resources",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering.",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 2792,
            "displayValue": "Est savings of 2,790 ms",
            "urgency": "high",
            "sourceAuditId": "render-blocking-resources"
          },
          {
            "id": "unused-css-rules",
            "title": "Remove unused CSS",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped.",
            "estimatedSavingsBytes": 97718,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 95 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-css-rules"
          },
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 87109,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 85 KiB",
            "urgency": "medium",
            "sourceAuditId": "offscreen-images"
          },
          {
            "id": "uses-text-compression",
            "title": "Enable text compression",
            "detail": "Serve text assets with Brotli or gzip to remove avoidable transfer bloat.",
            "estimatedSavingsBytes": 18066,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 18 KiB",
            "urgency": "low",
            "sourceAuditId": "uses-text-compression"
          },
          {
            "id": "unminified-javascript",
            "title": "Minify JavaScript",
            "detail": "Use minified production JS output to reduce payload size.",
            "estimatedSavingsBytes": 4298,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 4 KiB",
            "urgency": "low",
            "sourceAuditId": "unminified-javascript"
          }
        ],
        "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.36 MB."
          },
          {
            "title": "Remove unused JavaScript",
            "urgency": "high",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 811.35 KB."
          },
          {
            "title": "Compress oversized image assets",
            "urgency": "high",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 479.07 KB."
          },
          {
            "title": "Eliminate render-blocking resources",
            "urgency": "high",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering. Estimated render unblocking: 2792 ms."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "medium",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 95.43 KB."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "medium",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 85.07 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": 10,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 7,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "7 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": 2111042.3962639663
        },
        "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.01 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.01 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": 14,
        "urgency": "high",
        "transferBytes": 3424930,
        "css": {
          "unusedBytes": 97718,
          "ratio": 0.028531386042926425,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 830825,
          "duplicatedBytes": 0,
          "ratio": 0.24258160020788747,
          "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": "high",
            "estimatedSavingsBytes": 97718,
            "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": 830825,
            "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": 24,
        "urgency": "high",
        "transferBytes": 3424930,
        "estimatedDeferrableBytes": 1015652,
        "renderBlockingMs": 2792,
        "breakdown": {
          "offscreenImageSavings": 87109,
          "unusedJavascriptSavings": 830825,
          "unusedCssSavings": 97718
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 87109,
            "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": 830825,
            "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": "high",
            "estimatedSavingsBytes": 97718,
            "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": "Eliminate render-blocking resources",
            "area": "render-path",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 2792,
            "strategy": "Defer scripts/styles not required for first paint and preload only truly critical assets.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-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 www.barcelona.cat",
            "area": "image",
            "urgency": "high",
            "estimatedSavingsBytes": 436027,
            "url": "https://www.barcelona.cat/sites/default/files/styles/caixainfo_screen/public/bg_caixa_info_3.jpg?itok=SF9ih3kL",
            "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.barcelona.cat",
            "area": "script",
            "urgency": "high",
            "estimatedSavingsBytes": 283845,
            "url": "https://www.barcelona.cat/estatics-planol/v1.2/widget_i/lib/ol-6.14.1.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": 68,
        "urgency": "high",
        "providerCount": 8,
        "requestCount": 15,
        "transferBytes": 188559,
        "notGreenCount": 6,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76424,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "geoportal.barcelona.cat",
            "resourceType": "script",
            "requestCount": 7,
            "transferBytes": 49104,
            "sampleUrl": "https://geoportal.barcelona.cat/planolbcn/widgetguia/es/",
            "greenCheck": {
              "hostname": "geoportal.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.864845",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/geoportal.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15565,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7145,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2860,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=hixIaB&url=https%3A%2F%2Fwww.barcelona.cat%2Fes%2Fque-hacer-en-bcn%2Ffuente-magica%2Fhorarios-de-la-fuente-magica",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "high",
            "detail": "Track 8 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."
          },
          {
            "title": "Prioritize greener alternatives for third-party providers",
            "urgency": "high",
            "detail": "6 third-party script origin(s) are not confirmed green in the Green Web Foundation dataset."
          }
        ]
      },
      "redundancy": {
        "score": 35,
        "urgency": "high",
        "transferBytes": 3424930,
        "estimatedRedundantBytes": 928543,
        "redundancyRatio": 0.27111298625081387,
        "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": 830825,
            "displayValue": "Est savings of 811 KiB"
          },
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 97718,
            "displayValue": "Est savings of 95 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused javascript",
            "urgency": "high",
            "estimatedSavingsBytes": 830825,
            "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": 97718,
            "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": "Enable and verify text compression",
            "urgency": "medium",
            "estimatedSavingsBytes": 18066,
            "auditId": "uses-text-compression",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "2",
              "title": "Remove unnecessary or redundant information",
              "url": "https://www.w3.org/TR/web-sustainability-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": 34,
        "urgency": "high",
        "totalTransferBytes": 3424930,
        "heavyRequestCount": 9,
        "heavyBytes": 1646163,
        "heavyRatio": 0.4806413561737028,
        "heavyRequests": [
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/caixainfo_screen/public/bg_caixa_info_3.jpg?itok=SF9ih3kL",
            "transferSize": 436027,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/estatics-planol/v1.2/widget_i/lib/ol-6.14.1.js",
            "transferSize": 283845,
            "resourceType": "script",
            "mimeType": "text/javascript",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/estatics/geobcn/1.2/api-full-ca.js",
            "transferSize": 247085,
            "resourceType": "script",
            "mimeType": "text/javascript",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/estatics/geobcn/1.2/js/lib/openlayers/ol-6.15.1.js",
            "transferSize": 243761,
            "resourceType": "script",
            "mimeType": "text/javascript",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/caixainfo_mobile/public/bg_caixa_info_mobile_3.jpg?itok=w0PbJhIg",
            "transferSize": 164446,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "transferSize": 90559,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "transferSize": 76424,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "cdn.matomo.cloud"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament/fonts/icoajuntament.ttf?8aaig7",
            "transferSize": 54920,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/css/css_evpTRQTawGYS1Ro7RbXq3hBxwat7AU-RJm1V8ZgzeaE.css?delta=5&language=es&theme=barcelonacat_theme&include=eJyFzsGKwzAMBNAfiuvDfpAZOyJxcSQjydn272sodFnIsieJmXcY3Ac7DmJPOKuJxfcJ6HXJ0EJNGAWe5CTVupLFqUdwkTb7v0zHRuGs9P0b-E4HxSzi5oqeyspXYGuS0YL5s1XerkQtEvDZfiVMxsySgS19_Qe6ypILp8kU8fMlejgpoy0dim0u3i2uOjra7Se5De4jt2o7rYs9zemIGUYvwgyJSg&tcut5n",
            "transferSize": 49096,
            "resourceType": "stylesheet",
            "mimeType": "text/css",
            "domain": "www.barcelona.cat"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "script",
            "count": 4,
            "transferBytes": 851115
          },
          {
            "resourceType": "image",
            "count": 2,
            "transferBytes": 600473
          },
          {
            "resourceType": "font",
            "count": 2,
            "transferBytes": 145479
          },
          {
            "resourceType": "stylesheet",
            "count": 1,
            "transferBytes": 49096
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.barcelona.cat",
            "count": 8,
            "transferBytes": 1569739
          },
          {
            "domain": "cdn.matomo.cloud",
            "count": 1,
            "transferBytes": 76424
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Lazy-load offscreen images and media galleries",
            "urgency": "medium",
            "estimatedSavingsBytes": 87109,
            "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": 830825,
            "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": "Defer non-critical UI modules until after first render",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "strategy": "Keep only above-the-fold resources in the initial path; hydrate or import secondary modules later.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 www.barcelona.cat",
            "urgency": "high",
            "estimatedSavingsBytes": 436027,
            "strategy": "Serve a smaller placeholder first and load this asset only when the user scrolls to or requests the component.",
            "url": "https://www.barcelona.cat/sites/default/files/styles/caixainfo_screen/public/bg_caixa_info_3.jpg?itok=SF9ih3kL",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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.barcelona.cat",
            "urgency": "high",
            "estimatedSavingsBytes": 283845,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://www.barcelona.cat/estatics-planol/v1.2/widget_i/lib/ol-6.14.1.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.01,
          "displayValue": "8.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: 8.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": "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": 0.49,
          "displayValue": "5.9 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 Speed Index\n\n- Lighthouse audit: speed-index\n- Current value: 5.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\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-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,
          "displayValue": "Est savings of 95 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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 95 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,
          "displayValue": "Est savings of 1,389 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,389 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 479 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 479 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,
          "displayValue": "Est savings of 85 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 85 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": "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": 0,
          "displayValue": "Est savings of 2,790 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 Eliminate render-blocking resources\n\n- Lighthouse audit: render-blocking-resources\n- Current value: Est savings of 2,790 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\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": "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 811 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 811 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": "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": 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 Enable text compression\n\n- Lighthouse audit: uses-text-compression\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\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": "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,345 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,345 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"
        },
        {
          "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": "1,085 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: 1,085 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://barcelona.cat/en/what-to-do-in-bcn/culture/theatres",
      "status": "ok",
      "finalUrl": "https://www.barcelona.cat/en/what-to-do-in-bcn/culture/theatres",
      "performanceScore": 0.68,
      "bestPracticesScore": 1,
      "transferBytes": 860969,
      "co2Grams": 0.3298212098766,
      "greenWeb": {
        "page": {
          "hostname": "www.barcelona.cat",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-13T22:38:00.231825",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.barcelona.cat",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76425,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "stylesheet",
            "requestCount": 1,
            "transferBytes": 24657,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "cdnjs.cloudflare.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15871,
            "sampleUrl": "https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js",
            "greenCheck": {
              "hostname": "cdnjs.cloudflare.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:34",
              "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/cdnjs.cloudflare.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15565,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7148,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 4130,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/css/bcn-avisos.css",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "fonts.googleapis.com",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 2483,
            "sampleUrl": "https://fonts.googleapis.com/css?family=Source+Sans+3:200,200i,300,300i,400,400i,500,500i,600,600i,700,700i,900,900i",
            "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
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=8l5Loq&url=https%3A%2F%2Fwww.barcelona.cat%2Fen%2Fwhat-to-do-in-bcn%2Fculture%2Ftheatres",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 11,
          "greenCount": 5,
          "notGreenCount": 7,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 75,
        "urgency": "high",
        "pageElementOccurrences": 7,
        "uniqueElementsAssessed": 2,
        "reusedFromCacheCount": 2,
        "components": [
          {
            "signature": "form|get|/en|input|text|query|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "text",
            "fieldName": "query",
            "formContext": "form|get|/en",
            "hasLabel": true,
            "hasValidationRule": false,
            "hasErrorMessagingHook": false,
            "toolingFriendly": false,
            "assessment": {
              "score": 60,
              "urgency": "high",
              "issues": [
                "No explicit validation rule",
                "No error messaging hook",
                "Missing autocomplete for tooling support"
              ],
              "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.",
                "Provide meaningful autocomplete values to support browsers and assistive tooling."
              ]
            },
            "reusedFromCache": true
          },
          {
            "signature": "no-form|select|select|anonymous|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "select",
            "fieldName": null,
            "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": "No explicit validation rule",
            "urgency": "medium",
            "detail": "2 unique form control signature(s) on this page include this issue."
          },
          {
            "title": "No error messaging hook",
            "urgency": "medium",
            "detail": "2 unique form control signature(s) on this page include this issue."
          },
          {
            "title": "Missing autocomplete for tooling support",
            "urgency": "medium",
            "detail": "1 unique form control signature(s) on this page include this issue."
          },
          {
            "title": "Missing associated label",
            "urgency": "high",
            "detail": "1 unique form control signature(s) on this page include this issue."
          }
        ]
      },
      "metadata": {
        "score": 25,
        "urgency": "low",
        "checks": {
          "hasTitle": true,
          "hasLang": true,
          "hasDescription": false,
          "hasCanonical": true,
          "hasOpenGraphCore": false,
          "hasTwitterCard": true,
          "hasViewport": true,
          "hasCharset": true,
          "hasValidStructuredData": true,
          "hasInvalidStructuredData": false
        },
        "observed": {
          "title": "Theatres | Barcelona.cat | Ajuntament de Barcelona",
          "lang": "en",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "",
          "robots": "",
          "canonical": "https://www.barcelona.cat/en/what-to-do-in-bcn/culture/theatres",
          "ogTitle": "Theatres",
          "ogDescription": "",
          "ogType": "Web",
          "ogUrl": "https://www.barcelona.cat/en/what-to-do-in-bcn/culture/theatres",
          "twitterCard": "summary_large_image",
          "ldJsonCount": 0,
          "validLdJsonCount": 0,
          "invalidLdJsonCount": 0
        },
        "recommendations": [
          {
            "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."
          }
        ]
      },
      "layoutAdaptation": {
        "score": 30,
        "urgency": "medium",
        "checks": {
          "testedMobile": true,
          "testedTablet": true,
          "horizontalOverflowOnMobile": false,
          "horizontalOverflowOnTablet": false,
          "mobileSmallTapTargets": 65,
          "tabletSmallTapTargets": 65,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 65,
            "oversizedMedia": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 65,
            "oversizedMedia": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 65 small targets on mobile and 65 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 59,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": true,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": true,
          "externalScriptCount": 8,
          "externalScriptsWithoutIntegrity": 8,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "cache-control": "max-age=300, public",
            "content-encoding": "gzip",
            "content-language": "en",
            "content-length": "11788",
            "content-type": "text/html; charset=UTF-8",
            "date": "Mon, 13 Apr 2026 22:57:04 GMT",
            "etag": "\"1776121023-gzip\"",
            "expires": "Sun, 19 Nov 1978 05:00:00 GMT",
            "last-modified": "Mon, 13 Apr 2026 22:57:03 GMT",
            "server": "nginx",
            "vary": "Cookie,Accept-Encoding",
            "via": "1.1 ca2190123e61f1744d1210c24c87c840.cloudfront.net (CloudFront)",
            "x-amz-cf-id": "Gp3RAQgtmxSLtKcW6yVK37zMlAIP4WnwAiGsVIYw-_D_yPMgMGImkg==",
            "x-amz-cf-pop": "IAD12-P5",
            "x-cache": "Miss from cloudfront",
            "x-content-type-options": "nosniff",
            "x-frame-options": "SAMEORIGIN",
            "x-generator": "Drupal 10 (https://www.drupal.org)"
          },
          "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": "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": "8 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 25,
        "urgency": "low",
        "origin": "https://www.barcelona.cat",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://www.barcelona.cat/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/sitemap.xml",
            "found": true,
            "status": 200,
            "contentType": "application/xml; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/manifest.webmanifest",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/favicon.ico",
            "found": true,
            "status": 200,
            "contentType": "image/x-icon"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "low",
            "detail": "Missing beneficial file(s): /.well-known/security.txt, /manifest.webmanifest."
          }
        ]
      },
      "mediaHints": {
        "score": 50,
        "urgency": "medium",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 21,
          "imagesWithLazy": 0,
          "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 21 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 85,
        "urgency": "medium",
        "data": {
          "hasPrintStyles": true,
          "hasReducedMotion": true,
          "media": {
            "totalImages": 26,
            "lazyImages": 1,
            "totalIframes": 1,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "\"Source Sans Pro\", \"Helvetica Neue\", Helvetica, Arial, sans-serif",
            "usesSystemFont": true
          },
          "tracking": {
            "count": 0,
            "scripts": []
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 1/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": "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"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 20,
        "urgency": "low",
        "totalEstimatedSavingsBytes": 171803.75,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Use modern image compression formats",
            "urgency": "medium",
            "estimatedSavingsBytes": 96924.75,
            "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size."
          },
          {
            "id": "uses-optimized-images",
            "title": "Improve image encoding quality/size",
            "urgency": "medium",
            "estimatedSavingsBytes": 74879,
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings."
          }
        ],
        "recommendations": [
          {
            "title": "Use modern image compression formats",
            "urgency": "medium",
            "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size. Estimated savings: 94.65 KB."
          },
          {
            "title": "Improve image encoding quality/size",
            "urgency": "medium",
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 73.12 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": 416081.75,
        "totalEstimatedBlockingMs": 1598,
        "opportunities": [
          {
            "id": "render-blocking-resources",
            "title": "Eliminate render-blocking resources",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering.",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1598,
            "displayValue": "Est savings of 1,600 ms",
            "urgency": "high",
            "sourceAuditId": "render-blocking-resources"
          },
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 119876,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 117 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": 96924.75,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 95 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": 91921,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 90 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-css-rules"
          },
          {
            "id": "uses-optimized-images",
            "title": "Compress oversized image assets",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss.",
            "estimatedSavingsBytes": 74879,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 73 KiB",
            "urgency": "medium",
            "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": 32481,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 32 KiB",
            "urgency": "low",
            "sourceAuditId": "unused-javascript"
          }
        ],
        "recommendations": [
          {
            "title": "Eliminate render-blocking resources",
            "urgency": "high",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering. Estimated render unblocking: 1598 ms."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "medium",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 117.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: 94.65 KB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "medium",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 89.77 KB."
          },
          {
            "title": "Compress oversized image assets",
            "urgency": "medium",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 73.12 KB."
          },
          {
            "title": "Remove unused JavaScript",
            "urgency": "low",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 31.72 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": 10,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 8,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "8 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": 199794.5168179702
        },
        "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: 195.11 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: 195.11 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": "medium",
        "transferBytes": 860969,
        "css": {
          "unusedBytes": 91921,
          "ratio": 0.10676458734286601,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 32481,
          "duplicatedBytes": 0,
          "ratio": 0.037726096990716274,
          "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": "high",
            "estimatedSavingsBytes": 91921,
            "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": "medium",
            "estimatedSavingsBytes": 32481,
            "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": 23,
        "urgency": "high",
        "transferBytes": 860969,
        "estimatedDeferrableBytes": 244278,
        "renderBlockingMs": 1598,
        "breakdown": {
          "offscreenImageSavings": 119876,
          "unusedJavascriptSavings": 32481,
          "unusedCssSavings": 91921
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 119876,
            "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": "medium",
            "estimatedSavingsBytes": 32481,
            "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": "high",
            "estimatedSavingsBytes": 91921,
            "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": "Eliminate render-blocking resources",
            "area": "render-path",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1598,
            "strategy": "Defer scripts/styles not required for first paint and preload only truly critical assets.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-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 www.barcelona.cat",
            "area": "font",
            "urgency": "medium",
            "estimatedSavingsBytes": 90560,
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "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 www.barcelona.cat",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 84137,
            "url": "https://www.barcelona.cat/themes/barcelonacat_theme/images/menu/viula.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 cdn.matomo.cloud",
            "area": "script",
            "urgency": "medium",
            "estimatedSavingsBytes": 76425,
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.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": 65,
        "urgency": "high",
        "providerCount": 8,
        "requestCount": 9,
        "transferBytes": 155331,
        "notGreenCount": 5,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76425,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "cdnjs.cloudflare.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15871,
            "sampleUrl": "https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js",
            "greenCheck": {
              "hostname": "cdnjs.cloudflare.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:34",
              "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/cdnjs.cloudflare.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15565,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7148,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=8l5Loq&url=https%3A%2F%2Fwww.barcelona.cat%2Fen%2Fwhat-to-do-in-bcn%2Fculture%2Ftheatres",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "high",
            "detail": "Track 8 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."
          },
          {
            "title": "Prioritize greener alternatives for third-party providers",
            "urgency": "high",
            "detail": "5 third-party script origin(s) are not confirmed green in the Green Web Foundation dataset."
          }
        ]
      },
      "redundancy": {
        "score": 18,
        "urgency": "low",
        "transferBytes": 860969,
        "estimatedRedundantBytes": 124402,
        "redundancyRatio": 0.14449068433358228,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 91921,
            "displayValue": "Est savings of 90 KiB"
          },
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 32481,
            "displayValue": "Est savings of 32 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 91921,
            "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 unused javascript",
            "urgency": "medium",
            "estimatedSavingsBytes": 32481,
            "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 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": 20,
        "urgency": "medium",
        "totalTransferBytes": 860969,
        "heavyRequestCount": 4,
        "heavyBytes": 270999,
        "heavyRatio": 0.31476046175878575,
        "heavyRequests": [
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "transferSize": 90560,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "transferSize": 76425,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "cdn.matomo.cloud"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament/fonts/icoajuntament.ttf?8aaig7",
            "transferSize": 54920,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/css/css_evpTRQTawGYS1Ro7RbXq3hBxwat7AU-RJm1V8ZgzeaE.css?delta=5&language=en&theme=barcelonacat_theme&include=eJyFztEOwiAMheEXgnDhA5EDq4gySmiZ7u1dYuJinPGqTf_voriOqpipqseShcW9hkXLBntMI8NNUGo53qh_JzpjFBUT0CMVrohQzwv1nicSt8lhlbls_ZdpSGSXTPdPoBeayQVmFe1oPk71CKTCAcWKriXXdCRyZLv_fSSEx3bzgir-9A-0zibE6jfW4d6bp4dSryhGVlGaXYDQE_H9jbg&tcut5n",
            "transferSize": 49094,
            "resourceType": "stylesheet",
            "mimeType": "text/css",
            "domain": "www.barcelona.cat"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "font",
            "count": 2,
            "transferBytes": 145480
          },
          {
            "resourceType": "script",
            "count": 1,
            "transferBytes": 76425
          },
          {
            "resourceType": "stylesheet",
            "count": 1,
            "transferBytes": 49094
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.barcelona.cat",
            "count": 3,
            "transferBytes": 194574
          },
          {
            "domain": "cdn.matomo.cloud",
            "count": 1,
            "transferBytes": 76425
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Lazy-load offscreen images and media galleries",
            "urgency": "medium",
            "estimatedSavingsBytes": 119876,
            "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": "Defer non-critical UI modules until after first render",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "strategy": "Keep only above-the-fold resources in the initial path; hydrate or import secondary modules later.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 www.barcelona.cat",
            "urgency": "medium",
            "estimatedSavingsBytes": 90560,
            "strategy": "Subset or defer this font so full font payloads are only fetched when needed.",
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 cdn.matomo.cloud",
            "urgency": "medium",
            "estimatedSavingsBytes": 76425,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.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.09,
          "displayValue": "6.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: 6.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-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,
          "displayValue": "Est savings of 90 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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 90 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,
          "displayValue": "Est savings of 95 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 95 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 73 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 73 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,
          "displayValue": "Est savings of 117 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 117 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": "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": 0,
          "displayValue": "Est savings of 1,600 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 Eliminate render-blocking resources\n\n- Lighthouse audit: render-blocking-resources\n- Current value: Est savings of 1,600 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\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": "server-response-time",
          "title": "Reduce initial server response time",
          "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": 0,
          "displayValue": "Root document took 870 ms",
          "impact": "high",
          "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 Reduce initial server response time\n\n- Lighthouse audit: server-response-time\n- Current value: Root document took 870 ms\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": "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": 0.81,
          "displayValue": "4.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 Speed Index\n\n- Lighthouse audit: speed-index\n- Current value: 4.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\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": 0.5,
          "displayValue": "Est savings of 32 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 32 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": "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": "1,055 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: 1,055 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://barcelona.cat/ca/que-pots-fer-a-bcn/cultura/auditoris",
      "status": "ok",
      "finalUrl": "https://www.barcelona.cat/ca/que-pots-fer-a-bcn/cultura/auditoris",
      "performanceScore": 0.66,
      "bestPracticesScore": 1,
      "transferBytes": 845667,
      "co2Grams": 0.3239592982938,
      "greenWeb": {
        "page": {
          "hostname": "www.barcelona.cat",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-13T22:38:00.231825",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.barcelona.cat",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76425,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "stylesheet",
            "requestCount": 1,
            "transferBytes": 24654,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "cdnjs.cloudflare.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15869,
            "sampleUrl": "https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js",
            "greenCheck": {
              "hostname": "cdnjs.cloudflare.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:34",
              "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/cdnjs.cloudflare.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15566,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7154,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 4110,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/css/bcn-avisos.css",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "fonts.googleapis.com",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 2484,
            "sampleUrl": "https://fonts.googleapis.com/css?family=Source+Sans+3:200,200i,300,300i,400,400i,500,500i,600,600i,700,700i,900,900i",
            "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
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=cCe8HT&url=https%3A%2F%2Fwww.barcelona.cat%2Fca%2Fque-pots-fer-a-bcn%2Fcultura%2Fauditoris",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 11,
          "greenCount": 5,
          "notGreenCount": 7,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 75,
        "urgency": "high",
        "pageElementOccurrences": 5,
        "uniqueElementsAssessed": 2,
        "reusedFromCacheCount": 2,
        "components": [
          {
            "signature": "form|get|/ca|input|text|query|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "text",
            "fieldName": "query",
            "formContext": "form|get|/ca",
            "hasLabel": true,
            "hasValidationRule": false,
            "hasErrorMessagingHook": false,
            "toolingFriendly": false,
            "assessment": {
              "score": 60,
              "urgency": "high",
              "issues": [
                "No explicit validation rule",
                "No error messaging hook",
                "Missing autocomplete for tooling support"
              ],
              "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.",
                "Provide meaningful autocomplete values to support browsers and assistive tooling."
              ]
            },
            "reusedFromCache": true
          },
          {
            "signature": "no-form|select|select|anonymous|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "select",
            "fieldName": null,
            "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": "No explicit validation rule",
            "urgency": "medium",
            "detail": "2 unique form control signature(s) on this page include this issue."
          },
          {
            "title": "No error messaging hook",
            "urgency": "medium",
            "detail": "2 unique form control signature(s) on this page include this issue."
          },
          {
            "title": "Missing autocomplete for tooling support",
            "urgency": "medium",
            "detail": "1 unique form control signature(s) on this page include this issue."
          },
          {
            "title": "Missing associated label",
            "urgency": "high",
            "detail": "1 unique form control signature(s) on this page include this issue."
          }
        ]
      },
      "metadata": {
        "score": 25,
        "urgency": "low",
        "checks": {
          "hasTitle": true,
          "hasLang": true,
          "hasDescription": false,
          "hasCanonical": true,
          "hasOpenGraphCore": false,
          "hasTwitterCard": true,
          "hasViewport": true,
          "hasCharset": true,
          "hasValidStructuredData": true,
          "hasInvalidStructuredData": false
        },
        "observed": {
          "title": "Auditoris | Barcelona.cat | Ajuntament de Barcelona",
          "lang": "ca",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "",
          "robots": "",
          "canonical": "https://www.barcelona.cat/ca/que-pots-fer-a-bcn/cultura/auditoris",
          "ogTitle": "Auditoris",
          "ogDescription": "",
          "ogType": "Web",
          "ogUrl": "https://www.barcelona.cat/ca/que-pots-fer-a-bcn/cultura/auditoris",
          "twitterCard": "summary_large_image",
          "ldJsonCount": 0,
          "validLdJsonCount": 0,
          "invalidLdJsonCount": 0
        },
        "recommendations": [
          {
            "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."
          }
        ]
      },
      "layoutAdaptation": {
        "score": 30,
        "urgency": "medium",
        "checks": {
          "testedMobile": true,
          "testedTablet": true,
          "horizontalOverflowOnMobile": false,
          "horizontalOverflowOnTablet": false,
          "mobileSmallTapTargets": 60,
          "tabletSmallTapTargets": 62,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 60,
            "oversizedMedia": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 62,
            "oversizedMedia": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 60 small targets on mobile and 62 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 59,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": true,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": true,
          "externalScriptCount": 8,
          "externalScriptsWithoutIntegrity": 8,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "cache-control": "max-age=300, public",
            "content-encoding": "gzip",
            "content-language": "ca",
            "content-length": "11693",
            "content-type": "text/html; charset=UTF-8",
            "date": "Mon, 13 Apr 2026 22:57:18 GMT",
            "etag": "\"1776121037-gzip\"",
            "expires": "Sun, 19 Nov 1978 05:00:00 GMT",
            "last-modified": "Mon, 13 Apr 2026 22:57:17 GMT",
            "server": "nginx",
            "vary": "Cookie,Accept-Encoding",
            "via": "1.1 ca2190123e61f1744d1210c24c87c840.cloudfront.net (CloudFront)",
            "x-amz-cf-id": "S52b3-uuNnvNR6GA94y-bY5kl03p4YPkoUXE1y9h6HgfrYHgrJ4S5w==",
            "x-amz-cf-pop": "IAD12-P5",
            "x-cache": "Miss from cloudfront",
            "x-content-type-options": "nosniff",
            "x-frame-options": "SAMEORIGIN",
            "x-generator": "Drupal 10 (https://www.drupal.org)"
          },
          "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": "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": "8 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 25,
        "urgency": "low",
        "origin": "https://www.barcelona.cat",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://www.barcelona.cat/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/sitemap.xml",
            "found": true,
            "status": 200,
            "contentType": "application/xml; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/manifest.webmanifest",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/favicon.ico",
            "found": true,
            "status": 200,
            "contentType": "image/x-icon"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "low",
            "detail": "Missing beneficial file(s): /.well-known/security.txt, /manifest.webmanifest."
          }
        ]
      },
      "mediaHints": {
        "score": 50,
        "urgency": "medium",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 21,
          "imagesWithLazy": 0,
          "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 21 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 85,
        "urgency": "medium",
        "data": {
          "hasPrintStyles": true,
          "hasReducedMotion": true,
          "media": {
            "totalImages": 26,
            "lazyImages": 1,
            "totalIframes": 1,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "\"Source Sans Pro\", \"Helvetica Neue\", Helvetica, Arial, sans-serif",
            "usesSystemFont": true
          },
          "tracking": {
            "count": 0,
            "scripts": []
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 1/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": "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"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 15,
        "urgency": "low",
        "totalEstimatedSavingsBytes": 130442.55,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Use modern image compression formats",
            "urgency": "medium",
            "estimatedSavingsBytes": 72410.55,
            "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size."
          },
          {
            "id": "uses-optimized-images",
            "title": "Improve image encoding quality/size",
            "urgency": "medium",
            "estimatedSavingsBytes": 58032,
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings."
          }
        ],
        "recommendations": [
          {
            "title": "Use modern image compression formats",
            "urgency": "medium",
            "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size. Estimated savings: 70.71 KB."
          },
          {
            "title": "Improve image encoding quality/size",
            "urgency": "medium",
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 56.67 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": 341950.55,
        "totalEstimatedBlockingMs": 2093,
        "opportunities": [
          {
            "id": "render-blocking-resources",
            "title": "Eliminate render-blocking resources",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering.",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 2093,
            "displayValue": "Est savings of 2,090 ms",
            "urgency": "high",
            "sourceAuditId": "render-blocking-resources"
          },
          {
            "id": "unused-css-rules",
            "title": "Remove unused CSS",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped.",
            "estimatedSavingsBytes": 91918,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 90 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-css-rules"
          },
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 87109,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 85 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": 72410.55,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 71 KiB",
            "urgency": "medium",
            "sourceAuditId": "modern-image-formats"
          },
          {
            "id": "uses-optimized-images",
            "title": "Compress oversized image assets",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss.",
            "estimatedSavingsBytes": 58032,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 57 KiB",
            "urgency": "medium",
            "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": 32481,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 32 KiB",
            "urgency": "low",
            "sourceAuditId": "unused-javascript"
          }
        ],
        "recommendations": [
          {
            "title": "Eliminate render-blocking resources",
            "urgency": "high",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering. Estimated render unblocking: 2093 ms."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "medium",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 89.76 KB."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "medium",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 85.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: 70.71 KB."
          },
          {
            "title": "Compress oversized image assets",
            "urgency": "medium",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 56.67 KB."
          },
          {
            "title": "Remove unused JavaScript",
            "urgency": "low",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 31.72 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": 10,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 8,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "8 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": 167999.65848463686
        },
        "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: 164.06 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: 164.06 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": "medium",
        "transferBytes": 845667,
        "css": {
          "unusedBytes": 91918,
          "ratio": 0.1086929015794633,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 32481,
          "duplicatedBytes": 0,
          "ratio": 0.03840873535327735,
          "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": "high",
            "estimatedSavingsBytes": 91918,
            "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": "medium",
            "estimatedSavingsBytes": 32481,
            "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": 845667,
        "estimatedDeferrableBytes": 211508,
        "renderBlockingMs": 2093,
        "breakdown": {
          "offscreenImageSavings": 87109,
          "unusedJavascriptSavings": 32481,
          "unusedCssSavings": 91918
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 87109,
            "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": "medium",
            "estimatedSavingsBytes": 32481,
            "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": "high",
            "estimatedSavingsBytes": 91918,
            "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": "Eliminate render-blocking resources",
            "area": "render-path",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 2093,
            "strategy": "Defer scripts/styles not required for first paint and preload only truly critical assets.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-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 www.barcelona.cat",
            "area": "font",
            "urgency": "medium",
            "estimatedSavingsBytes": 90560,
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "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 www.barcelona.cat",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 84136,
            "url": "https://www.barcelona.cat/themes/barcelonacat_theme/images/menu/viula.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 cdn.matomo.cloud",
            "area": "script",
            "urgency": "medium",
            "estimatedSavingsBytes": 76425,
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.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": 65,
        "urgency": "high",
        "providerCount": 8,
        "requestCount": 9,
        "transferBytes": 155336,
        "notGreenCount": 5,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76425,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "cdnjs.cloudflare.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15869,
            "sampleUrl": "https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js",
            "greenCheck": {
              "hostname": "cdnjs.cloudflare.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:34",
              "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/cdnjs.cloudflare.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15566,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7154,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=cCe8HT&url=https%3A%2F%2Fwww.barcelona.cat%2Fca%2Fque-pots-fer-a-bcn%2Fcultura%2Fauditoris",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "high",
            "detail": "Track 8 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."
          },
          {
            "title": "Prioritize greener alternatives for third-party providers",
            "urgency": "high",
            "detail": "5 third-party script origin(s) are not confirmed green in the Green Web Foundation dataset."
          }
        ]
      },
      "redundancy": {
        "score": 18,
        "urgency": "low",
        "transferBytes": 845667,
        "estimatedRedundantBytes": 124399,
        "redundancyRatio": 0.14710163693274067,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 91918,
            "displayValue": "Est savings of 90 KiB"
          },
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 32481,
            "displayValue": "Est savings of 32 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 91918,
            "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 unused javascript",
            "urgency": "medium",
            "estimatedSavingsBytes": 32481,
            "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 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": 20,
        "urgency": "medium",
        "totalTransferBytes": 845667,
        "heavyRequestCount": 4,
        "heavyBytes": 271000,
        "heavyRatio": 0.3204571066389016,
        "heavyRequests": [
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "transferSize": 90560,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "transferSize": 76425,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "cdn.matomo.cloud"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament/fonts/icoajuntament.ttf?8aaig7",
            "transferSize": 54920,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/css/css_evpTRQTawGYS1Ro7RbXq3hBxwat7AU-RJm1V8ZgzeaE.css?delta=5&language=ca&theme=barcelonacat_theme&include=eJyFztEOwiAMheEXgnDhA5EDq4gySmiZ7u1dYuJinPGqTf_voriOqpipqseShcW9hkXLBntMI8NNUGo53qh_JzpjFBUT0CMVrohQzwv1nicSt8lhlbls_ZdpSGSXTPdPoBeayQVmFe1oPk71CKTCAcWKriXXdCRyZLv_fSSEx3bzgir-9A-0zibE6jfW4d6bp4dSryhGVlGaXYDQE_H9jbg&tcut5n",
            "transferSize": 49095,
            "resourceType": "stylesheet",
            "mimeType": "text/css",
            "domain": "www.barcelona.cat"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "font",
            "count": 2,
            "transferBytes": 145480
          },
          {
            "resourceType": "script",
            "count": 1,
            "transferBytes": 76425
          },
          {
            "resourceType": "stylesheet",
            "count": 1,
            "transferBytes": 49095
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.barcelona.cat",
            "count": 3,
            "transferBytes": 194575
          },
          {
            "domain": "cdn.matomo.cloud",
            "count": 1,
            "transferBytes": 76425
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Lazy-load offscreen images and media galleries",
            "urgency": "medium",
            "estimatedSavingsBytes": 87109,
            "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": "Defer non-critical UI modules until after first render",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "strategy": "Keep only above-the-fold resources in the initial path; hydrate or import secondary modules later.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 www.barcelona.cat",
            "urgency": "medium",
            "estimatedSavingsBytes": 90560,
            "strategy": "Subset or defer this font so full font payloads are only fetched when needed.",
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 cdn.matomo.cloud",
            "urgency": "medium",
            "estimatedSavingsBytes": 76425,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.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.09,
          "displayValue": "6.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: 6.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-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,
          "displayValue": "Est savings of 90 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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 90 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,
          "displayValue": "Est savings of 71 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 71 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 57 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 57 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,
          "displayValue": "Est savings of 85 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 85 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": "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": 0,
          "displayValue": "Est savings of 2,090 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 Eliminate render-blocking resources\n\n- Lighthouse audit: render-blocking-resources\n- Current value: Est savings of 2,090 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\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": "server-response-time",
          "title": "Reduce initial server response time",
          "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": 0,
          "displayValue": "Root document took 900 ms",
          "impact": "high",
          "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 Reduce initial server response time\n\n- Lighthouse audit: server-response-time\n- Current value: Root document took 900 ms\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": "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": 0.75,
          "displayValue": "4.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 Speed Index\n\n- Lighthouse audit: speed-index\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\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": 0.5,
          "displayValue": "Est savings of 32 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 32 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": "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": "1,084 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: 1,084 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://barcelona.cat/en/what-to-do-in-bcn/bathing-and-beaches/sports-activities-organised-federated-athletes-entities",
      "status": "ok",
      "finalUrl": "https://www.barcelona.cat/en/what-to-do-in-bcn/bathing-and-beaches/sports-activities-organised-federated-athletes-entities",
      "performanceScore": 0.65,
      "bestPracticesScore": 1,
      "transferBytes": 1028360,
      "co2Grams": 0.3939455885040001,
      "greenWeb": {
        "page": {
          "hostname": "www.barcelona.cat",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-13T22:38:00.231825",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.barcelona.cat",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76424,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "stylesheet",
            "requestCount": 1,
            "transferBytes": 24654,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15565,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7155,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5656,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 4110,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/css/bcn-avisos.css",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "fonts.googleapis.com",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 2483,
            "sampleUrl": "https://fonts.googleapis.com/css?family=Source+Sans+3:200,200i,300,300i,400,400i,500,500i,600,600i,700,700i,900,900i",
            "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
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=uRVbxP&url=https%3A%2F%2Fwww.barcelona.cat%2Fen%2Fwhat-to-do-in-bcn%2Fbathing-and-beaches%2Fsports-activities-organised-federated-athletes-entities",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 10,
          "greenCount": 4,
          "notGreenCount": 7,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 60,
        "urgency": "high",
        "pageElementOccurrences": 1,
        "uniqueElementsAssessed": 1,
        "reusedFromCacheCount": 1,
        "components": [
          {
            "signature": "form|get|/en|input|text|query|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "text",
            "fieldName": "query",
            "formContext": "form|get|/en",
            "hasLabel": true,
            "hasValidationRule": false,
            "hasErrorMessagingHook": false,
            "toolingFriendly": false,
            "assessment": {
              "score": 60,
              "urgency": "high",
              "issues": [
                "No explicit validation rule",
                "No error messaging hook",
                "Missing autocomplete for tooling support"
              ],
              "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.",
                "Provide meaningful autocomplete values to support browsers and assistive tooling."
              ]
            },
            "reusedFromCache": true
          }
        ],
        "recommendations": [
          {
            "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."
          },
          {
            "title": "Missing autocomplete for tooling support",
            "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": "Non-profit organised sports activities | Barcelona website | Barcelona City Council",
          "lang": "en",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "Sports activities organised by federated sportspeople or organisations on the register of federations or organisers’ census.",
          "robots": "",
          "canonical": "https://www.barcelona.cat/en/what-to-do-in-bcn/bathing-and-beaches/sports-activities-organised-federated-athletes-entities",
          "ogTitle": "Non-profit organised sports activities | Barcelona website | Barcelona City Council",
          "ogDescription": "Sports activities organised by federated sportspeople or organisations on the register of federations or organisers’ census.",
          "ogType": "Web",
          "ogUrl": "https://www.barcelona.cat/en/what-to-do-in-bcn/bathing-and-beaches/sports-activities-organised-federated-athletes-entities",
          "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": 34,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 36,
            "oversizedMedia": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 34,
            "oversizedMedia": 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 34 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 59,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": true,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": true,
          "externalScriptCount": 7,
          "externalScriptsWithoutIntegrity": 7,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "cache-control": "max-age=300, public",
            "content-encoding": "gzip",
            "content-language": "en",
            "content-length": "10344",
            "content-type": "text/html; charset=UTF-8",
            "date": "Mon, 13 Apr 2026 22:57:32 GMT",
            "etag": "\"1776121051-gzip\"",
            "expires": "Sun, 19 Nov 1978 05:00:00 GMT",
            "last-modified": "Mon, 13 Apr 2026 22:57:31 GMT",
            "server": "nginx",
            "vary": "Cookie,Accept-Encoding",
            "via": "1.1 ca2190123e61f1744d1210c24c87c840.cloudfront.net (CloudFront)",
            "x-amz-cf-id": "gCAmty6mKNv1Zeqd6y46Diec_NL264Ca8qEqyK2djIi6DUCpE0L0Tg==",
            "x-amz-cf-pop": "IAD12-P5",
            "x-cache": "Miss from cloudfront",
            "x-content-type-options": "nosniff",
            "x-frame-options": "SAMEORIGIN",
            "x-generator": "Drupal 10 (https://www.drupal.org)"
          },
          "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": "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": "7 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 25,
        "urgency": "low",
        "origin": "https://www.barcelona.cat",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://www.barcelona.cat/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/sitemap.xml",
            "found": true,
            "status": 200,
            "contentType": "application/xml; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/manifest.webmanifest",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/favicon.ico",
            "found": true,
            "status": 200,
            "contentType": "image/x-icon"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "low",
            "detail": "Missing beneficial file(s): /.well-known/security.txt, /manifest.webmanifest."
          }
        ]
      },
      "mediaHints": {
        "score": 45,
        "urgency": "medium",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 12,
          "imagesWithLazy": 1,
          "imagesWithoutLazy": 11
        },
        "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": "11 of 12 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 85,
        "urgency": "medium",
        "data": {
          "hasPrintStyles": true,
          "hasReducedMotion": true,
          "media": {
            "totalImages": 17,
            "lazyImages": 2,
            "totalIframes": 1,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "\"Source Sans Pro\", \"Helvetica Neue\", Helvetica, Arial, sans-serif",
            "usesSystemFont": true
          },
          "tracking": {
            "count": 0,
            "scripts": []
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 2/17 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": "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"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 52,
        "urgency": "medium",
        "totalEstimatedSavingsBytes": 531361.75,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Use modern image compression formats",
            "urgency": "high",
            "estimatedSavingsBytes": 296882.75,
            "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": 234479,
            "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: 289.92 KB."
          },
          {
            "title": "Improve image encoding quality/size",
            "urgency": "high",
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 228.98 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": 762994.75,
        "totalEstimatedBlockingMs": 1485,
        "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": 296882.75,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 290 KiB",
            "urgency": "high",
            "sourceAuditId": "modern-image-formats"
          },
          {
            "id": "uses-optimized-images",
            "title": "Compress oversized image assets",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss.",
            "estimatedSavingsBytes": 234479,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 229 KiB",
            "urgency": "high",
            "sourceAuditId": "uses-optimized-images"
          },
          {
            "id": "render-blocking-resources",
            "title": "Eliminate render-blocking resources",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering.",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1485,
            "displayValue": "Est savings of 1,490 ms",
            "urgency": "high",
            "sourceAuditId": "render-blocking-resources"
          },
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 87109,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 85 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": 81406,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 79 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-css-rules"
          },
          {
            "id": "unused-javascript",
            "title": "Remove unused JavaScript",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code.",
            "estimatedSavingsBytes": 32481,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 32 KiB",
            "urgency": "low",
            "sourceAuditId": "unused-javascript"
          },
          {
            "id": "uses-responsive-images",
            "title": "Right-size images for viewport",
            "detail": "Avoid sending larger images than the rendered size needs.",
            "estimatedSavingsBytes": 30637,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 30 KiB",
            "urgency": "low",
            "sourceAuditId": "uses-responsive-images"
          }
        ],
        "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: 289.92 KB."
          },
          {
            "title": "Compress oversized image assets",
            "urgency": "high",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 228.98 KB."
          },
          {
            "title": "Eliminate render-blocking resources",
            "urgency": "high",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering. Estimated render unblocking: 1485 ms."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "medium",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 85.07 KB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "medium",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 79.50 KB."
          },
          {
            "title": "Remove unused JavaScript",
            "urgency": "low",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 31.72 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": 10,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 7,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "7 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": 168003.59001396646
        },
        "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: 164.07 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: 164.07 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": "medium",
        "transferBytes": 1028360,
        "css": {
          "unusedBytes": 81406,
          "ratio": 0.07916099420436423,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 32481,
          "duplicatedBytes": 0,
          "ratio": 0.03158524252207398,
          "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": "high",
            "estimatedSavingsBytes": 81406,
            "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": "medium",
            "estimatedSavingsBytes": 32481,
            "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": 20,
        "urgency": "high",
        "transferBytes": 1028360,
        "estimatedDeferrableBytes": 200996,
        "renderBlockingMs": 1485,
        "breakdown": {
          "offscreenImageSavings": 87109,
          "unusedJavascriptSavings": 32481,
          "unusedCssSavings": 81406
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 87109,
            "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": "medium",
            "estimatedSavingsBytes": 32481,
            "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": 81406,
            "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": "Eliminate render-blocking resources",
            "area": "render-path",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1485,
            "strategy": "Defer scripts/styles not required for first paint and preload only truly critical assets.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-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 www.barcelona.cat",
            "area": "image",
            "urgency": "high",
            "estimatedSavingsBytes": 271591,
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_medium/public/Activitats%20Esportives%20organitzades_1.jpg?itok=prm01wLD",
            "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 www.barcelona.cat",
            "area": "font",
            "urgency": "medium",
            "estimatedSavingsBytes": 90560,
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "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 cdn.matomo.cloud",
            "area": "script",
            "urgency": "medium",
            "estimatedSavingsBytes": 76424,
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.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": 64,
        "urgency": "high",
        "providerCount": 7,
        "requestCount": 8,
        "transferBytes": 139676,
        "notGreenCount": 5,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76424,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15565,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7155,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5656,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=uRVbxP&url=https%3A%2F%2Fwww.barcelona.cat%2Fen%2Fwhat-to-do-in-bcn%2Fbathing-and-beaches%2Fsports-activities-organised-federated-athletes-entities",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "high",
            "detail": "Track 7 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."
          },
          {
            "title": "Prioritize greener alternatives for third-party providers",
            "urgency": "high",
            "detail": "5 third-party script origin(s) are not confirmed green in the Green Web Foundation dataset."
          }
        ]
      },
      "redundancy": {
        "score": 16,
        "urgency": "low",
        "transferBytes": 1028360,
        "estimatedRedundantBytes": 113887,
        "redundancyRatio": 0.11074623672643821,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 81406,
            "displayValue": "Est savings of 79 KiB"
          },
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 32481,
            "displayValue": "Est savings of 32 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 81406,
            "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 unused javascript",
            "urgency": "medium",
            "estimatedSavingsBytes": 32481,
            "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 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": 28,
        "urgency": "medium",
        "totalTransferBytes": 1028360,
        "heavyRequestCount": 5,
        "heavyBytes": 542598,
        "heavyRatio": 0.5276342914932514,
        "heavyRequests": [
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_medium/public/Activitats%20Esportives%20organitzades_1.jpg?itok=prm01wLD",
            "transferSize": 271591,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "transferSize": 90560,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "transferSize": 76424,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "cdn.matomo.cloud"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament/fonts/icoajuntament.ttf?8aaig7",
            "transferSize": 54918,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/css/css_evpTRQTawGYS1Ro7RbXq3hBxwat7AU-RJm1V8ZgzeaE.css?delta=5&language=en&theme=barcelonacat_theme&include=eJyFzsGKwzAMBNAfiuvDfpAZOyJxcSQjydn272sodFnIsieJmXcY3Ac7DmJPOKuJxfcJ6HXJ0EJNGAWe5CTVupLFqUdwkTb7v0zHRuGs9P0b-E4HxSzi5oqeyspXYGuS0YL5s1XerkQtEvDZfiVMxsySgS19_Qe6ypILp8kU8fMlejgpoy0dim0u3i2uOjra7Se5De4jt2o7rYs9zemIGUYvwgyJSg&tcut5n",
            "transferSize": 49105,
            "resourceType": "stylesheet",
            "mimeType": "text/css",
            "domain": "www.barcelona.cat"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "image",
            "count": 1,
            "transferBytes": 271591
          },
          {
            "resourceType": "font",
            "count": 2,
            "transferBytes": 145478
          },
          {
            "resourceType": "script",
            "count": 1,
            "transferBytes": 76424
          },
          {
            "resourceType": "stylesheet",
            "count": 1,
            "transferBytes": 49105
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.barcelona.cat",
            "count": 4,
            "transferBytes": 466174
          },
          {
            "domain": "cdn.matomo.cloud",
            "count": 1,
            "transferBytes": 76424
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Lazy-load offscreen images and media galleries",
            "urgency": "medium",
            "estimatedSavingsBytes": 87109,
            "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": "Defer non-critical UI modules until after first render",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "strategy": "Keep only above-the-fold resources in the initial path; hydrate or import secondary modules later.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 www.barcelona.cat",
            "urgency": "high",
            "estimatedSavingsBytes": 271591,
            "strategy": "Serve a smaller placeholder first and load this asset only when the user scrolls to or requests the component.",
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_medium/public/Activitats%20Esportives%20organitzades_1.jpg?itok=prm01wLD",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 www.barcelona.cat",
            "urgency": "medium",
            "estimatedSavingsBytes": 90560,
            "strategy": "Subset or defer this font so full font payloads are only fetched when needed.",
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 cdn.matomo.cloud",
            "urgency": "medium",
            "estimatedSavingsBytes": 76424,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.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": "10.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: 10.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 32 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 32 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,
          "displayValue": "Est savings of 79 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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 79 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,
          "displayValue": "Est savings of 290 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 290 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 229 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 229 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,
          "displayValue": "Est savings of 85 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 85 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": "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": 0,
          "displayValue": "Est savings of 1,490 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 Eliminate render-blocking resources\n\n- Lighthouse audit: render-blocking-resources\n- Current value: Est savings of 1,490 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\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": "server-response-time",
          "title": "Reduce initial server response time",
          "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": 0,
          "displayValue": "Root document took 1,140 ms",
          "impact": "high",
          "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 Reduce initial server response time\n\n- Lighthouse audit: server-response-time\n- Current value: Root document took 1,140 ms\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": "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": 0.68,
          "displayValue": "4.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 Speed Index\n\n- Lighthouse audit: speed-index\n- Current value: 4.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\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": "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": "917 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: 917 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://barcelona.cat/es/conocebcn/la-ciutadella-del-conocimiento/noticias",
      "status": "ok",
      "finalUrl": "https://www.barcelona.cat/es/conocebcn/la-ciutadella-del-conocimiento/noticias",
      "performanceScore": 0.68,
      "bestPracticesScore": 1,
      "transferBytes": 1896220,
      "co2Grams": 0.726406612308,
      "greenWeb": {
        "page": {
          "hostname": "www.barcelona.cat",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-13T22:38:00.231825",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.barcelona.cat",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76425,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "stylesheet",
            "requestCount": 1,
            "transferBytes": 24657,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15565,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "www.youtube.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 11090,
            "sampleUrl": "https://www.youtube.com/iframe_api",
            "greenCheck": {
              "hostname": "www.youtube.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2026-01-10T15:09:17",
              "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.youtube.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7145,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 4109,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/css/bcn-avisos.css",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2860,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "fonts.googleapis.com",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 2483,
            "sampleUrl": "https://fonts.googleapis.com/css?family=Source+Sans+3:200,200i,300,300i,400,400i,500,500i,600,600i,700,700i,900,900i",
            "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
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=4CCiPz&url=https%3A%2F%2Fwww.barcelona.cat%2Fes%2Fconocebcn%2Fla-ciutadella-del-conocimiento%2Fnoticias",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 11,
          "greenCount": 5,
          "notGreenCount": 7,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 37.5,
        "urgency": "medium",
        "pageElementOccurrences": 4,
        "uniqueElementsAssessed": 4,
        "reusedFromCacheCount": 4,
        "components": [
          {
            "signature": "form|get|/es/|input|text|query|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "text",
            "fieldName": "query",
            "formContext": "form|get|/es/",
            "hasLabel": true,
            "hasValidationRule": false,
            "hasErrorMessagingHook": false,
            "toolingFriendly": false,
            "assessment": {
              "score": 60,
              "urgency": "high",
              "issues": [
                "No explicit validation rule",
                "No error messaging hook",
                "Missing autocomplete for tooling support"
              ],
              "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.",
                "Provide meaningful autocomplete values to support browsers and assistive tooling."
              ]
            },
            "reusedFromCache": true
          },
          {
            "signature": "region|get|self|input|date|datefrom|off|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "date",
            "fieldName": "datefrom",
            "formContext": "region|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": true
          },
          {
            "signature": "region|get|self|input|date|dateto|off|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "date",
            "fieldName": "dateto",
            "formContext": "region|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": true
          },
          {
            "signature": "region|get|self|select|select|actualitat-nr|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "select",
            "fieldName": "actualitat-nr",
            "formContext": "region|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": true
          }
        ],
        "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": "2 unique form control signature(s) on this page include this issue."
          },
          {
            "title": "Missing autocomplete for tooling support",
            "urgency": "medium",
            "detail": "1 unique form control signature(s) on this page include this issue."
          }
        ]
      },
      "metadata": {
        "score": 25,
        "urgency": "low",
        "checks": {
          "hasTitle": true,
          "hasLang": true,
          "hasDescription": false,
          "hasCanonical": true,
          "hasOpenGraphCore": false,
          "hasTwitterCard": true,
          "hasViewport": true,
          "hasCharset": true,
          "hasValidStructuredData": true,
          "hasInvalidStructuredData": false
        },
        "observed": {
          "title": "Noticias | Barcelona.cat | Ajuntament de Barcelona",
          "lang": "es",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "",
          "robots": "",
          "canonical": "https://www.barcelona.cat/es/conocebcn/la-ciutadella-del-conocimiento/noticias",
          "ogTitle": "Noticias",
          "ogDescription": "",
          "ogType": "Web",
          "ogUrl": "https://www.barcelona.cat/es/conocebcn/la-ciutadella-del-conocimiento/noticias",
          "twitterCard": "summary_large_image",
          "ldJsonCount": 0,
          "validLdJsonCount": 0,
          "invalidLdJsonCount": 0
        },
        "recommendations": [
          {
            "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."
          }
        ]
      },
      "layoutAdaptation": {
        "score": 30,
        "urgency": "medium",
        "checks": {
          "testedMobile": true,
          "testedTablet": true,
          "horizontalOverflowOnMobile": false,
          "horizontalOverflowOnTablet": false,
          "mobileSmallTapTargets": 46,
          "tabletSmallTapTargets": 44,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 46,
            "oversizedMedia": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 44,
            "oversizedMedia": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 46 small targets on mobile and 44 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 59,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": true,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": true,
          "externalScriptCount": 8,
          "externalScriptsWithoutIntegrity": 8,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "cache-control": "max-age=300, public",
            "content-encoding": "gzip",
            "content-language": "es",
            "content-length": "12532",
            "content-type": "text/html; charset=UTF-8",
            "date": "Mon, 13 Apr 2026 22:57:45 GMT",
            "etag": "\"1776121064-gzip\"",
            "expires": "Sun, 19 Nov 1978 05:00:00 GMT",
            "last-modified": "Mon, 13 Apr 2026 22:57:44 GMT",
            "server": "nginx",
            "vary": "Cookie,Accept-Encoding",
            "via": "1.1 ca2190123e61f1744d1210c24c87c840.cloudfront.net (CloudFront)",
            "x-amz-cf-id": "AR70U8H86tdvysKSzw5EpkaGJKWfdhxYmYqpJcQwpiAXWqfsXw51ag==",
            "x-amz-cf-pop": "IAD12-P5",
            "x-cache": "Miss from cloudfront",
            "x-content-type-options": "nosniff",
            "x-frame-options": "SAMEORIGIN",
            "x-generator": "Drupal 10 (https://www.drupal.org)"
          },
          "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": "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": "8 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 25,
        "urgency": "low",
        "origin": "https://www.barcelona.cat",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://www.barcelona.cat/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/sitemap.xml",
            "found": true,
            "status": 200,
            "contentType": "application/xml; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/manifest.webmanifest",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/favicon.ico",
            "found": true,
            "status": 200,
            "contentType": "image/x-icon"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "low",
            "detail": "Missing beneficial file(s): /.well-known/security.txt, /manifest.webmanifest."
          }
        ]
      },
      "mediaHints": {
        "score": 50,
        "urgency": "medium",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 21,
          "imagesWithLazy": 0,
          "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 21 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 85,
        "urgency": "medium",
        "data": {
          "hasPrintStyles": true,
          "hasReducedMotion": true,
          "media": {
            "totalImages": 26,
            "lazyImages": 1,
            "totalIframes": 1,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "\"Source Sans Pro\", \"Helvetica Neue\", Helvetica, Arial, sans-serif",
            "usesSystemFont": true
          },
          "tracking": {
            "count": 0,
            "scripts": []
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 1/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": "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"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 52,
        "urgency": "medium",
        "totalEstimatedSavingsBytes": 994670.6000000001,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Use modern image compression formats",
            "urgency": "high",
            "estimatedSavingsBytes": 905228.6000000001,
            "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size."
          },
          {
            "id": "uses-optimized-images",
            "title": "Improve image encoding quality/size",
            "urgency": "medium",
            "estimatedSavingsBytes": 89442,
            "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: 884.01 KB."
          },
          {
            "title": "Improve image encoding quality/size",
            "urgency": "medium",
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 87.35 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": 2029828.6,
        "totalEstimatedBlockingMs": 1594,
        "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": 905228.6000000001,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 884 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": 834210,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 815 KiB",
            "urgency": "high",
            "sourceAuditId": "uses-responsive-images"
          },
          {
            "id": "render-blocking-resources",
            "title": "Eliminate render-blocking resources",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering.",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1594,
            "displayValue": "Est savings of 1,590 ms",
            "urgency": "high",
            "sourceAuditId": "render-blocking-resources"
          },
          {
            "id": "uses-optimized-images",
            "title": "Compress oversized image assets",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss.",
            "estimatedSavingsBytes": 89442,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 87 KiB",
            "urgency": "medium",
            "sourceAuditId": "uses-optimized-images"
          },
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 87109,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 85 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": 81381,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 79 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-css-rules"
          },
          {
            "id": "unused-javascript",
            "title": "Remove unused JavaScript",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code.",
            "estimatedSavingsBytes": 32458,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 32 KiB",
            "urgency": "low",
            "sourceAuditId": "unused-javascript"
          }
        ],
        "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: 884.01 KB."
          },
          {
            "title": "Right-size images for viewport",
            "urgency": "high",
            "detail": "Avoid sending larger images than the rendered size needs. Estimated byte savings: 814.66 KB."
          },
          {
            "title": "Eliminate render-blocking resources",
            "urgency": "high",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering. Estimated render unblocking: 1594 ms."
          },
          {
            "title": "Compress oversized image assets",
            "urgency": "medium",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 87.35 KB."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "medium",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 85.07 KB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "medium",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 79.47 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": 10,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 8,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "8 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": 1202425.9918179703
        },
        "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.15 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.15 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": 5,
        "urgency": "medium",
        "transferBytes": 1896220,
        "css": {
          "unusedBytes": 81381,
          "ratio": 0.042917488477075445,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 32458,
          "duplicatedBytes": 0,
          "ratio": 0.017117212137832107,
          "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": "high",
            "estimatedSavingsBytes": 81381,
            "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": "medium",
            "estimatedSavingsBytes": 32458,
            "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": 1896220,
        "estimatedDeferrableBytes": 200948,
        "renderBlockingMs": 1594,
        "breakdown": {
          "offscreenImageSavings": 87109,
          "unusedJavascriptSavings": 32458,
          "unusedCssSavings": 81381
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 87109,
            "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": "medium",
            "estimatedSavingsBytes": 32458,
            "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": 81381,
            "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": "Eliminate render-blocking resources",
            "area": "render-path",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1594,
            "strategy": "Defer scripts/styles not required for first paint and preload only truly critical assets.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-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 media-edg.barcelona.cat",
            "area": "image",
            "urgency": "high",
            "estimatedSavingsBytes": 374190,
            "url": "https://media-edg.barcelona.cat/wp-content/uploads/2025/06/06124823/FOTO-Castell-Tres-Dragons-800-x-480-2-570x321.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 font from www.barcelona.cat",
            "area": "font",
            "urgency": "medium",
            "estimatedSavingsBytes": 90559,
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "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": 65,
        "urgency": "high",
        "providerCount": 8,
        "requestCount": 10,
        "transferBytes": 150546,
        "notGreenCount": 5,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76425,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15565,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "www.youtube.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 11090,
            "sampleUrl": "https://www.youtube.com/iframe_api",
            "greenCheck": {
              "hostname": "www.youtube.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2026-01-10T15:09:17",
              "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.youtube.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7145,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2860,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=4CCiPz&url=https%3A%2F%2Fwww.barcelona.cat%2Fes%2Fconocebcn%2Fla-ciutadella-del-conocimiento%2Fnoticias",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "high",
            "detail": "Track 8 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."
          },
          {
            "title": "Prioritize greener alternatives for third-party providers",
            "urgency": "high",
            "detail": "5 third-party script origin(s) are not confirmed green in the Green Web Foundation dataset."
          }
        ]
      },
      "redundancy": {
        "score": 13,
        "urgency": "low",
        "transferBytes": 1896220,
        "estimatedRedundantBytes": 113839,
        "redundancyRatio": 0.06003470061490755,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 81381,
            "displayValue": "Est savings of 79 KiB"
          },
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 32458,
            "displayValue": "Est savings of 32 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 81381,
            "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 unused javascript",
            "urgency": "medium",
            "estimatedSavingsBytes": 32458,
            "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 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": 26,
        "urgency": "medium",
        "totalTransferBytes": 1896220,
        "heavyRequestCount": 6,
        "heavyBytes": 906673,
        "heavyRatio": 0.47814757781270106,
        "heavyRequests": [
          {
            "url": "https://media-edg.barcelona.cat/wp-content/uploads/2025/06/06124823/FOTO-Castell-Tres-Dragons-800-x-480-2-570x321.png",
            "transferSize": 374190,
            "resourceType": "image",
            "mimeType": "image/png",
            "domain": "media-edg.barcelona.cat"
          },
          {
            "url": "https://media-edg.barcelona.cat/wp-content/uploads/2025/03/21143604/El-Zoo-de-Barcelona-estrena-Cuidals-2-570x321.png",
            "transferSize": 261475,
            "resourceType": "image",
            "mimeType": "image/png",
            "domain": "media-edg.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "transferSize": 90559,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "transferSize": 76425,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "cdn.matomo.cloud"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament/fonts/icoajuntament.ttf?8aaig7",
            "transferSize": 54919,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/css/css_evpTRQTawGYS1Ro7RbXq3hBxwat7AU-RJm1V8ZgzeaE.css?delta=5&language=es&theme=barcelonacat_theme&include=eJyFzksKwzAMBNAL2XjRA5mxo6YuimUsOW1u30ChH0jpSsPMWwjXUQ0LVYvINsDFYGGiMwabOnzMa1HR8DwerbiEnomlIsOirNR7mUjDroc3Ed73X6ZhJr8Wun0Du9BCIYmYWkeLeapHYGZJYK-2canzkShZ_Pv3I6Ey9i4qqsbTP9C6uJRr3FlHeKVId6NewU43NVpCgtIDxTWFiw&tcut5n",
            "transferSize": 49105,
            "resourceType": "stylesheet",
            "mimeType": "text/css",
            "domain": "www.barcelona.cat"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "image",
            "count": 2,
            "transferBytes": 635665
          },
          {
            "resourceType": "font",
            "count": 2,
            "transferBytes": 145478
          },
          {
            "resourceType": "script",
            "count": 1,
            "transferBytes": 76425
          },
          {
            "resourceType": "stylesheet",
            "count": 1,
            "transferBytes": 49105
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "media-edg.barcelona.cat",
            "count": 2,
            "transferBytes": 635665
          },
          {
            "domain": "www.barcelona.cat",
            "count": 3,
            "transferBytes": 194583
          },
          {
            "domain": "cdn.matomo.cloud",
            "count": 1,
            "transferBytes": 76425
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Lazy-load offscreen images and media galleries",
            "urgency": "medium",
            "estimatedSavingsBytes": 87109,
            "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": "Defer non-critical UI modules until after first render",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "strategy": "Keep only above-the-fold resources in the initial path; hydrate or import secondary modules later.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 media-edg.barcelona.cat",
            "urgency": "high",
            "estimatedSavingsBytes": 374190,
            "strategy": "Serve a smaller placeholder first and load this asset only when the user scrolls to or requests the component.",
            "url": "https://media-edg.barcelona.cat/wp-content/uploads/2025/06/06124823/FOTO-Castell-Tres-Dragons-800-x-480-2-570x321.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 font asset from www.barcelona.cat",
            "urgency": "medium",
            "estimatedSavingsBytes": 90559,
            "strategy": "Subset or defer this font so full font payloads are only fetched when needed.",
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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.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: 7.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-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,
          "displayValue": "Est savings of 79 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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 79 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,
          "displayValue": "Est savings of 884 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 884 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 87 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 87 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,
          "displayValue": "Est savings of 85 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 85 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": "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": 0,
          "displayValue": "Est savings of 1,590 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 Eliminate render-blocking resources\n\n- Lighthouse audit: render-blocking-resources\n- Current value: Est savings of 1,590 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\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": "server-response-time",
          "title": "Reduce initial server response time",
          "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": 0,
          "displayValue": "Root document took 680 ms",
          "impact": "high",
          "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 Reduce initial server response time\n\n- Lighthouse audit: server-response-time\n- Current value: Root document took 680 ms\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": "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": 0.81,
          "displayValue": "4.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 Speed Index\n\n- Lighthouse audit: speed-index\n- Current value: 4.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\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": 0.5,
          "displayValue": "Est savings of 32 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 32 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": "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": "1,053 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: 1,053 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://barcelona.cat/ca/que-pots-fer-a-bcn/estiu/oficines-de-tramitacio-del-dni-i-passaport",
      "status": "ok",
      "finalUrl": "https://www.barcelona.cat/ca/que-pots-fer-a-bcn/estiu/oficines-de-tramitacio-del-dni-i-passaport",
      "performanceScore": 0.66,
      "bestPracticesScore": 1,
      "transferBytes": 845136,
      "co2Grams": 0.32375588207040007,
      "greenWeb": {
        "page": {
          "hostname": "www.barcelona.cat",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-13T22:38:00.231825",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.barcelona.cat",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76425,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "stylesheet",
            "requestCount": 1,
            "transferBytes": 24654,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "cdnjs.cloudflare.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15868,
            "sampleUrl": "https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js",
            "greenCheck": {
              "hostname": "cdnjs.cloudflare.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:34",
              "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/cdnjs.cloudflare.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15566,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7143,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 4109,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/css/bcn-avisos.css",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "fonts.googleapis.com",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 2483,
            "sampleUrl": "https://fonts.googleapis.com/css?family=Source+Sans+3:200,200i,300,300i,400,400i,500,500i,600,600i,700,700i,900,900i",
            "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
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=ecWxNL&url=https%3A%2F%2Fwww.barcelona.cat%2Fca%2Fque-pots-fer-a-bcn%2Festiu%2Foficines-de-tramitacio-del-dni-i-passaport",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 11,
          "greenCount": 5,
          "notGreenCount": 7,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 75,
        "urgency": "high",
        "pageElementOccurrences": 5,
        "uniqueElementsAssessed": 2,
        "reusedFromCacheCount": 2,
        "components": [
          {
            "signature": "form|get|/ca|input|text|query|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "text",
            "fieldName": "query",
            "formContext": "form|get|/ca",
            "hasLabel": true,
            "hasValidationRule": false,
            "hasErrorMessagingHook": false,
            "toolingFriendly": false,
            "assessment": {
              "score": 60,
              "urgency": "high",
              "issues": [
                "No explicit validation rule",
                "No error messaging hook",
                "Missing autocomplete for tooling support"
              ],
              "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.",
                "Provide meaningful autocomplete values to support browsers and assistive tooling."
              ]
            },
            "reusedFromCache": true
          },
          {
            "signature": "no-form|select|select|anonymous|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "select",
            "fieldName": null,
            "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": "No explicit validation rule",
            "urgency": "medium",
            "detail": "2 unique form control signature(s) on this page include this issue."
          },
          {
            "title": "No error messaging hook",
            "urgency": "medium",
            "detail": "2 unique form control signature(s) on this page include this issue."
          },
          {
            "title": "Missing autocomplete for tooling support",
            "urgency": "medium",
            "detail": "1 unique form control signature(s) on this page include this issue."
          },
          {
            "title": "Missing associated label",
            "urgency": "high",
            "detail": "1 unique form control signature(s) on this page include this issue."
          }
        ]
      },
      "metadata": {
        "score": 25,
        "urgency": "low",
        "checks": {
          "hasTitle": true,
          "hasLang": true,
          "hasDescription": false,
          "hasCanonical": true,
          "hasOpenGraphCore": false,
          "hasTwitterCard": true,
          "hasViewport": true,
          "hasCharset": true,
          "hasValidStructuredData": true,
          "hasInvalidStructuredData": false
        },
        "observed": {
          "title": "Oficines de tramitació del DNI i passaport | Barcelona.cat | Ajuntament de Barcelona",
          "lang": "ca",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "",
          "robots": "",
          "canonical": "https://www.barcelona.cat/ca/que-pots-fer-a-bcn/estiu/oficines-de-tramitacio-del-dni-i-passaport",
          "ogTitle": "Oficines de tramitació del DNI i passaport",
          "ogDescription": "",
          "ogType": "Web",
          "ogUrl": "https://www.barcelona.cat/ca/que-pots-fer-a-bcn/estiu/oficines-de-tramitacio-del-dni-i-passaport",
          "twitterCard": "summary_large_image",
          "ldJsonCount": 0,
          "validLdJsonCount": 0,
          "invalidLdJsonCount": 0
        },
        "recommendations": [
          {
            "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."
          }
        ]
      },
      "layoutAdaptation": {
        "score": 30,
        "urgency": "medium",
        "checks": {
          "testedMobile": true,
          "testedTablet": true,
          "horizontalOverflowOnMobile": false,
          "horizontalOverflowOnTablet": false,
          "mobileSmallTapTargets": 57,
          "tabletSmallTapTargets": 56,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 57,
            "oversizedMedia": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 56,
            "oversizedMedia": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 57 small targets on mobile and 56 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 59,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": true,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": true,
          "externalScriptCount": 8,
          "externalScriptsWithoutIntegrity": 8,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "cache-control": "max-age=300, public",
            "content-encoding": "gzip",
            "content-language": "ca",
            "content-length": "11164",
            "content-type": "text/html; charset=UTF-8",
            "date": "Mon, 13 Apr 2026 22:57:59 GMT",
            "etag": "\"1776121078-gzip\"",
            "expires": "Sun, 19 Nov 1978 05:00:00 GMT",
            "last-modified": "Mon, 13 Apr 2026 22:57:58 GMT",
            "server": "nginx",
            "vary": "Cookie,Accept-Encoding",
            "via": "1.1 ca2190123e61f1744d1210c24c87c840.cloudfront.net (CloudFront)",
            "x-amz-cf-id": "SZw805EFRW9c93e9FodEKKgOY-PEwMfPrqDlzE7ccQ8u36wIWGNlxw==",
            "x-amz-cf-pop": "IAD12-P5",
            "x-cache": "Miss from cloudfront",
            "x-content-type-options": "nosniff",
            "x-frame-options": "SAMEORIGIN",
            "x-generator": "Drupal 10 (https://www.drupal.org)"
          },
          "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": "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": "8 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 25,
        "urgency": "low",
        "origin": "https://www.barcelona.cat",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://www.barcelona.cat/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/sitemap.xml",
            "found": true,
            "status": 200,
            "contentType": "application/xml; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/manifest.webmanifest",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/favicon.ico",
            "found": true,
            "status": 200,
            "contentType": "image/x-icon"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "low",
            "detail": "Missing beneficial file(s): /.well-known/security.txt, /manifest.webmanifest."
          }
        ]
      },
      "mediaHints": {
        "score": 50,
        "urgency": "medium",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 17,
          "imagesWithLazy": 0,
          "imagesWithoutLazy": 17
        },
        "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": "17 of 17 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 85,
        "urgency": "medium",
        "data": {
          "hasPrintStyles": true,
          "hasReducedMotion": true,
          "media": {
            "totalImages": 22,
            "lazyImages": 1,
            "totalIframes": 1,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "\"Source Sans Pro\", \"Helvetica Neue\", Helvetica, Arial, sans-serif",
            "usesSystemFont": true
          },
          "tracking": {
            "count": 0,
            "scripts": []
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 1/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": "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"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 15,
        "urgency": "low",
        "totalEstimatedSavingsBytes": 130442.55,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Use modern image compression formats",
            "urgency": "medium",
            "estimatedSavingsBytes": 72410.55,
            "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size."
          },
          {
            "id": "uses-optimized-images",
            "title": "Improve image encoding quality/size",
            "urgency": "medium",
            "estimatedSavingsBytes": 58032,
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings."
          }
        ],
        "recommendations": [
          {
            "title": "Use modern image compression formats",
            "urgency": "medium",
            "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size. Estimated savings: 70.71 KB."
          },
          {
            "title": "Improve image encoding quality/size",
            "urgency": "medium",
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 56.67 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": 342199.55,
        "totalEstimatedBlockingMs": 1790,
        "opportunities": [
          {
            "id": "render-blocking-resources",
            "title": "Eliminate render-blocking resources",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering.",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1790,
            "displayValue": "Est savings of 1,790 ms",
            "urgency": "high",
            "sourceAuditId": "render-blocking-resources"
          },
          {
            "id": "unused-css-rules",
            "title": "Remove unused CSS",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped.",
            "estimatedSavingsBytes": 92167,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 90 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-css-rules"
          },
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 87109,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 85 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": 72410.55,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 71 KiB",
            "urgency": "medium",
            "sourceAuditId": "modern-image-formats"
          },
          {
            "id": "uses-optimized-images",
            "title": "Compress oversized image assets",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss.",
            "estimatedSavingsBytes": 58032,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 57 KiB",
            "urgency": "medium",
            "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": 32481,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 32 KiB",
            "urgency": "low",
            "sourceAuditId": "unused-javascript"
          }
        ],
        "recommendations": [
          {
            "title": "Eliminate render-blocking resources",
            "urgency": "high",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering. Estimated render unblocking: 1790 ms."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "medium",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 90.01 KB."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "medium",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 85.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: 70.71 KB."
          },
          {
            "title": "Compress oversized image assets",
            "urgency": "medium",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 56.67 KB."
          },
          {
            "title": "Remove unused JavaScript",
            "urgency": "low",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 31.72 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": 10,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 8,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "8 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": 167990.93348463683
        },
        "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: 164.05 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: 164.05 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": "medium",
        "transferBytes": 845136,
        "css": {
          "unusedBytes": 92167,
          "ratio": 0.10905582060165464,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 32481,
          "duplicatedBytes": 0,
          "ratio": 0.0384328676094735,
          "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": "high",
            "estimatedSavingsBytes": 92167,
            "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": "medium",
            "estimatedSavingsBytes": 32481,
            "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": 845136,
        "estimatedDeferrableBytes": 211757,
        "renderBlockingMs": 1790,
        "breakdown": {
          "offscreenImageSavings": 87109,
          "unusedJavascriptSavings": 32481,
          "unusedCssSavings": 92167
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 87109,
            "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": "medium",
            "estimatedSavingsBytes": 32481,
            "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": "high",
            "estimatedSavingsBytes": 92167,
            "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": "Eliminate render-blocking resources",
            "area": "render-path",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1790,
            "strategy": "Defer scripts/styles not required for first paint and preload only truly critical assets.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-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 www.barcelona.cat",
            "area": "font",
            "urgency": "medium",
            "estimatedSavingsBytes": 90559,
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "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 www.barcelona.cat",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 84137,
            "url": "https://www.barcelona.cat/themes/barcelonacat_theme/images/menu/viula.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 cdn.matomo.cloud",
            "area": "script",
            "urgency": "medium",
            "estimatedSavingsBytes": 76425,
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.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": 65,
        "urgency": "high",
        "providerCount": 8,
        "requestCount": 9,
        "transferBytes": 155324,
        "notGreenCount": 5,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76425,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "cdnjs.cloudflare.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15868,
            "sampleUrl": "https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js",
            "greenCheck": {
              "hostname": "cdnjs.cloudflare.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:34",
              "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/cdnjs.cloudflare.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15566,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7143,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=ecWxNL&url=https%3A%2F%2Fwww.barcelona.cat%2Fca%2Fque-pots-fer-a-bcn%2Festiu%2Foficines-de-tramitacio-del-dni-i-passaport",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "high",
            "detail": "Track 8 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."
          },
          {
            "title": "Prioritize greener alternatives for third-party providers",
            "urgency": "high",
            "detail": "5 third-party script origin(s) are not confirmed green in the Green Web Foundation dataset."
          }
        ]
      },
      "redundancy": {
        "score": 18,
        "urgency": "low",
        "transferBytes": 845136,
        "estimatedRedundantBytes": 124648,
        "redundancyRatio": 0.14748868821112815,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 92167,
            "displayValue": "Est savings of 90 KiB"
          },
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 32481,
            "displayValue": "Est savings of 32 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 92167,
            "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 unused javascript",
            "urgency": "medium",
            "estimatedSavingsBytes": 32481,
            "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 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": 20,
        "urgency": "medium",
        "totalTransferBytes": 845136,
        "heavyRequestCount": 4,
        "heavyBytes": 271000,
        "heavyRatio": 0.32065845023759487,
        "heavyRequests": [
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "transferSize": 90559,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "transferSize": 76425,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "cdn.matomo.cloud"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament/fonts/icoajuntament.ttf?8aaig7",
            "transferSize": 54920,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/css/css_evpTRQTawGYS1Ro7RbXq3hBxwat7AU-RJm1V8ZgzeaE.css?delta=5&language=ca&theme=barcelonacat_theme&include=eJyFztEOwiAMheEXgnDhA5EDq4gySmiZ7u1dYuJinPGqTf_voriOqpipqseShcW9hkXLBntMI8NNUGo53qh_JzpjFBUT0CMVrohQzwv1nicSt8lhlbls_ZdpSGSXTPdPoBeayQVmFe1oPk71CKTCAcWKriXXdCRyZLv_fSSEx3bzgir-9A-0zibE6jfW4d6bp4dSryhGVlGaXYDQE_H9jbg&tcut5n",
            "transferSize": 49096,
            "resourceType": "stylesheet",
            "mimeType": "text/css",
            "domain": "www.barcelona.cat"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "font",
            "count": 2,
            "transferBytes": 145479
          },
          {
            "resourceType": "script",
            "count": 1,
            "transferBytes": 76425
          },
          {
            "resourceType": "stylesheet",
            "count": 1,
            "transferBytes": 49096
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.barcelona.cat",
            "count": 3,
            "transferBytes": 194575
          },
          {
            "domain": "cdn.matomo.cloud",
            "count": 1,
            "transferBytes": 76425
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Lazy-load offscreen images and media galleries",
            "urgency": "medium",
            "estimatedSavingsBytes": 87109,
            "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": "Defer non-critical UI modules until after first render",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "strategy": "Keep only above-the-fold resources in the initial path; hydrate or import secondary modules later.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 www.barcelona.cat",
            "urgency": "medium",
            "estimatedSavingsBytes": 90559,
            "strategy": "Subset or defer this font so full font payloads are only fetched when needed.",
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 cdn.matomo.cloud",
            "urgency": "medium",
            "estimatedSavingsBytes": 76425,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.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.1,
          "displayValue": "6.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: 6.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-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,
          "displayValue": "Est savings of 90 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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 90 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,
          "displayValue": "Est savings of 71 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 71 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 57 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 57 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,
          "displayValue": "Est savings of 85 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 85 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": "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": 0,
          "displayValue": "Est savings of 1,790 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 Eliminate render-blocking resources\n\n- Lighthouse audit: render-blocking-resources\n- Current value: Est savings of 1,790 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\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": "server-response-time",
          "title": "Reduce initial server response time",
          "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": 0,
          "displayValue": "Root document took 750 ms",
          "impact": "high",
          "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 Reduce initial server response time\n\n- Lighthouse audit: server-response-time\n- Current value: Root document took 750 ms\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": "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": 0.83,
          "displayValue": "3.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 Speed Index\n\n- Lighthouse audit: speed-index\n- Current value: 3.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\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": 0.5,
          "displayValue": "Est savings of 32 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 32 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": "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": "1,056 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: 1,056 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://barcelona.cat/es/que-hacer-en-bcn/banos-y-playas/playa-de-somorrostro",
      "status": "ok",
      "finalUrl": "https://www.barcelona.cat/es/que-hacer-en-bcn/banos-y-playas/playa-de-somorrostro",
      "performanceScore": 0.62,
      "bestPracticesScore": 0.96,
      "transferBytes": 1643047,
      "co2Grams": 0.6294207450258,
      "greenWeb": {
        "page": {
          "hostname": "www.barcelona.cat",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-13T22:38:00.231825",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.barcelona.cat",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76425,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31745,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "stylesheet",
            "requestCount": 1,
            "transferBytes": 24654,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15566,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7143,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 4111,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/css/bcn-avisos.css",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "fonts.googleapis.com",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 2483,
            "sampleUrl": "https://fonts.googleapis.com/css?family=Source+Sans+3:200,200i,300,300i,400,400i,500,500i,600,600i,700,700i,900,900i",
            "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
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=kA9Sg9&url=https%3A%2F%2Fwww.barcelona.cat%2Fes%2Fque-hacer-en-bcn%2Fbanos-y-playas%2Fplaya-de-somorrostro",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 10,
          "greenCount": 4,
          "notGreenCount": 7,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 60,
        "urgency": "high",
        "pageElementOccurrences": 1,
        "uniqueElementsAssessed": 1,
        "reusedFromCacheCount": 1,
        "components": [
          {
            "signature": "form|get|/es/|input|text|query|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "text",
            "fieldName": "query",
            "formContext": "form|get|/es/",
            "hasLabel": true,
            "hasValidationRule": false,
            "hasErrorMessagingHook": false,
            "toolingFriendly": false,
            "assessment": {
              "score": 60,
              "urgency": "high",
              "issues": [
                "No explicit validation rule",
                "No error messaging hook",
                "Missing autocomplete for tooling support"
              ],
              "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.",
                "Provide meaningful autocomplete values to support browsers and assistive tooling."
              ]
            },
            "reusedFromCache": true
          }
        ],
        "recommendations": [
          {
            "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."
          },
          {
            "title": "Missing autocomplete for tooling support",
            "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": "Playa Somorrostro | Web Barcelona | Ayuntamiento Barcelona",
          "lang": "es",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "En esta emblemática playa, que encarna la recuperación de la memoria histórica del barrio de barracas del Somorrostro, se encuentra el Centro de la Playa.",
          "robots": "",
          "canonical": "https://www.barcelona.cat/es/que-hacer-en-bcn/banos-y-playas/playa-de-somorrostro",
          "ogTitle": "Playa de Somorrostro",
          "ogDescription": "En la playa del Somorrostro se encuentra el Centro de la Playa, un equipamiento de educación ambiental con actividades para todas las edades y servicios como el préstamo de diarios, material deportivo y utensilios para jugar en la arena. Dispone de itinerarios accesibles y aparcamientos, duchas y lavabos adaptados.",
          "ogType": "Web",
          "ogUrl": "https://www.barcelona.cat/es/que-hacer-en-bcn/banos-y-playas/playa-de-somorrostro",
          "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": 34,
        "urgency": "medium",
        "checks": {
          "testedMobile": true,
          "testedTablet": true,
          "horizontalOverflowOnMobile": false,
          "horizontalOverflowOnTablet": false,
          "mobileSmallTapTargets": 42,
          "tabletSmallTapTargets": 40,
          "fixedWidthOffenders": 2,
          "oversizedMedia": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 1,
            "smallTapTargets": 42,
            "oversizedMedia": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 1,
            "smallTapTargets": 40,
            "oversizedMedia": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 42 small targets on mobile and 40 on tablet."
          },
          {
            "title": "Refactor fixed-width components",
            "urgency": "medium",
            "detail": "2 element(s) exceeded viewport width in tested layouts; use responsive component constraints."
          }
        ]
      },
      "securityLight": {
        "score": 59,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": true,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": true,
          "externalScriptCount": 7,
          "externalScriptsWithoutIntegrity": 7,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "cache-control": "max-age=300, public",
            "content-encoding": "gzip",
            "content-language": "es",
            "content-length": "12715",
            "content-type": "text/html; charset=UTF-8",
            "date": "Mon, 13 Apr 2026 22:58:13 GMT",
            "etag": "\"1776121092-gzip\"",
            "expires": "Sun, 19 Nov 1978 05:00:00 GMT",
            "last-modified": "Mon, 13 Apr 2026 22:58:12 GMT",
            "server": "nginx",
            "vary": "Cookie,Accept-Encoding",
            "via": "1.1 ca2190123e61f1744d1210c24c87c840.cloudfront.net (CloudFront)",
            "x-amz-cf-id": "-ZCUNyfCDn92FLypUpxNGhL0_nbhkO6onmmX2vQXcfrdUnsE4S5CcQ==",
            "x-amz-cf-pop": "IAD12-P5",
            "x-cache": "Miss from cloudfront",
            "x-content-type-options": "nosniff",
            "x-frame-options": "SAMEORIGIN",
            "x-generator": "Drupal 10 (https://www.drupal.org)"
          },
          "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": "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": "7 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 25,
        "urgency": "low",
        "origin": "https://www.barcelona.cat",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://www.barcelona.cat/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/sitemap.xml",
            "found": true,
            "status": 200,
            "contentType": "application/xml; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/manifest.webmanifest",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/favicon.ico",
            "found": true,
            "status": 200,
            "contentType": "image/x-icon"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "low",
            "detail": "Missing beneficial file(s): /.well-known/security.txt, /manifest.webmanifest."
          }
        ]
      },
      "mediaHints": {
        "score": 39,
        "urgency": "medium",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 16,
          "imagesWithLazy": 3,
          "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 16 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 85,
        "urgency": "medium",
        "data": {
          "hasPrintStyles": true,
          "hasReducedMotion": true,
          "media": {
            "totalImages": 21,
            "lazyImages": 4,
            "totalIframes": 1,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "\"Source Sans Pro\", \"Helvetica Neue\", Helvetica, Arial, sans-serif",
            "usesSystemFont": true
          },
          "tracking": {
            "count": 0,
            "scripts": []
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 4/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": "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"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 83,
        "urgency": "high",
        "totalEstimatedSavingsBytes": 1370958.3,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Use modern image compression formats",
            "urgency": "high",
            "estimatedSavingsBytes": 737527.3,
            "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": 633431,
            "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: 720.24 KB."
          },
          {
            "title": "Improve image encoding quality/size",
            "urgency": "high",
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 618.58 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": 1599815.3,
        "totalEstimatedBlockingMs": 1607,
        "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": 737527.3,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 720 KiB",
            "urgency": "high",
            "sourceAuditId": "modern-image-formats"
          },
          {
            "id": "uses-optimized-images",
            "title": "Compress oversized image assets",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss.",
            "estimatedSavingsBytes": 633431,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 619 KiB",
            "urgency": "high",
            "sourceAuditId": "uses-optimized-images"
          },
          {
            "id": "render-blocking-resources",
            "title": "Eliminate render-blocking resources",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering.",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1607,
            "displayValue": "Est savings of 1,610 ms",
            "urgency": "high",
            "sourceAuditId": "render-blocking-resources"
          },
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 91565,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 89 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": 83012,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 81 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-css-rules"
          },
          {
            "id": "unused-javascript",
            "title": "Remove unused JavaScript",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code.",
            "estimatedSavingsBytes": 54280,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 53 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-javascript"
          }
        ],
        "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: 720.24 KB."
          },
          {
            "title": "Compress oversized image assets",
            "urgency": "high",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 618.58 KB."
          },
          {
            "title": "Eliminate render-blocking resources",
            "urgency": "high",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering. Estimated render unblocking: 1607 ms."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "medium",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 89.42 KB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "medium",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 81.07 KB."
          },
          {
            "title": "Remove unused JavaScript",
            "urgency": "medium",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 53.01 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": 10,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 7,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "7 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": 167997.51473463688
        },
        "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: 164.06 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: 164.06 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": "medium",
        "transferBytes": 1643047,
        "css": {
          "unusedBytes": 83012,
          "ratio": 0.05052320475312027,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 54280,
          "duplicatedBytes": 0,
          "ratio": 0.033036182166426155,
          "auditIds": [
            "unused-javascript",
            "duplicated-javascript"
          ]
        },
        "html": {
          "estimatedPenalty": 0.25,
          "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": "high",
            "estimatedSavingsBytes": 83012,
            "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": "medium",
            "estimatedSavingsBytes": 54280,
            "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": 1643047,
        "estimatedDeferrableBytes": 228857,
        "renderBlockingMs": 1607,
        "breakdown": {
          "offscreenImageSavings": 91565,
          "unusedJavascriptSavings": 54280,
          "unusedCssSavings": 83012
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 91565,
            "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": "medium",
            "estimatedSavingsBytes": 54280,
            "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": "high",
            "estimatedSavingsBytes": 83012,
            "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": "Eliminate render-blocking resources",
            "area": "render-path",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1607,
            "strategy": "Defer scripts/styles not required for first paint and preload only truly critical assets.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-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 www.barcelona.cat",
            "area": "image",
            "urgency": "high",
            "estimatedSavingsBytes": 276176,
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_platges/public/platges/269330609111714.jpg?itok=AGBWMaqZ",
            "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 www.barcelona.cat",
            "area": "font",
            "urgency": "medium",
            "estimatedSavingsBytes": 90559,
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "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": 64,
        "urgency": "high",
        "providerCount": 7,
        "requestCount": 8,
        "transferBytes": 139455,
        "notGreenCount": 5,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76425,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31745,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15566,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7143,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=kA9Sg9&url=https%3A%2F%2Fwww.barcelona.cat%2Fes%2Fque-hacer-en-bcn%2Fbanos-y-playas%2Fplaya-de-somorrostro",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "high",
            "detail": "Track 7 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."
          },
          {
            "title": "Prioritize greener alternatives for third-party providers",
            "urgency": "high",
            "detail": "5 third-party script origin(s) are not confirmed green in the Green Web Foundation dataset."
          }
        ]
      },
      "redundancy": {
        "score": 25,
        "urgency": "medium",
        "transferBytes": 1643047,
        "estimatedRedundantBytes": 137292,
        "redundancyRatio": 0.08355938691954642,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 83012,
            "displayValue": "Est savings of 81 KiB"
          },
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 54280,
            "displayValue": "Est savings of 53 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 83012,
            "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 unused javascript",
            "urgency": "medium",
            "estimatedSavingsBytes": 54280,
            "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 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": 34,
        "urgency": "medium",
        "totalTransferBytes": 1643047,
        "heavyRequestCount": 7,
        "heavyBytes": 1035530,
        "heavyRatio": 0.6302497737435386,
        "heavyRequests": [
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_platges/public/platges/269330609111714.jpg?itok=AGBWMaqZ",
            "transferSize": 276176,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_platges/public/platges/211330609111714.jpg?itok=zidlDpWg",
            "transferSize": 243225,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_platges/public/platges/344330609111714.jpg?itok=G0RzdeXw",
            "transferSize": 242291,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "transferSize": 90559,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "transferSize": 76425,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "cdn.matomo.cloud"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament/fonts/icoajuntament.ttf?8aaig7",
            "transferSize": 54920,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/css/css_qDD4BCxE8K-iT7MRORwp32v03DlJblP9-xrYwOBWlQo.css?delta=6&language=es&theme=barcelonacat_theme&include=eJyFz9EKwjAMBdAfWumDH1RuY5zVLhlNNre_dyAMhIpPudx7XoLHIo6JxRPWYmrxcwLmMmQ04qoCgiddubVyZYuHXoKr1mP_ZWaMHNbCr2_gd544ZlU3b5gTXaUHbhDas269bayaUYP5XouMPVFIA86_esJqoWcAEZuVXLlrdDm6ZBBLl39gbjpkknSwhnimxJtzE9TBdnOeYobxG293khk&tcut5n",
            "transferSize": 51934,
            "resourceType": "stylesheet",
            "mimeType": "text/css",
            "domain": "www.barcelona.cat"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "image",
            "count": 3,
            "transferBytes": 761692
          },
          {
            "resourceType": "font",
            "count": 2,
            "transferBytes": 145479
          },
          {
            "resourceType": "script",
            "count": 1,
            "transferBytes": 76425
          },
          {
            "resourceType": "stylesheet",
            "count": 1,
            "transferBytes": 51934
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.barcelona.cat",
            "count": 6,
            "transferBytes": 959105
          },
          {
            "domain": "cdn.matomo.cloud",
            "count": 1,
            "transferBytes": 76425
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Lazy-load offscreen images and media galleries",
            "urgency": "medium",
            "estimatedSavingsBytes": 91565,
            "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": "medium",
            "estimatedSavingsBytes": 54280,
            "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": "Defer non-critical UI modules until after first render",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "strategy": "Keep only above-the-fold resources in the initial path; hydrate or import secondary modules later.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 www.barcelona.cat",
            "urgency": "high",
            "estimatedSavingsBytes": 276176,
            "strategy": "Serve a smaller placeholder first and load this asset only when the user scrolls to or requests the component.",
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_platges/public/platges/269330609111714.jpg?itok=AGBWMaqZ",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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.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: 11.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 53 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 53 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,
          "displayValue": "Est savings of 81 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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 81 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,
          "displayValue": "Est savings of 720 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 720 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 619 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 619 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,
          "displayValue": "Est savings of 89 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 89 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": "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": 0,
          "displayValue": "Est savings of 1,610 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 Eliminate render-blocking resources\n\n- Lighthouse audit: render-blocking-resources\n- Current value: Est savings of 1,610 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\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": "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,
          "displayValue": "1,114 elements",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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: 1,114 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"
        },
        {
          "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": 0.82,
          "displayValue": "3.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 Speed Index\n\n- Lighthouse audit: speed-index\n- Current value: 3.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\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"
        }
      ]
    },
    {
      "url": "https://barcelona.cat/es/que-hacer-en-bcn/ponte-en-forma/federaciones",
      "status": "ok",
      "finalUrl": "https://www.barcelona.cat/es/que-hacer-en-bcn/ponte-en-forma/federaciones",
      "performanceScore": 0.67,
      "bestPracticesScore": 1,
      "transferBytes": 873213,
      "co2Grams": 0.3345116585382,
      "greenWeb": {
        "page": {
          "hostname": "www.barcelona.cat",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-13T22:38:00.231825",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.barcelona.cat",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76425,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "stylesheet",
            "requestCount": 1,
            "transferBytes": 24654,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "cdnjs.cloudflare.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15863,
            "sampleUrl": "https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js",
            "greenCheck": {
              "hostname": "cdnjs.cloudflare.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:34",
              "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/cdnjs.cloudflare.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15566,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7146,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 4110,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/css/bcn-avisos.css",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "fonts.googleapis.com",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 2481,
            "sampleUrl": "https://fonts.googleapis.com/css?family=Source+Sans+3:200,200i,300,300i,400,400i,500,500i,600,600i,700,700i,900,900i",
            "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
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=8O4SMW&url=https%3A%2F%2Fwww.barcelona.cat%2Fes%2Fque-hacer-en-bcn%2Fponte-en-forma%2Ffederaciones",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 11,
          "greenCount": 5,
          "notGreenCount": 7,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 75,
        "urgency": "high",
        "pageElementOccurrences": 5,
        "uniqueElementsAssessed": 2,
        "reusedFromCacheCount": 2,
        "components": [
          {
            "signature": "form|get|/es/|input|text|query|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "text",
            "fieldName": "query",
            "formContext": "form|get|/es/",
            "hasLabel": true,
            "hasValidationRule": false,
            "hasErrorMessagingHook": false,
            "toolingFriendly": false,
            "assessment": {
              "score": 60,
              "urgency": "high",
              "issues": [
                "No explicit validation rule",
                "No error messaging hook",
                "Missing autocomplete for tooling support"
              ],
              "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.",
                "Provide meaningful autocomplete values to support browsers and assistive tooling."
              ]
            },
            "reusedFromCache": true
          },
          {
            "signature": "no-form|select|select|anonymous|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "select",
            "fieldName": null,
            "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": "No explicit validation rule",
            "urgency": "medium",
            "detail": "2 unique form control signature(s) on this page include this issue."
          },
          {
            "title": "No error messaging hook",
            "urgency": "medium",
            "detail": "2 unique form control signature(s) on this page include this issue."
          },
          {
            "title": "Missing autocomplete for tooling support",
            "urgency": "medium",
            "detail": "1 unique form control signature(s) on this page include this issue."
          },
          {
            "title": "Missing associated label",
            "urgency": "high",
            "detail": "1 unique form control signature(s) on this page include this issue."
          }
        ]
      },
      "metadata": {
        "score": 25,
        "urgency": "low",
        "checks": {
          "hasTitle": true,
          "hasLang": true,
          "hasDescription": false,
          "hasCanonical": true,
          "hasOpenGraphCore": false,
          "hasTwitterCard": true,
          "hasViewport": true,
          "hasCharset": true,
          "hasValidStructuredData": true,
          "hasInvalidStructuredData": false
        },
        "observed": {
          "title": "Federaciones | Barcelona.cat | Ajuntament de Barcelona",
          "lang": "es",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "",
          "robots": "",
          "canonical": "https://www.barcelona.cat/es/que-hacer-en-bcn/ponte-en-forma/federaciones",
          "ogTitle": "Federaciones",
          "ogDescription": "",
          "ogType": "Web",
          "ogUrl": "https://www.barcelona.cat/es/que-hacer-en-bcn/ponte-en-forma/federaciones",
          "twitterCard": "summary_large_image",
          "ldJsonCount": 0,
          "validLdJsonCount": 0,
          "invalidLdJsonCount": 0
        },
        "recommendations": [
          {
            "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."
          }
        ]
      },
      "layoutAdaptation": {
        "score": 32,
        "urgency": "medium",
        "checks": {
          "testedMobile": true,
          "testedTablet": true,
          "horizontalOverflowOnMobile": false,
          "horizontalOverflowOnTablet": false,
          "mobileSmallTapTargets": 69,
          "tabletSmallTapTargets": 69,
          "fixedWidthOffenders": 1,
          "oversizedMedia": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 1,
            "smallTapTargets": 69,
            "oversizedMedia": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 69,
            "oversizedMedia": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 69 small targets on mobile and 69 on tablet."
          },
          {
            "title": "Refactor fixed-width components",
            "urgency": "medium",
            "detail": "1 element(s) exceeded viewport width in tested layouts; use responsive component constraints."
          }
        ]
      },
      "securityLight": {
        "score": 59,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": true,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": true,
          "externalScriptCount": 8,
          "externalScriptsWithoutIntegrity": 8,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "cache-control": "max-age=300, public",
            "content-encoding": "gzip",
            "content-language": "es",
            "content-length": "11792",
            "content-type": "text/html; charset=UTF-8",
            "date": "Mon, 13 Apr 2026 22:58:27 GMT",
            "etag": "\"1776121106-gzip\"",
            "expires": "Sun, 19 Nov 1978 05:00:00 GMT",
            "last-modified": "Mon, 13 Apr 2026 22:58:26 GMT",
            "server": "nginx",
            "vary": "Cookie,Accept-Encoding",
            "via": "1.1 ca2190123e61f1744d1210c24c87c840.cloudfront.net (CloudFront)",
            "x-amz-cf-id": "MOxS7u3ssgjWfEHKuaxTzU82xuM5B_y1wMcyjQqx6wv7siFdAJIvew==",
            "x-amz-cf-pop": "IAD12-P5",
            "x-cache": "Miss from cloudfront",
            "x-content-type-options": "nosniff",
            "x-frame-options": "SAMEORIGIN",
            "x-generator": "Drupal 10 (https://www.drupal.org)"
          },
          "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": "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": "8 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 25,
        "urgency": "low",
        "origin": "https://www.barcelona.cat",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://www.barcelona.cat/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/sitemap.xml",
            "found": true,
            "status": 200,
            "contentType": "application/xml; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/manifest.webmanifest",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/favicon.ico",
            "found": true,
            "status": 200,
            "contentType": "image/x-icon"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "low",
            "detail": "Missing beneficial file(s): /.well-known/security.txt, /manifest.webmanifest."
          }
        ]
      },
      "mediaHints": {
        "score": 50,
        "urgency": "medium",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 21,
          "imagesWithLazy": 0,
          "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 21 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 85,
        "urgency": "medium",
        "data": {
          "hasPrintStyles": true,
          "hasReducedMotion": true,
          "media": {
            "totalImages": 26,
            "lazyImages": 1,
            "totalIframes": 1,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "\"Source Sans Pro\", \"Helvetica Neue\", Helvetica, Arial, sans-serif",
            "usesSystemFont": true
          },
          "tracking": {
            "count": 0,
            "scripts": []
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 1/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": "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"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 18,
        "urgency": "low",
        "totalEstimatedSavingsBytes": 154107.55,
        "checks": {
          "hasEffectiveTextCompression": false
        },
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Use modern image compression formats",
            "urgency": "medium",
            "estimatedSavingsBytes": 72410.55,
            "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size."
          },
          {
            "id": "uses-optimized-images",
            "title": "Improve image encoding quality/size",
            "urgency": "medium",
            "estimatedSavingsBytes": 58032,
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings."
          },
          {
            "id": "uses-text-compression",
            "title": "Enable Brotli/gzip for text assets",
            "urgency": "low",
            "estimatedSavingsBytes": 23665,
            "detail": "Compress HTML, CSS, JS, JSON, SVG, and XML responses with Brotli or gzip."
          }
        ],
        "recommendations": [
          {
            "title": "Use modern image compression formats",
            "urgency": "medium",
            "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size. Estimated savings: 70.71 KB."
          },
          {
            "title": "Improve image encoding quality/size",
            "urgency": "medium",
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 56.67 KB."
          },
          {
            "title": "Enable Brotli/gzip for text assets",
            "urgency": "low",
            "detail": "Compress HTML, CSS, JS, JSON, SVG, and XML responses with Brotli or gzip. Estimated savings: 23.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": 365616.55,
        "totalEstimatedBlockingMs": 1588,
        "opportunities": [
          {
            "id": "render-blocking-resources",
            "title": "Eliminate render-blocking resources",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering.",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1588,
            "displayValue": "Est savings of 1,590 ms",
            "urgency": "high",
            "sourceAuditId": "render-blocking-resources"
          },
          {
            "id": "unused-css-rules",
            "title": "Remove unused CSS",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped.",
            "estimatedSavingsBytes": 91918,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 90 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-css-rules"
          },
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 87110,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 85 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": 72410.55,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 71 KiB",
            "urgency": "medium",
            "sourceAuditId": "modern-image-formats"
          },
          {
            "id": "uses-optimized-images",
            "title": "Compress oversized image assets",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss.",
            "estimatedSavingsBytes": 58032,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 57 KiB",
            "urgency": "medium",
            "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": 32481,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 32 KiB",
            "urgency": "low",
            "sourceAuditId": "unused-javascript"
          },
          {
            "id": "uses-text-compression",
            "title": "Enable text compression",
            "detail": "Serve text assets with Brotli or gzip to remove avoidable transfer bloat.",
            "estimatedSavingsBytes": 23665,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 23 KiB",
            "urgency": "low",
            "sourceAuditId": "uses-text-compression"
          }
        ],
        "recommendations": [
          {
            "title": "Eliminate render-blocking resources",
            "urgency": "high",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering. Estimated render unblocking: 1588 ms."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "medium",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 89.76 KB."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "medium",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 85.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: 70.71 KB."
          },
          {
            "title": "Compress oversized image assets",
            "urgency": "medium",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 56.67 KB."
          },
          {
            "title": "Remove unused JavaScript",
            "urgency": "low",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 31.72 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": 10,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 8,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "8 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": 167992.75223463686
        },
        "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: 164.06 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: 164.06 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": "medium",
        "transferBytes": 873213,
        "css": {
          "unusedBytes": 91918,
          "ratio": 0.10526412227028228,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 32481,
          "duplicatedBytes": 0,
          "ratio": 0.03719710998347482,
          "auditIds": [
            "unused-javascript",
            "duplicated-javascript"
          ]
        },
        "html": {
          "estimatedPenalty": 0.25,
          "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": "high",
            "estimatedSavingsBytes": 91918,
            "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": "medium",
            "estimatedSavingsBytes": 32481,
            "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": 873213,
        "estimatedDeferrableBytes": 211509,
        "renderBlockingMs": 1588,
        "breakdown": {
          "offscreenImageSavings": 87110,
          "unusedJavascriptSavings": 32481,
          "unusedCssSavings": 91918
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 87110,
            "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": "medium",
            "estimatedSavingsBytes": 32481,
            "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": "high",
            "estimatedSavingsBytes": 91918,
            "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": "Eliminate render-blocking resources",
            "area": "render-path",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1588,
            "strategy": "Defer scripts/styles not required for first paint and preload only truly critical assets.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-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 www.barcelona.cat",
            "area": "font",
            "urgency": "medium",
            "estimatedSavingsBytes": 90561,
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "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 www.barcelona.cat",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 84136,
            "url": "https://www.barcelona.cat/themes/barcelonacat_theme/images/menu/viula.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 cdn.matomo.cloud",
            "area": "script",
            "urgency": "medium",
            "estimatedSavingsBytes": 76425,
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.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": 65,
        "urgency": "high",
        "providerCount": 8,
        "requestCount": 9,
        "transferBytes": 155322,
        "notGreenCount": 5,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76425,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "cdnjs.cloudflare.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15863,
            "sampleUrl": "https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js",
            "greenCheck": {
              "hostname": "cdnjs.cloudflare.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:34",
              "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/cdnjs.cloudflare.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15566,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7146,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=8O4SMW&url=https%3A%2F%2Fwww.barcelona.cat%2Fes%2Fque-hacer-en-bcn%2Fponte-en-forma%2Ffederaciones",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "high",
            "detail": "Track 8 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."
          },
          {
            "title": "Prioritize greener alternatives for third-party providers",
            "urgency": "high",
            "detail": "5 third-party script origin(s) are not confirmed green in the Green Web Foundation dataset."
          }
        ]
      },
      "redundancy": {
        "score": 35,
        "urgency": "medium",
        "transferBytes": 873213,
        "estimatedRedundantBytes": 124399,
        "redundancyRatio": 0.1424612322537571,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 91918,
            "displayValue": "Est savings of 90 KiB"
          },
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 32481,
            "displayValue": "Est savings of 32 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 91918,
            "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 unused javascript",
            "urgency": "medium",
            "estimatedSavingsBytes": 32481,
            "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": "Enable and verify text compression",
            "urgency": "medium",
            "estimatedSavingsBytes": 23665,
            "auditId": "uses-text-compression",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "2",
              "title": "Remove unnecessary or redundant information",
              "url": "https://www.w3.org/TR/web-sustainability-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": 19,
        "urgency": "medium",
        "totalTransferBytes": 873213,
        "heavyRequestCount": 4,
        "heavyBytes": 271001,
        "heavyRatio": 0.31034925041198425,
        "heavyRequests": [
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "transferSize": 90561,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "transferSize": 76425,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "cdn.matomo.cloud"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament/fonts/icoajuntament.ttf?8aaig7",
            "transferSize": 54920,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/css/css_evpTRQTawGYS1Ro7RbXq3hBxwat7AU-RJm1V8ZgzeaE.css?delta=5&language=es&theme=barcelonacat_theme&include=eJyFztEOwiAMheEXgnDhA5EDq4gySmiZ7u1dYuJinPGqTf_voriOqpipqseShcW9hkXLBntMI8NNUGo53qh_JzpjFBUT0CMVrohQzwv1nicSt8lhlbls_ZdpSGSXTPdPoBeayQVmFe1oPk71CKTCAcWKriXXdCRyZLv_fSSEx3bzgir-9A-0zibE6jfW4d6bp4dSryhGVlGaXYDQE_H9jbg&tcut5n",
            "transferSize": 49095,
            "resourceType": "stylesheet",
            "mimeType": "text/css",
            "domain": "www.barcelona.cat"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "font",
            "count": 2,
            "transferBytes": 145481
          },
          {
            "resourceType": "script",
            "count": 1,
            "transferBytes": 76425
          },
          {
            "resourceType": "stylesheet",
            "count": 1,
            "transferBytes": 49095
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.barcelona.cat",
            "count": 3,
            "transferBytes": 194576
          },
          {
            "domain": "cdn.matomo.cloud",
            "count": 1,
            "transferBytes": 76425
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Lazy-load offscreen images and media galleries",
            "urgency": "medium",
            "estimatedSavingsBytes": 87110,
            "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": "Defer non-critical UI modules until after first render",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "strategy": "Keep only above-the-fold resources in the initial path; hydrate or import secondary modules later.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 www.barcelona.cat",
            "urgency": "medium",
            "estimatedSavingsBytes": 90561,
            "strategy": "Subset or defer this font so full font payloads are only fetched when needed.",
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 cdn.matomo.cloud",
            "urgency": "medium",
            "estimatedSavingsBytes": 76425,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.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.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: 6.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-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,
          "displayValue": "Est savings of 90 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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 90 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,
          "displayValue": "Est savings of 71 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 71 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 57 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 57 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,
          "displayValue": "Est savings of 85 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 85 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": "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": 0,
          "displayValue": "Est savings of 1,590 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 Eliminate render-blocking resources\n\n- Lighthouse audit: render-blocking-resources\n- Current value: Est savings of 1,590 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\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": "server-response-time",
          "title": "Reduce initial server response time",
          "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": 0,
          "displayValue": "Root document took 1,130 ms",
          "impact": "high",
          "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 Reduce initial server response time\n\n- Lighthouse audit: server-response-time\n- Current value: Root document took 1,130 ms\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": "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,
          "displayValue": "1,079 elements",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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: 1,079 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"
        },
        {
          "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": 0.7,
          "displayValue": "4.6 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 Speed Index\n\n- Lighthouse audit: speed-index\n- Current value: 4.6 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\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": 0.5,
          "displayValue": "Est savings of 32 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 32 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": "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": 0.5,
          "displayValue": "Est savings of 23 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 Enable text compression\n\n- Lighthouse audit: uses-text-compression\n- Current value: Est savings of 23 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\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"
        }
      ]
    },
    {
      "url": "https://barcelona.cat/ca/que-pots-fer-a-bcn/banys-i-platges/activitats-esportives-organitzades-amb-anim-de-lucre",
      "status": "ok",
      "finalUrl": "https://www.barcelona.cat/ca/que-pots-fer-a-bcn/banys-i-platges/activitats-esportives-organitzades-amb-anim-de-lucre",
      "performanceScore": 0.54,
      "bestPracticesScore": 1,
      "transferBytes": 1096743,
      "co2Grams": 0.42014184388020004,
      "greenWeb": {
        "page": {
          "hostname": "www.barcelona.cat",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-13T22:38:00.231825",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.barcelona.cat",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76425,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "stylesheet",
            "requestCount": 1,
            "transferBytes": 24654,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15566,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7143,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 4111,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/css/bcn-avisos.css",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "fonts.googleapis.com",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 2483,
            "sampleUrl": "https://fonts.googleapis.com/css?family=Source+Sans+3:200,200i,300,300i,400,400i,500,500i,600,600i,700,700i,900,900i",
            "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
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=YNN5mP&url=https%3A%2F%2Fwww.barcelona.cat%2Fca%2Fque-pots-fer-a-bcn%2Fbanys-i-platges%2Factivitats-esportives-organitzades-amb-anim-de-lucre",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 10,
          "greenCount": 4,
          "notGreenCount": 7,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 60,
        "urgency": "high",
        "pageElementOccurrences": 1,
        "uniqueElementsAssessed": 1,
        "reusedFromCacheCount": 1,
        "components": [
          {
            "signature": "form|get|/ca|input|text|query|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "text",
            "fieldName": "query",
            "formContext": "form|get|/ca",
            "hasLabel": true,
            "hasValidationRule": false,
            "hasErrorMessagingHook": false,
            "toolingFriendly": false,
            "assessment": {
              "score": 60,
              "urgency": "high",
              "issues": [
                "No explicit validation rule",
                "No error messaging hook",
                "Missing autocomplete for tooling support"
              ],
              "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.",
                "Provide meaningful autocomplete values to support browsers and assistive tooling."
              ]
            },
            "reusedFromCache": true
          }
        ],
        "recommendations": [
          {
            "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."
          },
          {
            "title": "Missing autocomplete for tooling support",
            "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": "Activitats esportives organitzades amb ànim de lucre | Web de Barcelona | Ajuntament de Barcelona",
          "lang": "ca",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "Coneix la normativa aplicable a les activitats esportives que es fan a la sorra que suposen un aprofitament comú especial o privatiu de les platges en benefici propi.",
          "robots": "",
          "canonical": "https://www.barcelona.cat/ca/que-pots-fer-a-bcn/banys-i-platges/activitats-esportives-organitzades-amb-anim-de-lucre",
          "ogTitle": "Activitats esportives organitzades amb ànim de lucre | Web de Barcelona | Ajuntament de Barcelona",
          "ogDescription": "Coneix la normativa aplicable a les activitats esportives que es fan a la sorra que suposen un aprofitament comú especial o privatiu de les platges en benefici propi.",
          "ogType": "Web",
          "ogUrl": "https://www.barcelona.cat/ca/que-pots-fer-a-bcn/banys-i-platges/activitats-esportives-organitzades-amb-anim-de-lucre",
          "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": 34,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 36,
            "oversizedMedia": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 34,
            "oversizedMedia": 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 34 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 59,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": true,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": true,
          "externalScriptCount": 7,
          "externalScriptsWithoutIntegrity": 7,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "cache-control": "max-age=300, public",
            "content-encoding": "gzip",
            "content-language": "ca",
            "content-length": "10583",
            "content-type": "text/html; charset=UTF-8",
            "date": "Mon, 13 Apr 2026 22:58:42 GMT",
            "etag": "\"1776121121-gzip\"",
            "expires": "Sun, 19 Nov 1978 05:00:00 GMT",
            "last-modified": "Mon, 13 Apr 2026 22:58:41 GMT",
            "server": "nginx",
            "vary": "Cookie,Accept-Encoding",
            "via": "1.1 ca2190123e61f1744d1210c24c87c840.cloudfront.net (CloudFront)",
            "x-amz-cf-id": "dmeIO8kAgYCIB7W-XDIOzus99QzVBfJ6VKfnamEB-PwmZBGTSAuYxw==",
            "x-amz-cf-pop": "IAD12-P5",
            "x-cache": "Miss from cloudfront",
            "x-content-type-options": "nosniff",
            "x-frame-options": "SAMEORIGIN",
            "x-generator": "Drupal 10 (https://www.drupal.org)"
          },
          "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": "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": "7 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 25,
        "urgency": "low",
        "origin": "https://www.barcelona.cat",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://www.barcelona.cat/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/sitemap.xml",
            "found": true,
            "status": 200,
            "contentType": "application/xml; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/manifest.webmanifest",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/favicon.ico",
            "found": true,
            "status": 200,
            "contentType": "image/x-icon"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "low",
            "detail": "Missing beneficial file(s): /.well-known/security.txt, /manifest.webmanifest."
          }
        ]
      },
      "mediaHints": {
        "score": 45,
        "urgency": "medium",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 12,
          "imagesWithLazy": 1,
          "imagesWithoutLazy": 11
        },
        "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": "11 of 12 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 85,
        "urgency": "medium",
        "data": {
          "hasPrintStyles": true,
          "hasReducedMotion": true,
          "media": {
            "totalImages": 17,
            "lazyImages": 2,
            "totalIframes": 1,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "\"Source Sans Pro\", \"Helvetica Neue\", Helvetica, Arial, sans-serif",
            "usesSystemFont": true
          },
          "tracking": {
            "count": 0,
            "scripts": []
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 2/17 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": "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"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 55,
        "urgency": "medium",
        "totalEstimatedSavingsBytes": 600638.6499999999,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Use modern image compression formats",
            "urgency": "high",
            "estimatedSavingsBytes": 335406.64999999997,
            "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": 265232,
            "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: 327.55 KB."
          },
          {
            "title": "Improve image encoding quality/size",
            "urgency": "high",
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 259.02 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": 837858.6499999999,
        "totalEstimatedBlockingMs": 1643,
        "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": 335406.64999999997,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 328 KiB",
            "urgency": "high",
            "sourceAuditId": "modern-image-formats"
          },
          {
            "id": "uses-optimized-images",
            "title": "Compress oversized image assets",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss.",
            "estimatedSavingsBytes": 265232,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 259 KiB",
            "urgency": "high",
            "sourceAuditId": "uses-optimized-images"
          },
          {
            "id": "render-blocking-resources",
            "title": "Eliminate render-blocking resources",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering.",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1643,
            "displayValue": "Est savings of 1,640 ms",
            "urgency": "high",
            "sourceAuditId": "render-blocking-resources"
          },
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 87110,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 85 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": 81293,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 79 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-css-rules"
          },
          {
            "id": "uses-responsive-images",
            "title": "Right-size images for viewport",
            "detail": "Avoid sending larger images than the rendered size needs.",
            "estimatedSavingsBytes": 36336,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 35 KiB",
            "urgency": "low",
            "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": 32481,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 32 KiB",
            "urgency": "low",
            "sourceAuditId": "unused-javascript"
          }
        ],
        "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: 327.55 KB."
          },
          {
            "title": "Compress oversized image assets",
            "urgency": "high",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 259.02 KB."
          },
          {
            "title": "Eliminate render-blocking resources",
            "urgency": "high",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering. Estimated render unblocking: 1643 ms."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "medium",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 85.07 KB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "medium",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 79.39 KB."
          },
          {
            "title": "Right-size images for viewport",
            "urgency": "low",
            "detail": "Avoid sending larger images than the rendered size needs. Estimated byte savings: 35.48 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": 10,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 7,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "7 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": 167992.9647346369
        },
        "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: 164.06 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: 164.06 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": 6,
        "urgency": "medium",
        "transferBytes": 1096743,
        "css": {
          "unusedBytes": 81293,
          "ratio": 0.07412219635776111,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 32481,
          "duplicatedBytes": 0,
          "ratio": 0.02961587172199868,
          "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": "high",
            "estimatedSavingsBytes": 81293,
            "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": "medium",
            "estimatedSavingsBytes": 32481,
            "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": 20,
        "urgency": "high",
        "transferBytes": 1096743,
        "estimatedDeferrableBytes": 200884,
        "renderBlockingMs": 1643,
        "breakdown": {
          "offscreenImageSavings": 87110,
          "unusedJavascriptSavings": 32481,
          "unusedCssSavings": 81293
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 87110,
            "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": "medium",
            "estimatedSavingsBytes": 32481,
            "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": 81293,
            "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": "Eliminate render-blocking resources",
            "area": "render-path",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1643,
            "strategy": "Defer scripts/styles not required for first paint and preload only truly critical assets.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-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 www.barcelona.cat",
            "area": "image",
            "urgency": "high",
            "estimatedSavingsBytes": 322036,
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_medium/public/anim_lucre.jpg?itok=nzwmmEsO",
            "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 www.barcelona.cat",
            "area": "font",
            "urgency": "medium",
            "estimatedSavingsBytes": 90559,
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "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 cdn.matomo.cloud",
            "area": "script",
            "urgency": "medium",
            "estimatedSavingsBytes": 76425,
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.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": 64,
        "urgency": "high",
        "providerCount": 7,
        "requestCount": 8,
        "transferBytes": 139456,
        "notGreenCount": 5,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76425,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15566,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7143,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=YNN5mP&url=https%3A%2F%2Fwww.barcelona.cat%2Fca%2Fque-pots-fer-a-bcn%2Fbanys-i-platges%2Factivitats-esportives-organitzades-amb-anim-de-lucre",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "high",
            "detail": "Track 7 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."
          },
          {
            "title": "Prioritize greener alternatives for third-party providers",
            "urgency": "high",
            "detail": "5 third-party script origin(s) are not confirmed green in the Green Web Foundation dataset."
          }
        ]
      },
      "redundancy": {
        "score": 16,
        "urgency": "low",
        "transferBytes": 1096743,
        "estimatedRedundantBytes": 113774,
        "redundancyRatio": 0.1037380680797598,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 81293,
            "displayValue": "Est savings of 79 KiB"
          },
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 32481,
            "displayValue": "Est savings of 32 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 81293,
            "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 unused javascript",
            "urgency": "medium",
            "estimatedSavingsBytes": 32481,
            "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 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": 29,
        "urgency": "medium",
        "totalTransferBytes": 1096743,
        "heavyRequestCount": 5,
        "heavyBytes": 593034,
        "heavyRatio": 0.5407228493822163,
        "heavyRequests": [
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_medium/public/anim_lucre.jpg?itok=nzwmmEsO",
            "transferSize": 322036,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "transferSize": 90559,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "transferSize": 76425,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "cdn.matomo.cloud"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament/fonts/icoajuntament.ttf?8aaig7",
            "transferSize": 54920,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/css/css_evpTRQTawGYS1Ro7RbXq3hBxwat7AU-RJm1V8ZgzeaE.css?delta=5&language=ca&theme=barcelonacat_theme&include=eJyFzsGKwzAMBNAfiuvDfpAZOyJxcSQjydn272sodFnIsieJmXcY3Ac7DmJPOKuJxfcJ6HXJ0EJNGAWe5CTVupLFqUdwkTb7v0zHRuGs9P0b-E4HxSzi5oqeyspXYGuS0YL5s1XerkQtEvDZfiVMxsySgS19_Qe6ypILp8kU8fMlejgpoy0dim0u3i2uOjra7Se5De4jt2o7rYs9zemIGUYvwgyJSg&tcut5n",
            "transferSize": 49094,
            "resourceType": "stylesheet",
            "mimeType": "text/css",
            "domain": "www.barcelona.cat"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "image",
            "count": 1,
            "transferBytes": 322036
          },
          {
            "resourceType": "font",
            "count": 2,
            "transferBytes": 145479
          },
          {
            "resourceType": "script",
            "count": 1,
            "transferBytes": 76425
          },
          {
            "resourceType": "stylesheet",
            "count": 1,
            "transferBytes": 49094
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.barcelona.cat",
            "count": 4,
            "transferBytes": 516609
          },
          {
            "domain": "cdn.matomo.cloud",
            "count": 1,
            "transferBytes": 76425
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Lazy-load offscreen images and media galleries",
            "urgency": "medium",
            "estimatedSavingsBytes": 87110,
            "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": "Defer non-critical UI modules until after first render",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "strategy": "Keep only above-the-fold resources in the initial path; hydrate or import secondary modules later.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 www.barcelona.cat",
            "urgency": "high",
            "estimatedSavingsBytes": 322036,
            "strategy": "Serve a smaller placeholder first and load this asset only when the user scrolls to or requests the component.",
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_medium/public/anim_lucre.jpg?itok=nzwmmEsO",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 www.barcelona.cat",
            "urgency": "medium",
            "estimatedSavingsBytes": 90559,
            "strategy": "Subset or defer this font so full font payloads are only fetched when needed.",
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 cdn.matomo.cloud",
            "urgency": "medium",
            "estimatedSavingsBytes": 76425,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.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": "10.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: 10.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 32 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 32 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,
          "displayValue": "Est savings of 79 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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 79 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,
          "displayValue": "Est savings of 328 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 328 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 259 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 259 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,
          "displayValue": "Est savings of 85 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 85 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": "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": 0,
          "displayValue": "Est savings of 1,640 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 Eliminate render-blocking resources\n\n- Lighthouse audit: render-blocking-resources\n- Current value: Est savings of 1,640 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\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": "server-response-time",
          "title": "Reduce initial server response time",
          "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": 0,
          "displayValue": "Root document took 970 ms",
          "impact": "high",
          "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 Reduce initial server response time\n\n- Lighthouse audit: server-response-time\n- Current value: Root document took 970 ms\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": "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": 0.76,
          "displayValue": "4.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 Speed Index\n\n- Lighthouse audit: speed-index\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\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": "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": "973 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: 973 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://barcelona.cat/en/discoverbcn/ciutadella-knowledge-hub/greenhouse/history",
      "status": "ok",
      "finalUrl": "https://www.barcelona.cat/en/discoverbcn/ciutadella-knowledge-hub/greenhouse/history",
      "performanceScore": 0.39,
      "bestPracticesScore": 1,
      "transferBytes": 3157775,
      "co2Grams": 1.209684867885,
      "greenWeb": {
        "page": {
          "hostname": "www.barcelona.cat",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-13T22:38:00.231825",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.barcelona.cat",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76424,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "stylesheet",
            "requestCount": 1,
            "transferBytes": 24654,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15565,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7144,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5656,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 4108,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/css/bcn-avisos.css",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "fonts.googleapis.com",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 2483,
            "sampleUrl": "https://fonts.googleapis.com/css?family=Source+Sans+3:200,200i,300,300i,400,400i,500,500i,600,600i,700,700i,900,900i",
            "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
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=n0bRBB&url=https%3A%2F%2Fwww.barcelona.cat%2Fen%2Fdiscoverbcn%2Fciutadella-knowledge-hub%2Fgreenhouse%2Fhistory",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 10,
          "greenCount": 4,
          "notGreenCount": 7,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 60,
        "urgency": "high",
        "pageElementOccurrences": 1,
        "uniqueElementsAssessed": 1,
        "reusedFromCacheCount": 1,
        "components": [
          {
            "signature": "form|get|/en|input|text|query|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "text",
            "fieldName": "query",
            "formContext": "form|get|/en",
            "hasLabel": true,
            "hasValidationRule": false,
            "hasErrorMessagingHook": false,
            "toolingFriendly": false,
            "assessment": {
              "score": 60,
              "urgency": "high",
              "issues": [
                "No explicit validation rule",
                "No error messaging hook",
                "Missing autocomplete for tooling support"
              ],
              "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.",
                "Provide meaningful autocomplete values to support browsers and assistive tooling."
              ]
            },
            "reusedFromCache": true
          }
        ],
        "recommendations": [
          {
            "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."
          },
          {
            "title": "Missing autocomplete for tooling support",
            "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": "History of the Greenhouse | Barcelona.cat | Barcelona City Council",
          "lang": "en",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "Find out about the restoration of the Parc de la Ciutadella Greenhouse. Learn about the restoration process that has revived its original appearance and grandeur.",
          "robots": "",
          "canonical": "https://www.barcelona.cat/en/discoverbcn/ciutadella-knowledge-hub/greenhouse/history",
          "ogTitle": "History of the Parc de la Ciutadella Greenhouse",
          "ogDescription": "The Parc de la Ciutadella Greenhouse has been restored. Learn about the history of this iconic 135-year-old site and how its essence has been brought back to life after its restoration.",
          "ogType": "Web",
          "ogUrl": "https://www.barcelona.cat/en/discoverbcn/ciutadella-knowledge-hub/greenhouse/history",
          "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": 34,
        "urgency": "medium",
        "checks": {
          "testedMobile": true,
          "testedTablet": true,
          "horizontalOverflowOnMobile": false,
          "horizontalOverflowOnTablet": false,
          "mobileSmallTapTargets": 45,
          "tabletSmallTapTargets": 35,
          "fixedWidthOffenders": 2,
          "oversizedMedia": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 1,
            "smallTapTargets": 45,
            "oversizedMedia": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 1,
            "smallTapTargets": 35,
            "oversizedMedia": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 45 small targets on mobile and 35 on tablet."
          },
          {
            "title": "Refactor fixed-width components",
            "urgency": "medium",
            "detail": "2 element(s) exceeded viewport width in tested layouts; use responsive component constraints."
          }
        ]
      },
      "securityLight": {
        "score": 59,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": true,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": true,
          "externalScriptCount": 7,
          "externalScriptsWithoutIntegrity": 7,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "cache-control": "max-age=300, public",
            "content-encoding": "gzip",
            "content-language": "en",
            "content-length": "13750",
            "content-type": "text/html; charset=UTF-8",
            "date": "Mon, 13 Apr 2026 22:58:55 GMT",
            "etag": "\"1776121135-gzip\"",
            "expires": "Sun, 19 Nov 1978 05:00:00 GMT",
            "last-modified": "Mon, 13 Apr 2026 22:58:55 GMT",
            "server": "nginx",
            "vary": "Cookie,Accept-Encoding",
            "via": "1.1 ca2190123e61f1744d1210c24c87c840.cloudfront.net (CloudFront)",
            "x-amz-cf-id": "7KRTSsDn1tCSreksmFnbE6k1K7HJybs9HGX4hL9jtoWPvfk5Pc2bww==",
            "x-amz-cf-pop": "IAD12-P5",
            "x-cache": "Miss from cloudfront",
            "x-content-type-options": "nosniff",
            "x-frame-options": "SAMEORIGIN",
            "x-generator": "Drupal 10 (https://www.drupal.org)"
          },
          "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": "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": "7 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 25,
        "urgency": "low",
        "origin": "https://www.barcelona.cat",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://www.barcelona.cat/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/sitemap.xml",
            "found": true,
            "status": 200,
            "contentType": "application/xml; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/manifest.webmanifest",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/favicon.ico",
            "found": true,
            "status": 200,
            "contentType": "image/x-icon"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "low",
            "detail": "Missing beneficial file(s): /.well-known/security.txt, /manifest.webmanifest."
          }
        ]
      },
      "mediaHints": {
        "score": 20,
        "urgency": "low",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 35,
          "imagesWithLazy": 24,
          "imagesWithoutLazy": 11
        },
        "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."
          }
        ]
      },
      "wsgCustom": {
        "score": 85,
        "urgency": "medium",
        "data": {
          "hasPrintStyles": true,
          "hasReducedMotion": true,
          "media": {
            "totalImages": 40,
            "lazyImages": 25,
            "totalIframes": 1,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "\"Source Sans Pro\", \"Helvetica Neue\", Helvetica, Arial, sans-serif",
            "usesSystemFont": true
          },
          "tracking": {
            "count": 0,
            "scripts": []
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 25/40 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": "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"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 100,
        "urgency": "high",
        "totalEstimatedSavingsBytes": 3552849.45,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Use modern image compression formats",
            "urgency": "high",
            "estimatedSavingsBytes": 1972556.4500000002,
            "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": 1580293,
            "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: 1.88 MB."
          },
          {
            "title": "Improve image encoding quality/size",
            "urgency": "high",
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 1.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": 4038314.45,
        "totalEstimatedBlockingMs": 1644,
        "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": 1972556.4500000002,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 1,926 KiB",
            "urgency": "high",
            "sourceAuditId": "modern-image-formats"
          },
          {
            "id": "uses-optimized-images",
            "title": "Compress oversized image assets",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss.",
            "estimatedSavingsBytes": 1580293,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 1,543 KiB",
            "urgency": "high",
            "sourceAuditId": "uses-optimized-images"
          },
          {
            "id": "uses-responsive-images",
            "title": "Right-size images for viewport",
            "detail": "Avoid sending larger images than the rendered size needs.",
            "estimatedSavingsBytes": 260531,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 254 KiB",
            "urgency": "high",
            "sourceAuditId": "uses-responsive-images"
          },
          {
            "id": "render-blocking-resources",
            "title": "Eliminate render-blocking resources",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering.",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1644,
            "displayValue": "Est savings of 1,640 ms",
            "urgency": "high",
            "sourceAuditId": "render-blocking-resources"
          },
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 87109,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 85 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": 83083,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 81 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-css-rules"
          },
          {
            "id": "unused-javascript",
            "title": "Remove unused JavaScript",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code.",
            "estimatedSavingsBytes": 54742,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 53 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-javascript"
          }
        ],
        "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.88 MB."
          },
          {
            "title": "Compress oversized image assets",
            "urgency": "high",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 1.51 MB."
          },
          {
            "title": "Right-size images for viewport",
            "urgency": "high",
            "detail": "Avoid sending larger images than the rendered size needs. Estimated byte savings: 254.42 KB."
          },
          {
            "title": "Eliminate render-blocking resources",
            "urgency": "high",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering. Estimated render unblocking: 1644 ms."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "medium",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 85.07 KB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "medium",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 81.14 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": 10,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 7,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "7 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": 167995.39626396648
        },
        "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: 164.06 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: 164.06 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": "medium",
        "transferBytes": 3157775,
        "css": {
          "unusedBytes": 83083,
          "ratio": 0.02631061427745802,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 54742,
          "duplicatedBytes": 0,
          "ratio": 0.017335623975742412,
          "auditIds": [
            "unused-javascript",
            "duplicated-javascript"
          ]
        },
        "html": {
          "estimatedPenalty": 0.25,
          "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": "high",
            "estimatedSavingsBytes": 83083,
            "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": "medium",
            "estimatedSavingsBytes": 54742,
            "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": 3157775,
        "estimatedDeferrableBytes": 224934,
        "renderBlockingMs": 1644,
        "breakdown": {
          "offscreenImageSavings": 87109,
          "unusedJavascriptSavings": 54742,
          "unusedCssSavings": 83083
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 87109,
            "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": "medium",
            "estimatedSavingsBytes": 54742,
            "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": "high",
            "estimatedSavingsBytes": 83083,
            "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": "Eliminate render-blocking resources",
            "area": "render-path",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1644,
            "strategy": "Defer scripts/styles not required for first paint and preload only truly critical assets.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-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 www.barcelona.cat",
            "area": "image",
            "urgency": "high",
            "estimatedSavingsBytes": 425939,
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_medium/public/01_0.jpg?itok=TGM3XuFv",
            "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": 64,
        "urgency": "high",
        "providerCount": 7,
        "requestCount": 8,
        "transferBytes": 139665,
        "notGreenCount": 5,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76424,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15565,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7144,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5656,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=n0bRBB&url=https%3A%2F%2Fwww.barcelona.cat%2Fen%2Fdiscoverbcn%2Fciutadella-knowledge-hub%2Fgreenhouse%2Fhistory",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "high",
            "detail": "Track 7 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."
          },
          {
            "title": "Prioritize greener alternatives for third-party providers",
            "urgency": "high",
            "detail": "5 third-party script origin(s) are not confirmed green in the Green Web Foundation dataset."
          }
        ]
      },
      "redundancy": {
        "score": 22,
        "urgency": "medium",
        "transferBytes": 3157775,
        "estimatedRedundantBytes": 137825,
        "redundancyRatio": 0.04364623825320044,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 83083,
            "displayValue": "Est savings of 81 KiB"
          },
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 54742,
            "displayValue": "Est savings of 53 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 83083,
            "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 unused javascript",
            "urgency": "medium",
            "estimatedSavingsBytes": 54742,
            "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 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": 44,
        "urgency": "high",
        "totalTransferBytes": 3157775,
        "heavyRequestCount": 11,
        "heavyBytes": 2582852,
        "heavyRatio": 0.8179341466697279,
        "heavyRequests": [
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_medium/public/01_0.jpg?itok=TGM3XuFv",
            "transferSize": 425939,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_medium/public/07.jpg?itok=YWmnrCGy",
            "transferSize": 377211,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_medium/public/02.jpg?itok=rnqagJ_V",
            "transferSize": 352712,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_medium/public/03.jpg?itok=VQZPSpRH",
            "transferSize": 339680,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_medium/public/04.jpg?itok=czkDssdn",
            "transferSize": 291190,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_medium/public/06.jpg?itok=j3zJCkei",
            "transferSize": 269288,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_medium/public/05.jpg?itok=YhWkQ9gS",
            "transferSize": 252995,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "transferSize": 90560,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "transferSize": 76424,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "cdn.matomo.cloud"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament/fonts/icoajuntament.ttf?8aaig7",
            "transferSize": 54920,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/css/css_qDD4BCxE8K-iT7MRORwp32v03DlJblP9-xrYwOBWlQo.css?delta=6&language=en&theme=barcelonacat_theme&include=eJyFz8FuxCAMBNAfCsuhH4QG4ia0DkbYpJu_L9JKW1VitSdbM-8y-OrFcFCxgDOrqH8ch5qXiJaIpSDBgpzUWl5J_dDdmQiP_pWp2MidmX7-A9vpIB9FTK2hhrSWGfhESVeU-6zbWCLYqV2cyzYTOYnDc9dMKOf07ZASqebINDXSRxYURcPHO1CbLDGVMFiDf36B7katgJeKhm0s3tWvrVfw7S-59VJ75Kw7rYteanT4CKVfKxCiTQ&tcut5n",
            "transferSize": 51933,
            "resourceType": "stylesheet",
            "mimeType": "text/css",
            "domain": "www.barcelona.cat"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "image",
            "count": 7,
            "transferBytes": 2309015
          },
          {
            "resourceType": "font",
            "count": 2,
            "transferBytes": 145480
          },
          {
            "resourceType": "script",
            "count": 1,
            "transferBytes": 76424
          },
          {
            "resourceType": "stylesheet",
            "count": 1,
            "transferBytes": 51933
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.barcelona.cat",
            "count": 10,
            "transferBytes": 2506428
          },
          {
            "domain": "cdn.matomo.cloud",
            "count": 1,
            "transferBytes": 76424
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Lazy-load offscreen images and media galleries",
            "urgency": "medium",
            "estimatedSavingsBytes": 87109,
            "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": "medium",
            "estimatedSavingsBytes": 54742,
            "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": "Defer non-critical UI modules until after first render",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "strategy": "Keep only above-the-fold resources in the initial path; hydrate or import secondary modules later.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 www.barcelona.cat",
            "urgency": "high",
            "estimatedSavingsBytes": 425939,
            "strategy": "Serve a smaller placeholder first and load this asset only when the user scrolls to or requests the component.",
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_medium/public/01_0.jpg?itok=TGM3XuFv",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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.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: 20.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 53 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 53 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,
          "displayValue": "Est savings of 81 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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 81 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,
          "displayValue": "Est savings of 1,926 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,926 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 1,543 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 1,543 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,
          "displayValue": "Est savings of 85 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 85 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": "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": 0,
          "displayValue": "Est savings of 1,640 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 Eliminate render-blocking resources\n\n- Lighthouse audit: render-blocking-resources\n- Current value: Est savings of 1,640 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\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": "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,
          "displayValue": "1,102 elements",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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: 1,102 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"
        },
        {
          "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": 0.62,
          "displayValue": "5.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 Speed Index\n\n- Lighthouse audit: speed-index\n- Current value: 5.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\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": "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,084 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,084 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://barcelona.cat/ca/que-pots-fer-a-bcn/posat-en-forma/installacions-esportives",
      "status": "ok",
      "finalUrl": "https://www.barcelona.cat/ca/que-pots-fer-a-bcn/posat-en-forma/installacions-esportives",
      "performanceScore": 0.63,
      "bestPracticesScore": 1,
      "transferBytes": 975557,
      "co2Grams": 0.3737177413398,
      "greenWeb": {
        "page": {
          "hostname": "www.barcelona.cat",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-13T22:38:00.231825",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.barcelona.cat",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76425,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "stylesheet",
            "requestCount": 1,
            "transferBytes": 24654,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "cdnjs.cloudflare.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15872,
            "sampleUrl": "https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js",
            "greenCheck": {
              "hostname": "cdnjs.cloudflare.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:34",
              "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/cdnjs.cloudflare.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15565,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7142,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 4112,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/css/bcn-avisos.css",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2862,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "fonts.googleapis.com",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 2483,
            "sampleUrl": "https://fonts.googleapis.com/css?family=Source+Sans+3:200,200i,300,300i,400,400i,500,500i,600,600i,700,700i,900,900i",
            "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
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=rcCikk&url=https%3A%2F%2Fwww.barcelona.cat%2Fca%2Fque-pots-fer-a-bcn%2Fposat-en-forma%2Finstallacions-esportives",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 11,
          "greenCount": 5,
          "notGreenCount": 7,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 75,
        "urgency": "high",
        "pageElementOccurrences": 7,
        "uniqueElementsAssessed": 2,
        "reusedFromCacheCount": 2,
        "components": [
          {
            "signature": "form|get|/ca|input|text|query|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "text",
            "fieldName": "query",
            "formContext": "form|get|/ca",
            "hasLabel": true,
            "hasValidationRule": false,
            "hasErrorMessagingHook": false,
            "toolingFriendly": false,
            "assessment": {
              "score": 60,
              "urgency": "high",
              "issues": [
                "No explicit validation rule",
                "No error messaging hook",
                "Missing autocomplete for tooling support"
              ],
              "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.",
                "Provide meaningful autocomplete values to support browsers and assistive tooling."
              ]
            },
            "reusedFromCache": true
          },
          {
            "signature": "no-form|select|select|anonymous|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "select",
            "fieldName": null,
            "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": "No explicit validation rule",
            "urgency": "medium",
            "detail": "2 unique form control signature(s) on this page include this issue."
          },
          {
            "title": "No error messaging hook",
            "urgency": "medium",
            "detail": "2 unique form control signature(s) on this page include this issue."
          },
          {
            "title": "Missing autocomplete for tooling support",
            "urgency": "medium",
            "detail": "1 unique form control signature(s) on this page include this issue."
          },
          {
            "title": "Missing associated label",
            "urgency": "high",
            "detail": "1 unique form control signature(s) on this page include this issue."
          }
        ]
      },
      "metadata": {
        "score": 25,
        "urgency": "low",
        "checks": {
          "hasTitle": true,
          "hasLang": true,
          "hasDescription": false,
          "hasCanonical": true,
          "hasOpenGraphCore": false,
          "hasTwitterCard": true,
          "hasViewport": true,
          "hasCharset": true,
          "hasValidStructuredData": true,
          "hasInvalidStructuredData": false
        },
        "observed": {
          "title": "Instal·lacions esportives | Barcelona.cat | Ajuntament de Barcelona",
          "lang": "ca",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "",
          "robots": "",
          "canonical": "https://www.barcelona.cat/ca/que-pots-fer-a-bcn/posat-en-forma/installacions-esportives",
          "ogTitle": "Instal·lacions esportives",
          "ogDescription": "",
          "ogType": "Web",
          "ogUrl": "https://www.barcelona.cat/ca/que-pots-fer-a-bcn/posat-en-forma/installacions-esportives",
          "twitterCard": "summary_large_image",
          "ldJsonCount": 0,
          "validLdJsonCount": 0,
          "invalidLdJsonCount": 0
        },
        "recommendations": [
          {
            "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."
          }
        ]
      },
      "layoutAdaptation": {
        "score": 30,
        "urgency": "medium",
        "checks": {
          "testedMobile": true,
          "testedTablet": true,
          "horizontalOverflowOnMobile": false,
          "horizontalOverflowOnTablet": false,
          "mobileSmallTapTargets": 66,
          "tabletSmallTapTargets": 65,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 66,
            "oversizedMedia": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 65,
            "oversizedMedia": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 66 small targets on mobile and 65 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 59,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": true,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": true,
          "externalScriptCount": 8,
          "externalScriptsWithoutIntegrity": 8,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "cache-control": "max-age=300, public",
            "content-encoding": "gzip",
            "content-language": "ca",
            "content-length": "14356",
            "content-type": "text/html; charset=UTF-8",
            "date": "Mon, 13 Apr 2026 22:59:10 GMT",
            "etag": "\"1776121149-gzip\"",
            "expires": "Sun, 19 Nov 1978 05:00:00 GMT",
            "last-modified": "Mon, 13 Apr 2026 22:59:09 GMT",
            "server": "nginx",
            "vary": "Cookie,Accept-Encoding",
            "via": "1.1 ca2190123e61f1744d1210c24c87c840.cloudfront.net (CloudFront)",
            "x-amz-cf-id": "Cj5xktgovqXIzWLyHtO3k5p0xrZxxx3Ze_LZHpFY9_9ZAnoBYSaxbA==",
            "x-amz-cf-pop": "IAD12-P5",
            "x-cache": "Miss from cloudfront",
            "x-content-type-options": "nosniff",
            "x-frame-options": "SAMEORIGIN",
            "x-generator": "Drupal 10 (https://www.drupal.org)"
          },
          "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": "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": "8 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 25,
        "urgency": "low",
        "origin": "https://www.barcelona.cat",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://www.barcelona.cat/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/sitemap.xml",
            "found": true,
            "status": 200,
            "contentType": "application/xml; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/manifest.webmanifest",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/favicon.ico",
            "found": true,
            "status": 200,
            "contentType": "image/x-icon"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "low",
            "detail": "Missing beneficial file(s): /.well-known/security.txt, /manifest.webmanifest."
          }
        ]
      },
      "mediaHints": {
        "score": 50,
        "urgency": "medium",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 21,
          "imagesWithLazy": 0,
          "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 21 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 85,
        "urgency": "medium",
        "data": {
          "hasPrintStyles": true,
          "hasReducedMotion": true,
          "media": {
            "totalImages": 26,
            "lazyImages": 1,
            "totalIframes": 1,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "\"Source Sans Pro\", \"Helvetica Neue\", Helvetica, Arial, sans-serif",
            "usesSystemFont": true
          },
          "tracking": {
            "count": 0,
            "scripts": []
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 1/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": "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"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 27,
        "urgency": "low",
        "totalEstimatedSavingsBytes": 267400.15,
        "checks": {
          "hasEffectiveTextCompression": false
        },
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Use modern image compression formats",
            "urgency": "medium",
            "estimatedSavingsBytes": 99577.15,
            "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size."
          },
          {
            "id": "uses-text-compression",
            "title": "Enable Brotli/gzip for text assets",
            "urgency": "medium",
            "estimatedSavingsBytes": 88200,
            "detail": "Compress HTML, CSS, JS, JSON, SVG, and XML responses with Brotli or gzip."
          },
          {
            "id": "uses-optimized-images",
            "title": "Improve image encoding quality/size",
            "urgency": "medium",
            "estimatedSavingsBytes": 79623,
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings."
          }
        ],
        "recommendations": [
          {
            "title": "Use modern image compression formats",
            "urgency": "medium",
            "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size. Estimated savings: 97.24 KB."
          },
          {
            "title": "Enable Brotli/gzip for text assets",
            "urgency": "medium",
            "detail": "Compress HTML, CSS, JS, JSON, SVG, and XML responses with Brotli or gzip. Estimated savings: 86.13 KB."
          },
          {
            "title": "Improve image encoding quality/size",
            "urgency": "medium",
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 77.76 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": 511675.15,
        "totalEstimatedBlockingMs": 1564,
        "opportunities": [
          {
            "id": "render-blocking-resources",
            "title": "Eliminate render-blocking resources",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering.",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1564,
            "displayValue": "Est savings of 1,560 ms",
            "urgency": "high",
            "sourceAuditId": "render-blocking-resources"
          },
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 119876,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 117 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": 99577.15,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 97 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": 91918,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 90 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-css-rules"
          },
          {
            "id": "uses-text-compression",
            "title": "Enable text compression",
            "detail": "Serve text assets with Brotli or gzip to remove avoidable transfer bloat.",
            "estimatedSavingsBytes": 88200,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 86 KiB",
            "urgency": "medium",
            "sourceAuditId": "uses-text-compression"
          },
          {
            "id": "uses-optimized-images",
            "title": "Compress oversized image assets",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss.",
            "estimatedSavingsBytes": 79623,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 78 KiB",
            "urgency": "medium",
            "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": 32481,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 32 KiB",
            "urgency": "low",
            "sourceAuditId": "unused-javascript"
          }
        ],
        "recommendations": [
          {
            "title": "Eliminate render-blocking resources",
            "urgency": "high",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering. Estimated render unblocking: 1564 ms."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "medium",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 117.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: 97.24 KB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "medium",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 89.76 KB."
          },
          {
            "title": "Enable text compression",
            "urgency": "medium",
            "detail": "Serve text assets with Brotli or gzip to remove avoidable transfer bloat. Estimated byte savings: 86.13 KB."
          },
          {
            "title": "Compress oversized image assets",
            "urgency": "medium",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 77.76 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": 10,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 8,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "8 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": 199800.12931797025
        },
        "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: 195.12 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: 195.12 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": "medium",
        "transferBytes": 975557,
        "css": {
          "unusedBytes": 91918,
          "ratio": 0.09422104500300854,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 32481,
          "duplicatedBytes": 0,
          "ratio": 0.033294825417684464,
          "auditIds": [
            "unused-javascript",
            "duplicated-javascript"
          ]
        },
        "html": {
          "estimatedPenalty": 0.25,
          "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": "high",
            "estimatedSavingsBytes": 91918,
            "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": "medium",
            "estimatedSavingsBytes": 32481,
            "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": 975557,
        "estimatedDeferrableBytes": 244275,
        "renderBlockingMs": 1564,
        "breakdown": {
          "offscreenImageSavings": 119876,
          "unusedJavascriptSavings": 32481,
          "unusedCssSavings": 91918
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 119876,
            "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": "medium",
            "estimatedSavingsBytes": 32481,
            "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": "high",
            "estimatedSavingsBytes": 91918,
            "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": "Eliminate render-blocking resources",
            "area": "render-path",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1564,
            "strategy": "Defer scripts/styles not required for first paint and preload only truly critical assets.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-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 www.barcelona.cat",
            "area": "font",
            "urgency": "medium",
            "estimatedSavingsBytes": 90560,
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "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 www.barcelona.cat",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 84136,
            "url": "https://www.barcelona.cat/themes/barcelonacat_theme/images/menu/viula.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 cdn.matomo.cloud",
            "area": "script",
            "urgency": "medium",
            "estimatedSavingsBytes": 76425,
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.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": 65,
        "urgency": "high",
        "providerCount": 8,
        "requestCount": 9,
        "transferBytes": 155327,
        "notGreenCount": 5,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76425,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "cdnjs.cloudflare.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15872,
            "sampleUrl": "https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js",
            "greenCheck": {
              "hostname": "cdnjs.cloudflare.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:34",
              "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/cdnjs.cloudflare.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15565,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7142,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2862,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=rcCikk&url=https%3A%2F%2Fwww.barcelona.cat%2Fca%2Fque-pots-fer-a-bcn%2Fposat-en-forma%2Finstallacions-esportives",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "high",
            "detail": "Track 8 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."
          },
          {
            "title": "Prioritize greener alternatives for third-party providers",
            "urgency": "high",
            "detail": "5 third-party script origin(s) are not confirmed green in the Green Web Foundation dataset."
          }
        ]
      },
      "redundancy": {
        "score": 35,
        "urgency": "medium",
        "transferBytes": 975557,
        "estimatedRedundantBytes": 124399,
        "redundancyRatio": 0.127515870420693,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 91918,
            "displayValue": "Est savings of 90 KiB"
          },
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 32481,
            "displayValue": "Est savings of 32 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 91918,
            "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 unused javascript",
            "urgency": "medium",
            "estimatedSavingsBytes": 32481,
            "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": "Enable and verify text compression",
            "urgency": "medium",
            "estimatedSavingsBytes": 88200,
            "auditId": "uses-text-compression",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "2",
              "title": "Remove unnecessary or redundant information",
              "url": "https://www.w3.org/TR/web-sustainability-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": 18,
        "urgency": "medium",
        "totalTransferBytes": 975557,
        "heavyRequestCount": 4,
        "heavyBytes": 271003,
        "heavyRatio": 0.277793096661702,
        "heavyRequests": [
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "transferSize": 90560,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "transferSize": 76425,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "cdn.matomo.cloud"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament/fonts/icoajuntament.ttf?8aaig7",
            "transferSize": 54921,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/css/css_evpTRQTawGYS1Ro7RbXq3hBxwat7AU-RJm1V8ZgzeaE.css?delta=5&language=ca&theme=barcelonacat_theme&include=eJyFztEOwiAMheEXgnDhA5EDq4gySmiZ7u1dYuJinPGqTf_voriOqpipqseShcW9hkXLBntMI8NNUGo53qh_JzpjFBUT0CMVrohQzwv1nicSt8lhlbls_ZdpSGSXTPdPoBeayQVmFe1oPk71CKTCAcWKriXXdCRyZLv_fSSEx3bzgir-9A-0zibE6jfW4d6bp4dSryhGVlGaXYDQE_H9jbg&tcut5n",
            "transferSize": 49097,
            "resourceType": "stylesheet",
            "mimeType": "text/css",
            "domain": "www.barcelona.cat"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "font",
            "count": 2,
            "transferBytes": 145481
          },
          {
            "resourceType": "script",
            "count": 1,
            "transferBytes": 76425
          },
          {
            "resourceType": "stylesheet",
            "count": 1,
            "transferBytes": 49097
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.barcelona.cat",
            "count": 3,
            "transferBytes": 194578
          },
          {
            "domain": "cdn.matomo.cloud",
            "count": 1,
            "transferBytes": 76425
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Lazy-load offscreen images and media galleries",
            "urgency": "medium",
            "estimatedSavingsBytes": 119876,
            "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": "Defer non-critical UI modules until after first render",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "strategy": "Keep only above-the-fold resources in the initial path; hydrate or import secondary modules later.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 www.barcelona.cat",
            "urgency": "medium",
            "estimatedSavingsBytes": 90560,
            "strategy": "Subset or defer this font so full font payloads are only fetched when needed.",
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 cdn.matomo.cloud",
            "urgency": "medium",
            "estimatedSavingsBytes": 76425,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.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.08,
          "displayValue": "6.6 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.6 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,
          "displayValue": "Est savings of 90 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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 90 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,
          "displayValue": "Est savings of 97 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 97 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 78 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 78 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,
          "displayValue": "Est savings of 117 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 117 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": "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": 0,
          "displayValue": "Est savings of 1,560 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 Eliminate render-blocking resources\n\n- Lighthouse audit: render-blocking-resources\n- Current value: Est savings of 1,560 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\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": "server-response-time",
          "title": "Reduce initial server response time",
          "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": 0,
          "displayValue": "Root document took 1,240 ms",
          "impact": "high",
          "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 Reduce initial server response time\n\n- Lighthouse audit: server-response-time\n- Current value: Root document took 1,240 ms\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": "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,
          "displayValue": "1,216 elements",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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: 1,216 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"
        },
        {
          "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": 0.69,
          "displayValue": "4.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 Speed Index\n\n- Lighthouse audit: speed-index\n- Current value: 4.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\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": 0.5,
          "displayValue": "Est savings of 32 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 32 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": "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": 0.5,
          "displayValue": "Est savings of 86 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 Enable text compression\n\n- Lighthouse audit: uses-text-compression\n- Current value: Est savings of 86 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\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"
        }
      ]
    },
    {
      "url": "https://barcelona.cat/ca/que-pots-fer-a-bcn/llistat",
      "status": "ok",
      "finalUrl": "https://www.barcelona.cat/ca/que-pots-fer-a-bcn/llistat",
      "performanceScore": 0.66,
      "bestPracticesScore": 1,
      "transferBytes": 1394757,
      "co2Grams": 0.5343054642198,
      "greenWeb": {
        "page": {
          "hostname": "www.barcelona.cat",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-13T22:38:00.231825",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.barcelona.cat",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76426,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "stylesheet",
            "requestCount": 1,
            "transferBytes": 24654,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "cdnjs.cloudflare.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15869,
            "sampleUrl": "https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js",
            "greenCheck": {
              "hostname": "cdnjs.cloudflare.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:34",
              "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/cdnjs.cloudflare.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15565,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7145,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 4111,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/css/bcn-avisos.css",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "fonts.googleapis.com",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 2484,
            "sampleUrl": "https://fonts.googleapis.com/css?family=Source+Sans+3:200,200i,300,300i,400,400i,500,500i,600,600i,700,700i,900,900i",
            "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
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=EC46V9&url=https%3A%2F%2Fwww.barcelona.cat%2Fca%2Fque-pots-fer-a-bcn%2Fllistat",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 11,
          "greenCount": 5,
          "notGreenCount": 7,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 75,
        "urgency": "high",
        "pageElementOccurrences": 9,
        "uniqueElementsAssessed": 2,
        "reusedFromCacheCount": 2,
        "components": [
          {
            "signature": "form|get|/ca|input|text|query|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "text",
            "fieldName": "query",
            "formContext": "form|get|/ca",
            "hasLabel": true,
            "hasValidationRule": false,
            "hasErrorMessagingHook": false,
            "toolingFriendly": false,
            "assessment": {
              "score": 60,
              "urgency": "high",
              "issues": [
                "No explicit validation rule",
                "No error messaging hook",
                "Missing autocomplete for tooling support"
              ],
              "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.",
                "Provide meaningful autocomplete values to support browsers and assistive tooling."
              ]
            },
            "reusedFromCache": true
          },
          {
            "signature": "no-form|select|select|anonymous|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "select",
            "fieldName": null,
            "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": "No explicit validation rule",
            "urgency": "medium",
            "detail": "2 unique form control signature(s) on this page include this issue."
          },
          {
            "title": "No error messaging hook",
            "urgency": "medium",
            "detail": "2 unique form control signature(s) on this page include this issue."
          },
          {
            "title": "Missing autocomplete for tooling support",
            "urgency": "medium",
            "detail": "1 unique form control signature(s) on this page include this issue."
          },
          {
            "title": "Missing associated label",
            "urgency": "high",
            "detail": "1 unique form control signature(s) on this page include this issue."
          }
        ]
      },
      "metadata": {
        "score": 25,
        "urgency": "low",
        "checks": {
          "hasTitle": true,
          "hasLang": true,
          "hasDescription": false,
          "hasCanonical": true,
          "hasOpenGraphCore": false,
          "hasTwitterCard": true,
          "hasViewport": true,
          "hasCharset": true,
          "hasValidStructuredData": true,
          "hasInvalidStructuredData": false
        },
        "observed": {
          "title": "Llistat | Barcelona.cat | Ajuntament de Barcelona",
          "lang": "ca",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "",
          "robots": "",
          "canonical": "https://www.barcelona.cat/ca/que-pots-fer-a-bcn/llistat",
          "ogTitle": "Llistat",
          "ogDescription": "",
          "ogType": "Web",
          "ogUrl": "https://www.barcelona.cat/ca/que-pots-fer-a-bcn/llistat",
          "twitterCard": "summary_large_image",
          "ldJsonCount": 0,
          "validLdJsonCount": 0,
          "invalidLdJsonCount": 0
        },
        "recommendations": [
          {
            "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."
          }
        ]
      },
      "layoutAdaptation": {
        "score": 30,
        "urgency": "medium",
        "checks": {
          "testedMobile": true,
          "testedTablet": true,
          "horizontalOverflowOnMobile": false,
          "horizontalOverflowOnTablet": false,
          "mobileSmallTapTargets": 69,
          "tabletSmallTapTargets": 69,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 69,
            "oversizedMedia": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 69,
            "oversizedMedia": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 69 small targets on mobile and 69 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 59,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": true,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": true,
          "externalScriptCount": 8,
          "externalScriptsWithoutIntegrity": 8,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "cache-control": "max-age=300, public",
            "content-encoding": "gzip",
            "content-language": "ca",
            "content-length": "13323",
            "content-type": "text/html; charset=UTF-8",
            "date": "Mon, 13 Apr 2026 22:59:25 GMT",
            "etag": "\"1776121164-gzip\"",
            "expires": "Sun, 19 Nov 1978 05:00:00 GMT",
            "last-modified": "Mon, 13 Apr 2026 22:59:24 GMT",
            "server": "nginx",
            "vary": "Cookie,Accept-Encoding",
            "via": "1.1 ca2190123e61f1744d1210c24c87c840.cloudfront.net (CloudFront)",
            "x-amz-cf-id": "CTzaFNm8QzTdRXj2F69fUOeMxwnAPqwfDG5uncBaEXsfMvRYW5ruhA==",
            "x-amz-cf-pop": "IAD12-P5",
            "x-cache": "Miss from cloudfront",
            "x-content-type-options": "nosniff",
            "x-frame-options": "SAMEORIGIN",
            "x-generator": "Drupal 10 (https://www.drupal.org)"
          },
          "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": "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": "8 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 25,
        "urgency": "low",
        "origin": "https://www.barcelona.cat",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://www.barcelona.cat/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/sitemap.xml",
            "found": true,
            "status": 200,
            "contentType": "application/xml; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/manifest.webmanifest",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/favicon.ico",
            "found": true,
            "status": 200,
            "contentType": "image/x-icon"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "low",
            "detail": "Missing beneficial file(s): /.well-known/security.txt, /manifest.webmanifest."
          }
        ]
      },
      "mediaHints": {
        "score": 50,
        "urgency": "medium",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 21,
          "imagesWithLazy": 0,
          "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 21 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 85,
        "urgency": "medium",
        "data": {
          "hasPrintStyles": true,
          "hasReducedMotion": true,
          "media": {
            "totalImages": 26,
            "lazyImages": 1,
            "totalIframes": 1,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "\"Source Sans Pro\", \"Helvetica Neue\", Helvetica, Arial, sans-serif",
            "usesSystemFont": true
          },
          "tracking": {
            "count": 0,
            "scripts": []
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 1/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": "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"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 41,
        "urgency": "medium",
        "totalEstimatedSavingsBytes": 568008.6,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Use modern image compression formats",
            "urgency": "high",
            "estimatedSavingsBytes": 418656.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": "medium",
            "estimatedSavingsBytes": 149352,
            "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: 408.84 KB."
          },
          {
            "title": "Improve image encoding quality/size",
            "urgency": "medium",
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 145.85 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": 1322507.6,
        "totalEstimatedBlockingMs": 1787,
        "opportunities": [
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 630100,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 615 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": 418656.6,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 409 KiB",
            "urgency": "high",
            "sourceAuditId": "modern-image-formats"
          },
          {
            "id": "render-blocking-resources",
            "title": "Eliminate render-blocking resources",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering.",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1787,
            "displayValue": "Est savings of 1,790 ms",
            "urgency": "high",
            "sourceAuditId": "render-blocking-resources"
          },
          {
            "id": "uses-optimized-images",
            "title": "Compress oversized image assets",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss.",
            "estimatedSavingsBytes": 149352,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 146 KiB",
            "urgency": "medium",
            "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": 91918,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 90 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-css-rules"
          },
          {
            "id": "unused-javascript",
            "title": "Remove unused JavaScript",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code.",
            "estimatedSavingsBytes": 32481,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 32 KiB",
            "urgency": "low",
            "sourceAuditId": "unused-javascript"
          }
        ],
        "recommendations": [
          {
            "title": "Lazy-load offscreen images",
            "urgency": "high",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 615.33 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: 408.84 KB."
          },
          {
            "title": "Eliminate render-blocking resources",
            "urgency": "high",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering. Estimated render unblocking: 1787 ms."
          },
          {
            "title": "Compress oversized image assets",
            "urgency": "medium",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 145.85 KB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "medium",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 89.76 KB."
          },
          {
            "title": "Remove unused JavaScript",
            "urgency": "low",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 31.72 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": 10,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 8,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "8 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": 692676.9894553074
        },
        "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: 676.44 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: 676.44 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": "medium",
        "transferBytes": 1394757,
        "css": {
          "unusedBytes": 91918,
          "ratio": 0.06590251922019391,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 32481,
          "duplicatedBytes": 0,
          "ratio": 0.023287927574480716,
          "auditIds": [
            "unused-javascript",
            "duplicated-javascript"
          ]
        },
        "html": {
          "estimatedPenalty": 0.25,
          "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": "high",
            "estimatedSavingsBytes": 91918,
            "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": "medium",
            "estimatedSavingsBytes": 32481,
            "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": 1394757,
        "estimatedDeferrableBytes": 754499,
        "renderBlockingMs": 1787,
        "breakdown": {
          "offscreenImageSavings": 630100,
          "unusedJavascriptSavings": 32481,
          "unusedCssSavings": 91918
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "high",
            "estimatedSavingsBytes": 630100,
            "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": "medium",
            "estimatedSavingsBytes": 32481,
            "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": "high",
            "estimatedSavingsBytes": 91918,
            "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": "Eliminate render-blocking resources",
            "area": "render-path",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1787,
            "strategy": "Defer scripts/styles not required for first paint and preload only truly critical assets.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-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 www.barcelona.cat",
            "area": "font",
            "urgency": "medium",
            "estimatedSavingsBytes": 90560,
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "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 estatics-nasia.dtibcn.cat",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 85081,
            "url": "https://estatics-nasia.dtibcn.cat/nasia-pro/media/estunen.570x321.792fd017.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 image from www.barcelona.cat",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 84135,
            "url": "https://www.barcelona.cat/themes/barcelonacat_theme/images/menu/viula.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 cdn.matomo.cloud",
            "area": "script",
            "urgency": "medium",
            "estimatedSavingsBytes": 76426,
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.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": 65,
        "urgency": "high",
        "providerCount": 8,
        "requestCount": 9,
        "transferBytes": 155327,
        "notGreenCount": 5,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76426,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "cdnjs.cloudflare.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15869,
            "sampleUrl": "https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js",
            "greenCheck": {
              "hostname": "cdnjs.cloudflare.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:34",
              "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/cdnjs.cloudflare.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15565,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7145,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=EC46V9&url=https%3A%2F%2Fwww.barcelona.cat%2Fca%2Fque-pots-fer-a-bcn%2Fllistat",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "high",
            "detail": "Track 8 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."
          },
          {
            "title": "Prioritize greener alternatives for third-party providers",
            "urgency": "high",
            "detail": "5 third-party script origin(s) are not confirmed green in the Green Web Foundation dataset."
          }
        ]
      },
      "redundancy": {
        "score": 25,
        "urgency": "low",
        "transferBytes": 1394757,
        "estimatedRedundantBytes": 124399,
        "redundancyRatio": 0.08919044679467462,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 91918,
            "displayValue": "Est savings of 90 KiB"
          },
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 32481,
            "displayValue": "Est savings of 32 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 91918,
            "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 unused javascript",
            "urgency": "medium",
            "estimatedSavingsBytes": 32481,
            "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 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": 21,
        "urgency": "medium",
        "totalTransferBytes": 1394757,
        "heavyRequestCount": 4,
        "heavyBytes": 271002,
        "heavyRatio": 0.19430051256240335,
        "heavyRequests": [
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "transferSize": 90560,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "transferSize": 76426,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "cdn.matomo.cloud"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament/fonts/icoajuntament.ttf?8aaig7",
            "transferSize": 54921,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/css/css_evpTRQTawGYS1Ro7RbXq3hBxwat7AU-RJm1V8ZgzeaE.css?delta=5&language=ca&theme=barcelonacat_theme&include=eJyFztEOwiAMheEXgnDhA5EDq4gySmiZ7u1dYuJinPGqTf_voriOqpipqseShcW9hkXLBntMI8NNUGo53qh_JzpjFBUT0CMVrohQzwv1nicSt8lhlbls_ZdpSGSXTPdPoBeayQVmFe1oPk71CKTCAcWKriXXdCRyZLv_fSSEx3bzgir-9A-0zibE6jfW4d6bp4dSryhGVlGaXYDQE_H9jbg&tcut5n",
            "transferSize": 49095,
            "resourceType": "stylesheet",
            "mimeType": "text/css",
            "domain": "www.barcelona.cat"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "font",
            "count": 2,
            "transferBytes": 145481
          },
          {
            "resourceType": "script",
            "count": 1,
            "transferBytes": 76426
          },
          {
            "resourceType": "stylesheet",
            "count": 1,
            "transferBytes": 49095
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.barcelona.cat",
            "count": 3,
            "transferBytes": 194576
          },
          {
            "domain": "cdn.matomo.cloud",
            "count": 1,
            "transferBytes": 76426
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Lazy-load offscreen images and media galleries",
            "urgency": "high",
            "estimatedSavingsBytes": 630100,
            "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": "Defer non-critical UI modules until after first render",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "strategy": "Keep only above-the-fold resources in the initial path; hydrate or import secondary modules later.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 www.barcelona.cat",
            "urgency": "medium",
            "estimatedSavingsBytes": 90560,
            "strategy": "Subset or defer this font so full font payloads are only fetched when needed.",
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 cdn.matomo.cloud",
            "urgency": "medium",
            "estimatedSavingsBytes": 76426,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.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.03,
          "displayValue": "7.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: 7.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,
          "displayValue": "Est savings of 90 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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 90 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,
          "displayValue": "Est savings of 409 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 409 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 146 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 146 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,
          "displayValue": "Est savings of 615 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 615 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": "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": 0,
          "displayValue": "Est savings of 1,790 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 Eliminate render-blocking resources\n\n- Lighthouse audit: render-blocking-resources\n- Current value: Est savings of 1,790 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\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": "server-response-time",
          "title": "Reduce initial server response time",
          "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": 0,
          "displayValue": "Root document took 850 ms",
          "impact": "high",
          "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 Reduce initial server response time\n\n- Lighthouse audit: server-response-time\n- Current value: Root document took 850 ms\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": "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,
          "displayValue": "1,168 elements",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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: 1,168 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"
        },
        {
          "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": 0.72,
          "displayValue": "4.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 Speed Index\n\n- Lighthouse audit: speed-index\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\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": 0.5,
          "displayValue": "Est savings of 32 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 32 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"
        }
      ]
    },
    {
      "url": "https://barcelona.cat/en/what-to-do-in-bcn/summer/municipal-tax-office",
      "status": "ok",
      "finalUrl": "https://www.barcelona.cat/en/what-to-do-in-bcn/summer/municipal-tax-office",
      "performanceScore": 0.67,
      "bestPracticesScore": 1,
      "transferBytes": 826612,
      "co2Grams": 0.31665968221679996,
      "greenWeb": {
        "page": {
          "hostname": "www.barcelona.cat",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-13T22:38:00.231825",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.barcelona.cat",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76424,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31747,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "stylesheet",
            "requestCount": 1,
            "transferBytes": 24654,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "cdnjs.cloudflare.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15868,
            "sampleUrl": "https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js",
            "greenCheck": {
              "hostname": "cdnjs.cloudflare.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:34",
              "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/cdnjs.cloudflare.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15566,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7144,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 4113,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/css/bcn-avisos.css",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "fonts.googleapis.com",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 2483,
            "sampleUrl": "https://fonts.googleapis.com/css?family=Source+Sans+3:200,200i,300,300i,400,400i,500,500i,600,600i,700,700i,900,900i",
            "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
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=X0qg23&url=https%3A%2F%2Fwww.barcelona.cat%2Fen%2Fwhat-to-do-in-bcn%2Fsummer%2Fmunicipal-tax-office",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 11,
          "greenCount": 5,
          "notGreenCount": 7,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 75,
        "urgency": "high",
        "pageElementOccurrences": 5,
        "uniqueElementsAssessed": 2,
        "reusedFromCacheCount": 2,
        "components": [
          {
            "signature": "form|get|/en|input|text|query|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "text",
            "fieldName": "query",
            "formContext": "form|get|/en",
            "hasLabel": true,
            "hasValidationRule": false,
            "hasErrorMessagingHook": false,
            "toolingFriendly": false,
            "assessment": {
              "score": 60,
              "urgency": "high",
              "issues": [
                "No explicit validation rule",
                "No error messaging hook",
                "Missing autocomplete for tooling support"
              ],
              "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.",
                "Provide meaningful autocomplete values to support browsers and assistive tooling."
              ]
            },
            "reusedFromCache": true
          },
          {
            "signature": "no-form|select|select|anonymous|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "select",
            "fieldName": null,
            "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": "No explicit validation rule",
            "urgency": "medium",
            "detail": "2 unique form control signature(s) on this page include this issue."
          },
          {
            "title": "No error messaging hook",
            "urgency": "medium",
            "detail": "2 unique form control signature(s) on this page include this issue."
          },
          {
            "title": "Missing autocomplete for tooling support",
            "urgency": "medium",
            "detail": "1 unique form control signature(s) on this page include this issue."
          },
          {
            "title": "Missing associated label",
            "urgency": "high",
            "detail": "1 unique form control signature(s) on this page include this issue."
          }
        ]
      },
      "metadata": {
        "score": 25,
        "urgency": "low",
        "checks": {
          "hasTitle": true,
          "hasLang": true,
          "hasDescription": false,
          "hasCanonical": true,
          "hasOpenGraphCore": false,
          "hasTwitterCard": true,
          "hasViewport": true,
          "hasCharset": true,
          "hasValidStructuredData": true,
          "hasInvalidStructuredData": false
        },
        "observed": {
          "title": "Municipal Tax Office | Barcelona.cat | Ajuntament de Barcelona",
          "lang": "en",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "",
          "robots": "",
          "canonical": "https://www.barcelona.cat/en/what-to-do-in-bcn/summer/municipal-tax-office",
          "ogTitle": "Municipal Tax Office",
          "ogDescription": "",
          "ogType": "Web",
          "ogUrl": "https://www.barcelona.cat/en/what-to-do-in-bcn/summer/municipal-tax-office",
          "twitterCard": "summary_large_image",
          "ldJsonCount": 0,
          "validLdJsonCount": 0,
          "invalidLdJsonCount": 0
        },
        "recommendations": [
          {
            "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."
          }
        ]
      },
      "layoutAdaptation": {
        "score": 30,
        "urgency": "medium",
        "checks": {
          "testedMobile": true,
          "testedTablet": true,
          "horizontalOverflowOnMobile": false,
          "horizontalOverflowOnTablet": false,
          "mobileSmallTapTargets": 41,
          "tabletSmallTapTargets": 41,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 41,
            "oversizedMedia": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 41,
            "oversizedMedia": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 41 small targets on mobile and 41 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 59,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": true,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": true,
          "externalScriptCount": 8,
          "externalScriptsWithoutIntegrity": 8,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "cache-control": "max-age=300, public",
            "content-encoding": "gzip",
            "content-language": "en",
            "content-length": "10603",
            "content-type": "text/html; charset=UTF-8",
            "date": "Mon, 13 Apr 2026 22:59:40 GMT",
            "etag": "\"1776121179-gzip\"",
            "expires": "Sun, 19 Nov 1978 05:00:00 GMT",
            "last-modified": "Mon, 13 Apr 2026 22:59:39 GMT",
            "server": "nginx",
            "vary": "Cookie,Accept-Encoding",
            "via": "1.1 ca2190123e61f1744d1210c24c87c840.cloudfront.net (CloudFront)",
            "x-amz-cf-id": "Lghh1ks9poo7JZud62jXsa-dQyknevEfX7FzfZDeTs098d2Imwof4Q==",
            "x-amz-cf-pop": "IAD12-P5",
            "x-cache": "Miss from cloudfront",
            "x-content-type-options": "nosniff",
            "x-frame-options": "SAMEORIGIN",
            "x-generator": "Drupal 10 (https://www.drupal.org)"
          },
          "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": "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": "8 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 25,
        "urgency": "low",
        "origin": "https://www.barcelona.cat",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://www.barcelona.cat/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/sitemap.xml",
            "found": true,
            "status": 200,
            "contentType": "application/xml; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/manifest.webmanifest",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/favicon.ico",
            "found": true,
            "status": 200,
            "contentType": "image/x-icon"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "low",
            "detail": "Missing beneficial file(s): /.well-known/security.txt, /manifest.webmanifest."
          }
        ]
      },
      "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": 85,
        "urgency": "medium",
        "data": {
          "hasPrintStyles": true,
          "hasReducedMotion": true,
          "media": {
            "totalImages": 17,
            "lazyImages": 1,
            "totalIframes": 1,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "\"Source Sans Pro\", \"Helvetica Neue\", Helvetica, Arial, sans-serif",
            "usesSystemFont": true
          },
          "tracking": {
            "count": 0,
            "scripts": []
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 1/17 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": "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"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 16,
        "urgency": "low",
        "totalEstimatedSavingsBytes": 130442.55,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Use modern image compression formats",
            "urgency": "medium",
            "estimatedSavingsBytes": 72410.55,
            "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size."
          },
          {
            "id": "uses-optimized-images",
            "title": "Improve image encoding quality/size",
            "urgency": "medium",
            "estimatedSavingsBytes": 58032,
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings."
          }
        ],
        "recommendations": [
          {
            "title": "Use modern image compression formats",
            "urgency": "medium",
            "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size. Estimated savings: 70.71 KB."
          },
          {
            "title": "Improve image encoding quality/size",
            "urgency": "medium",
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 56.67 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": 342199.55,
        "totalEstimatedBlockingMs": 1624,
        "opportunities": [
          {
            "id": "render-blocking-resources",
            "title": "Eliminate render-blocking resources",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering.",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1624,
            "displayValue": "Est savings of 1,620 ms",
            "urgency": "high",
            "sourceAuditId": "render-blocking-resources"
          },
          {
            "id": "unused-css-rules",
            "title": "Remove unused CSS",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped.",
            "estimatedSavingsBytes": 92167,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 90 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-css-rules"
          },
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 87109,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 85 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": 72410.55,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 71 KiB",
            "urgency": "medium",
            "sourceAuditId": "modern-image-formats"
          },
          {
            "id": "uses-optimized-images",
            "title": "Compress oversized image assets",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss.",
            "estimatedSavingsBytes": 58032,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 57 KiB",
            "urgency": "medium",
            "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": 32481,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 32 KiB",
            "urgency": "low",
            "sourceAuditId": "unused-javascript"
          }
        ],
        "recommendations": [
          {
            "title": "Eliminate render-blocking resources",
            "urgency": "high",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering. Estimated render unblocking: 1624 ms."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "medium",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 90.01 KB."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "medium",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 85.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: 70.71 KB."
          },
          {
            "title": "Compress oversized image assets",
            "urgency": "medium",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 56.67 KB."
          },
          {
            "title": "Remove unused JavaScript",
            "urgency": "low",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 31.72 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": 10,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 8,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "8 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": 167996.97751396647
        },
        "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: 164.06 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: 164.06 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": "medium",
        "transferBytes": 826612,
        "css": {
          "unusedBytes": 92167,
          "ratio": 0.11149971207773417,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 32481,
          "duplicatedBytes": 0,
          "ratio": 0.039294130740903835,
          "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": "high",
            "estimatedSavingsBytes": 92167,
            "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": "medium",
            "estimatedSavingsBytes": 32481,
            "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": 826612,
        "estimatedDeferrableBytes": 211757,
        "renderBlockingMs": 1624,
        "breakdown": {
          "offscreenImageSavings": 87109,
          "unusedJavascriptSavings": 32481,
          "unusedCssSavings": 92167
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 87109,
            "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": "medium",
            "estimatedSavingsBytes": 32481,
            "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": "high",
            "estimatedSavingsBytes": 92167,
            "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": "Eliminate render-blocking resources",
            "area": "render-path",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1624,
            "strategy": "Defer scripts/styles not required for first paint and preload only truly critical assets.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-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 www.barcelona.cat",
            "area": "font",
            "urgency": "medium",
            "estimatedSavingsBytes": 90560,
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "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 www.barcelona.cat",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 84135,
            "url": "https://www.barcelona.cat/themes/barcelonacat_theme/images/menu/viula.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 cdn.matomo.cloud",
            "area": "script",
            "urgency": "medium",
            "estimatedSavingsBytes": 76424,
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.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": 65,
        "urgency": "high",
        "providerCount": 8,
        "requestCount": 9,
        "transferBytes": 155325,
        "notGreenCount": 5,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76424,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31747,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "cdnjs.cloudflare.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15868,
            "sampleUrl": "https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js",
            "greenCheck": {
              "hostname": "cdnjs.cloudflare.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:34",
              "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/cdnjs.cloudflare.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15566,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7144,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=X0qg23&url=https%3A%2F%2Fwww.barcelona.cat%2Fen%2Fwhat-to-do-in-bcn%2Fsummer%2Fmunicipal-tax-office",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "high",
            "detail": "Track 8 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."
          },
          {
            "title": "Prioritize greener alternatives for third-party providers",
            "urgency": "high",
            "detail": "5 third-party script origin(s) are not confirmed green in the Green Web Foundation dataset."
          }
        ]
      },
      "redundancy": {
        "score": 18,
        "urgency": "low",
        "transferBytes": 826612,
        "estimatedRedundantBytes": 124648,
        "redundancyRatio": 0.150793842818638,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 92167,
            "displayValue": "Est savings of 90 KiB"
          },
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 32481,
            "displayValue": "Est savings of 32 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 92167,
            "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 unused javascript",
            "urgency": "medium",
            "estimatedSavingsBytes": 32481,
            "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 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": 20,
        "urgency": "medium",
        "totalTransferBytes": 826612,
        "heavyRequestCount": 4,
        "heavyBytes": 270999,
        "heavyRatio": 0.32784305091143123,
        "heavyRequests": [
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "transferSize": 90560,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "transferSize": 76424,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "cdn.matomo.cloud"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament/fonts/icoajuntament.ttf?8aaig7",
            "transferSize": 54920,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/css/css_evpTRQTawGYS1Ro7RbXq3hBxwat7AU-RJm1V8ZgzeaE.css?delta=5&language=en&theme=barcelonacat_theme&include=eJyFztEOwiAMheEXgnDhA5EDq4gySmiZ7u1dYuJinPGqTf_voriOqpipqseShcW9hkXLBntMI8NNUGo53qh_JzpjFBUT0CMVrohQzwv1nicSt8lhlbls_ZdpSGSXTPdPoBeayQVmFe1oPk71CKTCAcWKriXXdCRyZLv_fSSEx3bzgir-9A-0zibE6jfW4d6bp4dSryhGVlGaXYDQE_H9jbg&tcut5n",
            "transferSize": 49095,
            "resourceType": "stylesheet",
            "mimeType": "text/css",
            "domain": "www.barcelona.cat"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "font",
            "count": 2,
            "transferBytes": 145480
          },
          {
            "resourceType": "script",
            "count": 1,
            "transferBytes": 76424
          },
          {
            "resourceType": "stylesheet",
            "count": 1,
            "transferBytes": 49095
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.barcelona.cat",
            "count": 3,
            "transferBytes": 194575
          },
          {
            "domain": "cdn.matomo.cloud",
            "count": 1,
            "transferBytes": 76424
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Lazy-load offscreen images and media galleries",
            "urgency": "medium",
            "estimatedSavingsBytes": 87109,
            "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": "Defer non-critical UI modules until after first render",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "strategy": "Keep only above-the-fold resources in the initial path; hydrate or import secondary modules later.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 www.barcelona.cat",
            "urgency": "medium",
            "estimatedSavingsBytes": 90560,
            "strategy": "Subset or defer this font so full font payloads are only fetched when needed.",
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 cdn.matomo.cloud",
            "urgency": "medium",
            "estimatedSavingsBytes": 76424,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.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.1,
          "displayValue": "6.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: 6.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-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,
          "displayValue": "Est savings of 90 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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 90 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,
          "displayValue": "Est savings of 71 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 71 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 57 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 57 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,
          "displayValue": "Est savings of 85 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 85 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": "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": 0,
          "displayValue": "Est savings of 1,620 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 Eliminate render-blocking resources\n\n- Lighthouse audit: render-blocking-resources\n- Current value: Est savings of 1,620 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\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": "server-response-time",
          "title": "Reduce initial server response time",
          "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": 0,
          "displayValue": "Root document took 1,430 ms",
          "impact": "high",
          "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 Reduce initial server response time\n\n- Lighthouse audit: server-response-time\n- Current value: Root document took 1,430 ms\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": "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": 0.67,
          "displayValue": "4.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 Speed Index\n\n- Lighthouse audit: speed-index\n- Current value: 4.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\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": 0.5,
          "displayValue": "Est savings of 32 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 32 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": "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": "953 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: 953 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://barcelona.cat/en/living-in-bcn/environment-and-sustainability/list-containers",
      "status": "ok",
      "finalUrl": "https://www.barcelona.cat/en/living-in-bcn/environment-and-sustainability/list-containers",
      "performanceScore": 0.67,
      "bestPracticesScore": 1,
      "transferBytes": 850290,
      "co2Grams": 0.325730283606,
      "greenWeb": {
        "page": {
          "hostname": "www.barcelona.cat",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-13T22:38:00.231825",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.barcelona.cat",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76427,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "stylesheet",
            "requestCount": 1,
            "transferBytes": 24654,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "cdnjs.cloudflare.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15869,
            "sampleUrl": "https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js",
            "greenCheck": {
              "hostname": "cdnjs.cloudflare.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:34",
              "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/cdnjs.cloudflare.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15565,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7147,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 4117,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/css/bcn-avisos.css",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "fonts.googleapis.com",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 2482,
            "sampleUrl": "https://fonts.googleapis.com/css?family=Source+Sans+3:200,200i,300,300i,400,400i,500,500i,600,600i,700,700i,900,900i",
            "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
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=tXCosY&url=https%3A%2F%2Fwww.barcelona.cat%2Fen%2Fliving-in-bcn%2Fenvironment-and-sustainability%2Flist-containers",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 11,
          "greenCount": 5,
          "notGreenCount": 7,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 75,
        "urgency": "high",
        "pageElementOccurrences": 4,
        "uniqueElementsAssessed": 2,
        "reusedFromCacheCount": 2,
        "components": [
          {
            "signature": "form|get|/en|input|text|query|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "text",
            "fieldName": "query",
            "formContext": "form|get|/en",
            "hasLabel": true,
            "hasValidationRule": false,
            "hasErrorMessagingHook": false,
            "toolingFriendly": false,
            "assessment": {
              "score": 60,
              "urgency": "high",
              "issues": [
                "No explicit validation rule",
                "No error messaging hook",
                "Missing autocomplete for tooling support"
              ],
              "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.",
                "Provide meaningful autocomplete values to support browsers and assistive tooling."
              ]
            },
            "reusedFromCache": true
          },
          {
            "signature": "no-form|select|select|anonymous|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "select",
            "fieldName": null,
            "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": "No explicit validation rule",
            "urgency": "medium",
            "detail": "2 unique form control signature(s) on this page include this issue."
          },
          {
            "title": "No error messaging hook",
            "urgency": "medium",
            "detail": "2 unique form control signature(s) on this page include this issue."
          },
          {
            "title": "Missing autocomplete for tooling support",
            "urgency": "medium",
            "detail": "1 unique form control signature(s) on this page include this issue."
          },
          {
            "title": "Missing associated label",
            "urgency": "high",
            "detail": "1 unique form control signature(s) on this page include this issue."
          }
        ]
      },
      "metadata": {
        "score": 25,
        "urgency": "low",
        "checks": {
          "hasTitle": true,
          "hasLang": true,
          "hasDescription": false,
          "hasCanonical": true,
          "hasOpenGraphCore": false,
          "hasTwitterCard": true,
          "hasViewport": true,
          "hasCharset": true,
          "hasValidStructuredData": true,
          "hasInvalidStructuredData": false
        },
        "observed": {
          "title": "List of containers | Barcelona.cat | Ajuntament de Barcelona",
          "lang": "en",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "",
          "robots": "",
          "canonical": "https://www.barcelona.cat/en/living-in-bcn/environment-and-sustainability/list-containers",
          "ogTitle": "List of containers",
          "ogDescription": "",
          "ogType": "Web",
          "ogUrl": "https://www.barcelona.cat/en/living-in-bcn/environment-and-sustainability/list-containers",
          "twitterCard": "summary_large_image",
          "ldJsonCount": 0,
          "validLdJsonCount": 0,
          "invalidLdJsonCount": 0
        },
        "recommendations": [
          {
            "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."
          }
        ]
      },
      "layoutAdaptation": {
        "score": 30,
        "urgency": "medium",
        "checks": {
          "testedMobile": true,
          "testedTablet": true,
          "horizontalOverflowOnMobile": false,
          "horizontalOverflowOnTablet": false,
          "mobileSmallTapTargets": 48,
          "tabletSmallTapTargets": 48,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 48,
            "oversizedMedia": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 48,
            "oversizedMedia": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 48 small targets on mobile and 48 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 59,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": true,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": true,
          "externalScriptCount": 8,
          "externalScriptsWithoutIntegrity": 8,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "cache-control": "max-age=300, public",
            "content-encoding": "gzip",
            "content-language": "en",
            "content-length": "11427",
            "content-type": "text/html; charset=UTF-8",
            "date": "Mon, 13 Apr 2026 22:59:54 GMT",
            "etag": "\"1776121193-gzip\"",
            "expires": "Sun, 19 Nov 1978 05:00:00 GMT",
            "last-modified": "Mon, 13 Apr 2026 22:59:53 GMT",
            "server": "nginx",
            "vary": "Cookie,Accept-Encoding",
            "via": "1.1 ca2190123e61f1744d1210c24c87c840.cloudfront.net (CloudFront)",
            "x-amz-cf-id": "KfEfqgjomyUJe_5E0gtJJFOlbHHrPm0H_dtpkNncJTGwaie2P8hq5g==",
            "x-amz-cf-pop": "IAD12-P5",
            "x-cache": "Miss from cloudfront",
            "x-content-type-options": "nosniff",
            "x-frame-options": "SAMEORIGIN",
            "x-generator": "Drupal 10 (https://www.drupal.org)"
          },
          "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": "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": "8 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 25,
        "urgency": "low",
        "origin": "https://www.barcelona.cat",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://www.barcelona.cat/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/sitemap.xml",
            "found": true,
            "status": 200,
            "contentType": "application/xml; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/manifest.webmanifest",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/favicon.ico",
            "found": true,
            "status": 200,
            "contentType": "image/x-icon"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "low",
            "detail": "Missing beneficial file(s): /.well-known/security.txt, /manifest.webmanifest."
          }
        ]
      },
      "mediaHints": {
        "score": 50,
        "urgency": "medium",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 21,
          "imagesWithLazy": 0,
          "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 21 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 85,
        "urgency": "medium",
        "data": {
          "hasPrintStyles": true,
          "hasReducedMotion": true,
          "media": {
            "totalImages": 26,
            "lazyImages": 1,
            "totalIframes": 1,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "\"Source Sans Pro\", \"Helvetica Neue\", Helvetica, Arial, sans-serif",
            "usesSystemFont": true
          },
          "tracking": {
            "count": 0,
            "scripts": []
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 1/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": "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"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 18,
        "urgency": "low",
        "totalEstimatedSavingsBytes": 150846.55,
        "checks": {
          "hasEffectiveTextCompression": false
        },
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Use modern image compression formats",
            "urgency": "medium",
            "estimatedSavingsBytes": 72410.55,
            "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size."
          },
          {
            "id": "uses-optimized-images",
            "title": "Improve image encoding quality/size",
            "urgency": "medium",
            "estimatedSavingsBytes": 58032,
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings."
          },
          {
            "id": "uses-text-compression",
            "title": "Enable Brotli/gzip for text assets",
            "urgency": "low",
            "estimatedSavingsBytes": 20404,
            "detail": "Compress HTML, CSS, JS, JSON, SVG, and XML responses with Brotli or gzip."
          }
        ],
        "recommendations": [
          {
            "title": "Use modern image compression formats",
            "urgency": "medium",
            "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size. Estimated savings: 70.71 KB."
          },
          {
            "title": "Improve image encoding quality/size",
            "urgency": "medium",
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 56.67 KB."
          },
          {
            "title": "Enable Brotli/gzip for text assets",
            "urgency": "low",
            "detail": "Compress HTML, CSS, JS, JSON, SVG, and XML responses with Brotli or gzip. Estimated savings: 19.93 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": 278837.55,
        "totalEstimatedBlockingMs": 1025,
        "opportunities": [
          {
            "id": "render-blocking-resources",
            "title": "Eliminate render-blocking resources",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering.",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1025,
            "displayValue": "Est savings of 1,030 ms",
            "urgency": "high",
            "sourceAuditId": "render-blocking-resources"
          },
          {
            "id": "unused-css-rules",
            "title": "Remove unused CSS",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped.",
            "estimatedSavingsBytes": 92061,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 90 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-css-rules"
          },
          {
            "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": 72410.55,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 71 KiB",
            "urgency": "medium",
            "sourceAuditId": "modern-image-formats"
          },
          {
            "id": "uses-optimized-images",
            "title": "Compress oversized image assets",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss.",
            "estimatedSavingsBytes": 58032,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 57 KiB",
            "urgency": "medium",
            "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": 32481,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 32 KiB",
            "urgency": "low",
            "sourceAuditId": "unused-javascript"
          },
          {
            "id": "uses-text-compression",
            "title": "Enable text compression",
            "detail": "Serve text assets with Brotli or gzip to remove avoidable transfer bloat.",
            "estimatedSavingsBytes": 20404,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 20 KiB",
            "urgency": "low",
            "sourceAuditId": "uses-text-compression"
          },
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 3449,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 3 KiB",
            "urgency": "low",
            "sourceAuditId": "offscreen-images"
          }
        ],
        "recommendations": [
          {
            "title": "Eliminate render-blocking resources",
            "urgency": "high",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering. Estimated render unblocking: 1025 ms."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "medium",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 89.90 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: 70.71 KB."
          },
          {
            "title": "Compress oversized image assets",
            "urgency": "medium",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 56.67 KB."
          },
          {
            "title": "Remove unused JavaScript",
            "urgency": "low",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 31.72 KB."
          },
          {
            "title": "Enable text compression",
            "urgency": "low",
            "detail": "Serve text assets with Brotli or gzip to remove avoidable transfer bloat. Estimated byte savings: 19.93 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": 10,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 8,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "8 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": 168009.2516759777
        },
        "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: 164.07 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: 164.07 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": "medium",
        "transferBytes": 850290,
        "css": {
          "unusedBytes": 92061,
          "ratio": 0.10827011960625199,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 32481,
          "duplicatedBytes": 0,
          "ratio": 0.0381999082665914,
          "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": "high",
            "estimatedSavingsBytes": 92061,
            "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": "medium",
            "estimatedSavingsBytes": 32481,
            "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": 14,
        "urgency": "high",
        "transferBytes": 850290,
        "estimatedDeferrableBytes": 127991,
        "renderBlockingMs": 1025,
        "breakdown": {
          "offscreenImageSavings": 3449,
          "unusedJavascriptSavings": 32481,
          "unusedCssSavings": 92061
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 3449,
            "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": "medium",
            "estimatedSavingsBytes": 32481,
            "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": "high",
            "estimatedSavingsBytes": 92061,
            "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": "Eliminate render-blocking resources",
            "area": "render-path",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1025,
            "strategy": "Defer scripts/styles not required for first paint and preload only truly critical assets.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-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 www.barcelona.cat",
            "area": "font",
            "urgency": "medium",
            "estimatedSavingsBytes": 90559,
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "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 www.barcelona.cat",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 84135,
            "url": "https://www.barcelona.cat/themes/barcelonacat_theme/images/menu/viula.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 cdn.matomo.cloud",
            "area": "script",
            "urgency": "medium",
            "estimatedSavingsBytes": 76427,
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.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": 65,
        "urgency": "high",
        "providerCount": 8,
        "requestCount": 9,
        "transferBytes": 155330,
        "notGreenCount": 5,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76427,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "cdnjs.cloudflare.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15869,
            "sampleUrl": "https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js",
            "greenCheck": {
              "hostname": "cdnjs.cloudflare.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:34",
              "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/cdnjs.cloudflare.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15565,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7147,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=tXCosY&url=https%3A%2F%2Fwww.barcelona.cat%2Fen%2Fliving-in-bcn%2Fenvironment-and-sustainability%2Flist-containers",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "high",
            "detail": "Track 8 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."
          },
          {
            "title": "Prioritize greener alternatives for third-party providers",
            "urgency": "high",
            "detail": "5 third-party script origin(s) are not confirmed green in the Green Web Foundation dataset."
          }
        ]
      },
      "redundancy": {
        "score": 26,
        "urgency": "low",
        "transferBytes": 850290,
        "estimatedRedundantBytes": 124542,
        "redundancyRatio": 0.14647002787284338,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 92061,
            "displayValue": "Est savings of 90 KiB"
          },
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 32481,
            "displayValue": "Est savings of 32 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 92061,
            "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 unused javascript",
            "urgency": "medium",
            "estimatedSavingsBytes": 32481,
            "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": "Enable and verify text compression",
            "urgency": "medium",
            "estimatedSavingsBytes": 20404,
            "auditId": "uses-text-compression",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "2",
              "title": "Remove unnecessary or redundant information",
              "url": "https://www.w3.org/TR/web-sustainability-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": 18,
        "urgency": "medium",
        "totalTransferBytes": 850290,
        "heavyRequestCount": 4,
        "heavyBytes": 271000,
        "heavyRatio": 0.31871479142410236,
        "heavyRequests": [
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "transferSize": 90559,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "transferSize": 76427,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "cdn.matomo.cloud"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament/fonts/icoajuntament.ttf?8aaig7",
            "transferSize": 54919,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/css/css_evpTRQTawGYS1Ro7RbXq3hBxwat7AU-RJm1V8ZgzeaE.css?delta=5&language=en&theme=barcelonacat_theme&include=eJyFztEOwiAMheEXgnDhA5EDq4gySmiZ7u1dYuJinPGqTf_voriOqpipqseShcW9hkXLBntMI8NNUGo53qh_JzpjFBUT0CMVrohQzwv1nicSt8lhlbls_ZdpSGSXTPdPoBeayQVmFe1oPk71CKTCAcWKriXXdCRyZLv_fSSEx3bzgir-9A-0zibE6jfW4d6bp4dSryhGVlGaXYDQE_H9jbg&tcut5n",
            "transferSize": 49095,
            "resourceType": "stylesheet",
            "mimeType": "text/css",
            "domain": "www.barcelona.cat"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "font",
            "count": 2,
            "transferBytes": 145478
          },
          {
            "resourceType": "script",
            "count": 1,
            "transferBytes": 76427
          },
          {
            "resourceType": "stylesheet",
            "count": 1,
            "transferBytes": 49095
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.barcelona.cat",
            "count": 3,
            "transferBytes": 194573
          },
          {
            "domain": "cdn.matomo.cloud",
            "count": 1,
            "transferBytes": 76427
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Defer non-critical UI modules until after first render",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "strategy": "Keep only above-the-fold resources in the initial path; hydrate or import secondary modules later.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 www.barcelona.cat",
            "urgency": "medium",
            "estimatedSavingsBytes": 90559,
            "strategy": "Subset or defer this font so full font payloads are only fetched when needed.",
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 cdn.matomo.cloud",
            "urgency": "medium",
            "estimatedSavingsBytes": 76427,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.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.1,
          "displayValue": "6.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: 6.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-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,
          "displayValue": "Est savings of 90 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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 90 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,
          "displayValue": "Est savings of 71 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 71 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 57 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 57 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": "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": 0,
          "displayValue": "Est savings of 1,030 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 Eliminate render-blocking resources\n\n- Lighthouse audit: render-blocking-resources\n- Current value: Est savings of 1,030 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\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": "server-response-time",
          "title": "Reduce initial server response time",
          "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": 0,
          "displayValue": "Root document took 1,010 ms",
          "impact": "high",
          "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 Reduce initial server response time\n\n- Lighthouse audit: server-response-time\n- Current value: Root document took 1,010 ms\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": "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": 0.75,
          "displayValue": "4.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 Speed Index\n\n- Lighthouse audit: speed-index\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\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": 0.5,
          "displayValue": "Est savings of 32 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 32 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.5,
          "displayValue": "Est savings of 3 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 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-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": 0.5,
          "displayValue": "Est savings of 20 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 Enable text compression\n\n- Lighthouse audit: uses-text-compression\n- Current value: Est savings of 20 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\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": "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": "1,018 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: 1,018 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://barcelona.cat/en/living-in-bcn/catalan-national-day-2019/public-transport-11-september-2022-catalan-national-day",
      "status": "ok",
      "finalUrl": "https://www.barcelona.cat/en/living-in-bcn/catalan-national-day-2019/public-transport-11-september-2022-catalan-national-day",
      "performanceScore": 0.68,
      "bestPracticesScore": 0.79,
      "transferBytes": 2025485,
      "co2Grams": 0.7759256294790001,
      "greenWeb": {
        "page": {
          "hostname": "www.barcelona.cat",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-13T22:38:00.231825",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.barcelona.cat",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "maps.googleapis.com",
            "resourceType": "script",
            "requestCount": 13,
            "transferBytes": 422098,
            "sampleUrl": "https://maps.googleapis.com/maps/api/js?v=3.63&client=google-maps-pro&language=ca&region=US&libraries=places,visualization,geometry,search",
            "greenCheck": {
              "hostname": "maps.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:28",
              "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/maps.googleapis.com",
              "error": null
            }
          },
          {
            "hostname": "www.gstatic.com",
            "resourceType": "script",
            "requestCount": 4,
            "transferBytes": 382196,
            "sampleUrl": "https://www.gstatic.com/mapspro/_/js/k=mapspro.gmeviewer.ca.UWtvunUk8tQ.O/am=AAAI/d=0/rs=ABjfnFVRZxXJ-a-dpkyBnt3vQSOei-_jMg/m=gmeviewer_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": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76426,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "www.gstatic.com",
            "resourceType": "stylesheet",
            "requestCount": 1,
            "transferBytes": 51969,
            "sampleUrl": "https://www.gstatic.com/mapspro/_/ss/k=mapspro.gmeviewer._T3iEl8Rf-Y.L.W.O/am=AAAI/d=0/rs=ABjfnFUmhIKackrXoBnPPtvjVyCpHm-ZBw",
            "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": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "stylesheet",
            "requestCount": 1,
            "transferBytes": 24657,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15566,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "fonts.googleapis.com",
            "resourceType": "stylesheet",
            "requestCount": 5,
            "transferBytes": 8880,
            "sampleUrl": "https://fonts.googleapis.com/css?family=Source+Sans+3:200,200i,300,300i,400,400i,500,500i,600,600i,700,700i,900,900i",
            "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
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7146,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 4126,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/css/bcn-avisos.css",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 268,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=AKKTid&url=https%3A%2F%2Fwww.barcelona.cat%2Fen%2Fliving-in-bcn%2Fcatalan-national-day-2019%2Fpublic-transport-11-september-2022-catalan-national-day",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 13,
          "greenCount": 7,
          "notGreenCount": 7,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 55,
        "urgency": "medium",
        "pageElementOccurrences": 4,
        "uniqueElementsAssessed": 2,
        "reusedFromCacheCount": 2,
        "components": [
          {
            "signature": "form|get|/en|input|text|query|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "text",
            "fieldName": "query",
            "formContext": "form|get|/en",
            "hasLabel": true,
            "hasValidationRule": false,
            "hasErrorMessagingHook": false,
            "toolingFriendly": false,
            "assessment": {
              "score": 60,
              "urgency": "high",
              "issues": [
                "No explicit validation rule",
                "No error messaging hook",
                "Missing autocomplete for tooling support"
              ],
              "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.",
                "Provide meaningful autocomplete values to support browsers and assistive tooling."
              ]
            },
            "reusedFromCache": true
          },
          {
            "signature": "form|get|self|input|checkbox|anonymous|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "checkbox",
            "fieldName": null,
            "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": true
          }
        ],
        "recommendations": [
          {
            "title": "No explicit validation rule",
            "urgency": "medium",
            "detail": "2 unique form control signature(s) on this page include this issue."
          },
          {
            "title": "No error messaging hook",
            "urgency": "medium",
            "detail": "2 unique form control signature(s) on this page include this issue."
          },
          {
            "title": "Missing autocomplete for tooling support",
            "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": "Public transport Diada 2022 | Barcelona City Council",
          "lang": "en",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "Information on public transport services operating and disruptions to the bus, metro and train network in Barcelona for Catalan National Day on 11 September.",
          "robots": "",
          "canonical": "https://www.barcelona.cat/en/living-in-bcn/catalan-national-day-2019/public-transport-11-september-2022-catalan-national-day",
          "ogTitle": "Public transport Diada 2022 | Barcelona City Council",
          "ogDescription": "Information on public transport services operating and disruptions to the bus, metro and train network in Barcelona for Catalan National Day on 11 September.",
          "ogType": "Web",
          "ogUrl": "https://www.barcelona.cat/en/living-in-bcn/catalan-national-day-2019/public-transport-11-september-2022-catalan-national-day",
          "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": 81,
          "tabletSmallTapTargets": 79,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 81,
            "oversizedMedia": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 79,
            "oversizedMedia": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 81 small targets on mobile and 79 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 59,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": true,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": true,
          "externalScriptCount": 8,
          "externalScriptsWithoutIntegrity": 8,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "cache-control": "max-age=300, public",
            "content-encoding": "gzip",
            "content-language": "en",
            "content-length": "10881",
            "content-type": "text/html; charset=UTF-8",
            "date": "Mon, 13 Apr 2026 23:00:08 GMT",
            "etag": "\"1776121208-gzip\"",
            "expires": "Sun, 19 Nov 1978 05:00:00 GMT",
            "last-modified": "Mon, 13 Apr 2026 23:00:08 GMT",
            "server": "nginx",
            "vary": "Cookie,Accept-Encoding",
            "via": "1.1 ca2190123e61f1744d1210c24c87c840.cloudfront.net (CloudFront)",
            "x-amz-cf-id": "pEfW4WSdBKnPCn0JaYAzKUz5xQ6SPH2bJNu-y6xOTGhNjjAQ4dM-jw==",
            "x-amz-cf-pop": "IAD12-P5",
            "x-cache": "Miss from cloudfront",
            "x-content-type-options": "nosniff",
            "x-frame-options": "SAMEORIGIN",
            "x-generator": "Drupal 10 (https://www.drupal.org)"
          },
          "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": "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": "8 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 25,
        "urgency": "low",
        "origin": "https://www.barcelona.cat",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://www.barcelona.cat/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/sitemap.xml",
            "found": true,
            "status": 200,
            "contentType": "application/xml; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/manifest.webmanifest",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/favicon.ico",
            "found": true,
            "status": 200,
            "contentType": "image/x-icon"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "low",
            "detail": "Missing beneficial file(s): /.well-known/security.txt, /manifest.webmanifest."
          }
        ]
      },
      "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": 85,
        "urgency": "medium",
        "data": {
          "hasPrintStyles": true,
          "hasReducedMotion": true,
          "media": {
            "totalImages": 16,
            "lazyImages": 1,
            "totalIframes": 2,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "\"Source Sans Pro\", \"Helvetica Neue\", Helvetica, Arial, sans-serif",
            "usesSystemFont": true
          },
          "tracking": {
            "count": 0,
            "scripts": []
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 1/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": "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"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 6,
        "urgency": "low",
        "totalEstimatedSavingsBytes": 130442.55,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Use modern image compression formats",
            "urgency": "medium",
            "estimatedSavingsBytes": 72410.55,
            "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size."
          },
          {
            "id": "uses-optimized-images",
            "title": "Improve image encoding quality/size",
            "urgency": "medium",
            "estimatedSavingsBytes": 58032,
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings."
          }
        ],
        "recommendations": [
          {
            "title": "Use modern image compression formats",
            "urgency": "medium",
            "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size. Estimated savings: 70.71 KB."
          },
          {
            "title": "Improve image encoding quality/size",
            "urgency": "medium",
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 56.67 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": 247359.55,
        "totalEstimatedBlockingMs": 1640,
        "opportunities": [
          {
            "id": "render-blocking-resources",
            "title": "Eliminate render-blocking resources",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering.",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1640,
            "displayValue": "Est savings of 1,640 ms",
            "urgency": "high",
            "sourceAuditId": "render-blocking-resources"
          },
          {
            "id": "unused-css-rules",
            "title": "Remove unused CSS",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped.",
            "estimatedSavingsBytes": 81602,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 80 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-css-rules"
          },
          {
            "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": 72410.55,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 71 KiB",
            "urgency": "medium",
            "sourceAuditId": "modern-image-formats"
          },
          {
            "id": "uses-optimized-images",
            "title": "Compress oversized image assets",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss.",
            "estimatedSavingsBytes": 58032,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 57 KiB",
            "urgency": "medium",
            "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": 31867,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 31 KiB",
            "urgency": "low",
            "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": 3448,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 3 KiB",
            "urgency": "low",
            "sourceAuditId": "offscreen-images"
          }
        ],
        "recommendations": [
          {
            "title": "Eliminate render-blocking resources",
            "urgency": "high",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering. Estimated render unblocking: 1640 ms."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "medium",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 79.69 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: 70.71 KB."
          },
          {
            "title": "Compress oversized image assets",
            "urgency": "medium",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 56.67 KB."
          },
          {
            "title": "Remove unused JavaScript",
            "urgency": "low",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 31.12 KB."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "low",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 3.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": 10,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 8,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "8 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": 290512.21237197396
        },
        "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: 283.70 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: 283.70 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": "medium",
        "transferBytes": 2025485,
        "css": {
          "unusedBytes": 81602,
          "ratio": 0.04028763481339037,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 31867,
          "duplicatedBytes": 0,
          "ratio": 0.015733021967578135,
          "auditIds": [
            "unused-javascript",
            "duplicated-javascript"
          ]
        },
        "html": {
          "estimatedPenalty": 0.25,
          "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": "high",
            "estimatedSavingsBytes": 81602,
            "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": "medium",
            "estimatedSavingsBytes": 31867,
            "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": 16,
        "urgency": "high",
        "transferBytes": 2025485,
        "estimatedDeferrableBytes": 116917,
        "renderBlockingMs": 1640,
        "breakdown": {
          "offscreenImageSavings": 3448,
          "unusedJavascriptSavings": 31867,
          "unusedCssSavings": 81602
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 3448,
            "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": "medium",
            "estimatedSavingsBytes": 31867,
            "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": 81602,
            "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": "Eliminate render-blocking resources",
            "area": "render-path",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1640,
            "strategy": "Defer scripts/styles not required for first paint and preload only truly critical assets.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-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": 252986,
            "url": "https://www.gstatic.com/mapspro/_/js/k=mapspro.gmeviewer.ca.UWtvunUk8tQ.O/am=AAAI/d=0/rs=ABjfnFVRZxXJ-a-dpkyBnt3vQSOei-_jMg/m=gmeviewer_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 script from maps.googleapis.com",
            "area": "script",
            "urgency": "medium",
            "estimatedSavingsBytes": 182345,
            "url": "https://maps.googleapis.com/maps/api/js?v=3.63&client=google-maps-pro&language=ca&region=US&libraries=places,visualization,geometry,search",
            "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 www.barcelona.cat",
            "area": "font",
            "urgency": "medium",
            "estimatedSavingsBytes": 90560,
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "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": 90,
        "urgency": "high",
        "providerCount": 9,
        "requestCount": 25,
        "transferBytes": 943753,
        "notGreenCount": 5,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "maps.googleapis.com",
            "resourceType": "script",
            "requestCount": 13,
            "transferBytes": 422098,
            "sampleUrl": "https://maps.googleapis.com/maps/api/js?v=3.63&client=google-maps-pro&language=ca&region=US&libraries=places,visualization,geometry,search",
            "greenCheck": {
              "hostname": "maps.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:28",
              "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/maps.googleapis.com",
              "error": null
            }
          },
          {
            "hostname": "www.gstatic.com",
            "resourceType": "script",
            "requestCount": 4,
            "transferBytes": 382196,
            "sampleUrl": "https://www.gstatic.com/mapspro/_/js/k=mapspro.gmeviewer.ca.UWtvunUk8tQ.O/am=AAAI/d=0/rs=ABjfnFVRZxXJ-a-dpkyBnt3vQSOei-_jMg/m=gmeviewer_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": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76426,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15566,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7146,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 268,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=AKKTid&url=https%3A%2F%2Fwww.barcelona.cat%2Fen%2Fliving-in-bcn%2Fcatalan-national-day-2019%2Fpublic-transport-11-september-2022-catalan-national-day",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "high",
            "detail": "Track 9 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."
          },
          {
            "title": "Prioritize greener alternatives for third-party providers",
            "urgency": "high",
            "detail": "5 third-party script origin(s) are not confirmed green in the Green Web Foundation dataset."
          }
        ]
      },
      "redundancy": {
        "score": 23,
        "urgency": "low",
        "transferBytes": 2025485,
        "estimatedRedundantBytes": 113469,
        "redundancyRatio": 0.05602065678096851,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 81602,
            "displayValue": "Est savings of 80 KiB"
          },
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 31867,
            "displayValue": "Est savings of 31 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 81602,
            "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 unused javascript",
            "urgency": "medium",
            "estimatedSavingsBytes": 31867,
            "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 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": 32,
        "urgency": "high",
        "totalTransferBytes": 2025485,
        "heavyRequestCount": 10,
        "heavyBytes": 1085926,
        "heavyRatio": 0.5361313463195235,
        "heavyRequests": [
          {
            "url": "https://www.gstatic.com/mapspro/_/js/k=mapspro.gmeviewer.ca.UWtvunUk8tQ.O/am=AAAI/d=0/rs=ABjfnFVRZxXJ-a-dpkyBnt3vQSOei-_jMg/m=gmeviewer_base",
            "transferSize": 252986,
            "resourceType": "script",
            "mimeType": "text/javascript",
            "domain": "www.gstatic.com"
          },
          {
            "url": "https://maps.googleapis.com/maps/api/js?v=3.63&client=google-maps-pro&language=ca&region=US&libraries=places,visualization,geometry,search",
            "transferSize": 182345,
            "resourceType": "script",
            "mimeType": "text/javascript",
            "domain": "maps.googleapis.com"
          },
          {
            "url": "https://www.google.com/maps/d/embed?mid=1qLXF_Y4sh5x2eUL5WUAGv3K6Cq1-GPI&hl=ca&ehbc=2E312F",
            "transferSize": 127656,
            "resourceType": "document",
            "mimeType": "text/html",
            "domain": "www.google.com"
          },
          {
            "url": "https://www.gstatic.com/feedback/js/help/prod/service/lazy.min.js",
            "transferSize": 127310,
            "resourceType": "script",
            "mimeType": "text/javascript",
            "domain": "www.gstatic.com"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "transferSize": 90560,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "transferSize": 76426,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "cdn.matomo.cloud"
          },
          {
            "url": "https://maps.googleapis.com/maps-api-v3/api/js/63/14d/intl/ca_ALL/util.js",
            "transferSize": 72659,
            "resourceType": "script",
            "mimeType": "text/javascript",
            "domain": "maps.googleapis.com"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament/fonts/icoajuntament.ttf?8aaig7",
            "transferSize": 54920,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.gstatic.com/mapspro/_/ss/k=mapspro.gmeviewer._T3iEl8Rf-Y.L.W.O/am=AAAI/d=0/rs=ABjfnFUmhIKackrXoBnPPtvjVyCpHm-ZBw",
            "transferSize": 51969,
            "resourceType": "stylesheet",
            "mimeType": "text/css",
            "domain": "www.gstatic.com"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/css/css_evpTRQTawGYS1Ro7RbXq3hBxwat7AU-RJm1V8ZgzeaE.css?delta=5&language=en&theme=barcelonacat_theme&include=eJyFzkEKwzAMBMAPxfjQB5m1I1IXRzKSkja_r6EQKKT0pGV3DsJjY8dK7Al7NbH4OQG9ThlaqAmjwJPspFpnsjj0Flykjf2X6Vgo7JWe38DvtFLMIm6u6KnMfAWWJhktmB-t8nIlapGA8_crYbKNLhnY0u0f6CpTLpwGU8QzJXo5KaNNdpjTGjOM3gg5eRY&tcut5n",
            "transferSize": 49095,
            "resourceType": "stylesheet",
            "mimeType": "text/css",
            "domain": "www.barcelona.cat"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "script",
            "count": 5,
            "transferBytes": 711726
          },
          {
            "resourceType": "font",
            "count": 2,
            "transferBytes": 145480
          },
          {
            "resourceType": "document",
            "count": 1,
            "transferBytes": 127656
          },
          {
            "resourceType": "stylesheet",
            "count": 2,
            "transferBytes": 101064
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.gstatic.com",
            "count": 3,
            "transferBytes": 432265
          },
          {
            "domain": "maps.googleapis.com",
            "count": 2,
            "transferBytes": 255004
          },
          {
            "domain": "www.barcelona.cat",
            "count": 3,
            "transferBytes": 194575
          },
          {
            "domain": "www.google.com",
            "count": 1,
            "transferBytes": 127656
          },
          {
            "domain": "cdn.matomo.cloud",
            "count": 1,
            "transferBytes": 76426
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Defer non-critical UI modules until after first render",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "strategy": "Keep only above-the-fold resources in the initial path; hydrate or import secondary modules later.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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": "medium",
            "estimatedSavingsBytes": 252986,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://www.gstatic.com/mapspro/_/js/k=mapspro.gmeviewer.ca.UWtvunUk8tQ.O/am=AAAI/d=0/rs=ABjfnFVRZxXJ-a-dpkyBnt3vQSOei-_jMg/m=gmeviewer_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 script asset from maps.googleapis.com",
            "urgency": "medium",
            "estimatedSavingsBytes": 182345,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://maps.googleapis.com/maps/api/js?v=3.63&client=google-maps-pro&language=ca&region=US&libraries=places,visualization,geometry,search",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 document asset from www.google.com",
            "urgency": "medium",
            "estimatedSavingsBytes": 127656,
            "strategy": "Move this asset behind an explicit interaction, route boundary, or lazy-loading trigger.",
            "url": "https://www.google.com/maps/d/embed?mid=1qLXF_Y4sh5x2eUL5WUAGv3K6Cq1-GPI&hl=ca&ehbc=2E312F",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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": "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,
          "displayValue": "Est savings of 80 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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 80 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,
          "displayValue": "Est savings of 71 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 71 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 57 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 57 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": "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": 0,
          "displayValue": "Est savings of 1,640 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 Eliminate render-blocking resources\n\n- Lighthouse audit: render-blocking-resources\n- Current value: Est savings of 1,640 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\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": "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,
          "displayValue": "1,007 elements",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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: 1,007 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"
        },
        {
          "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": 0.69,
          "displayValue": "4.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 Speed Index\n\n- Lighthouse audit: speed-index\n- Current value: 4.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\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": 0.5,
          "displayValue": "Est savings of 31 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 31 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.5,
          "displayValue": "Est savings of 3 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 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://barcelona.cat/ca/que-pots-fer-a-bcn/banys-i-platges/barcelona-platja-platja",
      "status": "ok",
      "finalUrl": "https://www.barcelona.cat/ca/que-pots-fer-a-bcn/banys-i-platges/barcelona-platja-platja",
      "performanceScore": 0.66,
      "bestPracticesScore": 1,
      "transferBytes": 2202113,
      "co2Grams": 0.8435885309982,
      "greenWeb": {
        "page": {
          "hostname": "www.barcelona.cat",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-13T22:38:00.231825",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.barcelona.cat",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76426,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "stylesheet",
            "requestCount": 1,
            "transferBytes": 24654,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15565,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7156,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5656,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 4110,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/css/bcn-avisos.css",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "fonts.googleapis.com",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 2485,
            "sampleUrl": "https://fonts.googleapis.com/css?family=Source+Sans+3:200,200i,300,300i,400,400i,500,500i,600,600i,700,700i,900,900i",
            "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
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=CckNTy&url=https%3A%2F%2Fwww.barcelona.cat%2Fca%2Fque-pots-fer-a-bcn%2Fbanys-i-platges%2Fbarcelona-platja-platja",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 10,
          "greenCount": 4,
          "notGreenCount": 7,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 60,
        "urgency": "high",
        "pageElementOccurrences": 1,
        "uniqueElementsAssessed": 1,
        "reusedFromCacheCount": 1,
        "components": [
          {
            "signature": "form|get|/ca|input|text|query|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "text",
            "fieldName": "query",
            "formContext": "form|get|/ca",
            "hasLabel": true,
            "hasValidationRule": false,
            "hasErrorMessagingHook": false,
            "toolingFriendly": false,
            "assessment": {
              "score": 60,
              "urgency": "high",
              "issues": [
                "No explicit validation rule",
                "No error messaging hook",
                "Missing autocomplete for tooling support"
              ],
              "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.",
                "Provide meaningful autocomplete values to support browsers and assistive tooling."
              ]
            },
            "reusedFromCache": true
          }
        ],
        "recommendations": [
          {
            "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."
          },
          {
            "title": "Missing autocomplete for tooling support",
            "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": "Platja a platja | Web de Barcelona | Ajuntament de Barcelona",
          "lang": "ca",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "Descobreix cadascuna de les platges de Barcelona: la ubicació, els equipaments i els serveis que ofereixen i tota la informació que necessites per gaudir-ne.",
          "robots": "",
          "canonical": "https://www.barcelona.cat/ca/que-pots-fer-a-bcn/banys-i-platges/barcelona-platja-platja",
          "ogTitle": "Barcelona platja a platja",
          "ogDescription": "Descobreix cadascuna de les platges de Barcelona: la ubicació, els equipaments i els serveis que ofereixen i tota la informació que necessites per gaudir-ne.",
          "ogType": "Web",
          "ogUrl": "https://www.barcelona.cat/ca/que-pots-fer-a-bcn/banys-i-platges/barcelona-platja-platja",
          "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": 45,
          "tabletSmallTapTargets": 43,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 45,
            "oversizedMedia": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 43,
            "oversizedMedia": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 45 small targets on mobile and 43 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 59,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": true,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": true,
          "externalScriptCount": 7,
          "externalScriptsWithoutIntegrity": 7,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "cache-control": "max-age=300, public",
            "content-encoding": "gzip",
            "content-language": "ca",
            "content-length": "11276",
            "content-type": "text/html; charset=UTF-8",
            "date": "Mon, 13 Apr 2026 23:00:24 GMT",
            "etag": "\"1776121224-gzip\"",
            "expires": "Sun, 19 Nov 1978 05:00:00 GMT",
            "last-modified": "Mon, 13 Apr 2026 23:00:24 GMT",
            "server": "nginx",
            "vary": "Cookie,Accept-Encoding",
            "via": "1.1 ca2190123e61f1744d1210c24c87c840.cloudfront.net (CloudFront)",
            "x-amz-cf-id": "AVFcb6JbRU6_7LgxZqeLGIdkkdGlTssib8WDli13ExqKA0SPg-3dWQ==",
            "x-amz-cf-pop": "IAD12-P5",
            "x-cache": "Miss from cloudfront",
            "x-content-type-options": "nosniff",
            "x-frame-options": "SAMEORIGIN",
            "x-generator": "Drupal 10 (https://www.drupal.org)"
          },
          "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": "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": "7 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 25,
        "urgency": "low",
        "origin": "https://www.barcelona.cat",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://www.barcelona.cat/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/sitemap.xml",
            "found": true,
            "status": 200,
            "contentType": "application/xml; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/manifest.webmanifest",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/favicon.ico",
            "found": true,
            "status": 200,
            "contentType": "image/x-icon"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "low",
            "detail": "Missing beneficial file(s): /.well-known/security.txt, /manifest.webmanifest."
          }
        ]
      },
      "mediaHints": {
        "score": 21,
        "urgency": "low",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 21,
          "imagesWithLazy": 10,
          "imagesWithoutLazy": 11
        },
        "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": "11 of 21 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 85,
        "urgency": "medium",
        "data": {
          "hasPrintStyles": true,
          "hasReducedMotion": true,
          "media": {
            "totalImages": 26,
            "lazyImages": 11,
            "totalIframes": 1,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "\"Source Sans Pro\", \"Helvetica Neue\", Helvetica, Arial, sans-serif",
            "usesSystemFont": true
          },
          "tracking": {
            "count": 0,
            "scripts": []
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 11/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": "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"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 100,
        "urgency": "high",
        "totalEstimatedSavingsBytes": 2224985.1,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Use modern image compression formats",
            "urgency": "high",
            "estimatedSavingsBytes": 1218140.1,
            "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": 1006845,
            "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: 1.16 MB."
          },
          {
            "title": "Improve image encoding quality/size",
            "urgency": "high",
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 983.25 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": 2455405.1,
        "totalEstimatedBlockingMs": 873,
        "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": 1218140.1,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 1,190 KiB",
            "urgency": "high",
            "sourceAuditId": "modern-image-formats"
          },
          {
            "id": "uses-optimized-images",
            "title": "Compress oversized image assets",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss.",
            "estimatedSavingsBytes": 1006845,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 983 KiB",
            "urgency": "high",
            "sourceAuditId": "uses-optimized-images"
          },
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 91562,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 89 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": 84137,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 82 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-css-rules"
          },
          {
            "id": "unused-javascript",
            "title": "Remove unused JavaScript",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code.",
            "estimatedSavingsBytes": 54721,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 53 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-javascript"
          },
          {
            "id": "render-blocking-resources",
            "title": "Eliminate render-blocking resources",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering.",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 873,
            "displayValue": "Est savings of 870 ms",
            "urgency": "medium",
            "sourceAuditId": "render-blocking-resources"
          }
        ],
        "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.16 MB."
          },
          {
            "title": "Compress oversized image assets",
            "urgency": "high",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 983.25 KB."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "medium",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 89.42 KB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "medium",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 82.17 KB."
          },
          {
            "title": "Remove unused JavaScript",
            "urgency": "medium",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 53.44 KB."
          },
          {
            "title": "Eliminate render-blocking resources",
            "urgency": "medium",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering. Estimated render unblocking: 873 ms."
          }
        ]
      },
      "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": 10,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 7,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "7 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": 168016.02070530728
        },
        "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: 164.08 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: 164.08 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": 5,
        "urgency": "medium",
        "transferBytes": 2202113,
        "css": {
          "unusedBytes": 84137,
          "ratio": 0.038207394443427745,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 54721,
          "duplicatedBytes": 0,
          "ratio": 0.024849315180465306,
          "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": "high",
            "estimatedSavingsBytes": 84137,
            "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": "medium",
            "estimatedSavingsBytes": 54721,
            "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": 2202113,
        "estimatedDeferrableBytes": 230420,
        "renderBlockingMs": 873,
        "breakdown": {
          "offscreenImageSavings": 91562,
          "unusedJavascriptSavings": 54721,
          "unusedCssSavings": 84137
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 91562,
            "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": "medium",
            "estimatedSavingsBytes": 54721,
            "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": "high",
            "estimatedSavingsBytes": 84137,
            "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": "Eliminate render-blocking resources",
            "area": "render-path",
            "urgency": "medium",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 873,
            "strategy": "Defer scripts/styles not required for first paint and preload only truly critical assets.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-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 www.barcelona.cat",
            "area": "image",
            "urgency": "high",
            "estimatedSavingsBytes": 194533,
            "url": "https://www.barcelona.cat/sites/default/files/styles/destacat_gran/public/platja_mar_bella_528x228.jpg?itok=-PDzPbtG",
            "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": 64,
        "urgency": "high",
        "providerCount": 7,
        "requestCount": 8,
        "transferBytes": 139679,
        "notGreenCount": 5,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76426,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15565,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7156,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5656,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=CckNTy&url=https%3A%2F%2Fwww.barcelona.cat%2Fca%2Fque-pots-fer-a-bcn%2Fbanys-i-platges%2Fbarcelona-platja-platja",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "high",
            "detail": "Track 7 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."
          },
          {
            "title": "Prioritize greener alternatives for third-party providers",
            "urgency": "high",
            "detail": "5 third-party script origin(s) are not confirmed green in the Green Web Foundation dataset."
          }
        ]
      },
      "redundancy": {
        "score": 13,
        "urgency": "medium",
        "transferBytes": 2202113,
        "estimatedRedundantBytes": 138858,
        "redundancyRatio": 0.06305670962389305,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 84137,
            "displayValue": "Est savings of 82 KiB"
          },
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 54721,
            "displayValue": "Est savings of 53 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 84137,
            "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 unused javascript",
            "urgency": "medium",
            "estimatedSavingsBytes": 54721,
            "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 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": 42,
        "urgency": "high",
        "totalTransferBytes": 2202113,
        "heavyRequestCount": 14,
        "heavyBytes": 1672647,
        "heavyRatio": 0.7595645636713466,
        "heavyRequests": [
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/destacat_gran/public/platja_mar_bella_528x228.jpg?itok=-PDzPbtG",
            "transferSize": 194533,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/destacat_gran/public/platja_sant_miquel_528x228.jpg?itok=mSr4UEpe",
            "transferSize": 166834,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/destacat_gran/public/platja_bogatell_528x228.jpg?itok=tc0n-Jdn",
            "transferSize": 139782,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/destacat_gran/public/platja_barceloneta_528x228.jpg?itok=sf9F0LsR",
            "transferSize": 138331,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/destacat_gran/public/platja_somorrostro_528x228.jpg?itok=sMe05RlN",
            "transferSize": 136471,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/destacat_gran/public/sant_sebastia_528x228.jpg?itok=Sp-Uo5fX",
            "transferSize": 135966,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/destacat_gran/public/zona_banys_forum_528x228.jpg?itok=JHVctWFT",
            "transferSize": 128614,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/destacat_gran/public/platja_nova_icaria_528x228.jpg?itok=FkrtM0BC",
            "transferSize": 125265,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/destacat_gran/public/nova-mar-bella_528x228.jpg?itok=eaB3xRG5",
            "transferSize": 120508,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/destacat_gran/public/platja_llevant_528x228.jpg?itok=z2GiHHC_",
            "transferSize": 112497,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "transferSize": 90561,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "transferSize": 76426,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "cdn.matomo.cloud"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament/fonts/icoajuntament.ttf?8aaig7",
            "transferSize": 54922,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/css/css_qDD4BCxE8K-iT7MRORwp32v03DlJblP9-xrYwOBWlQo.css?delta=5&language=ca&theme=barcelonacat_theme&include=eJyFz0EKwzAMBMAPxfjQB5m1o6YujmQsJU1-X0MhUHDpScvuXITnxoaV2AL2rKL-cxxqniJaoiKMBAuyU2t5JvVdb85ESt9_mYqF3J7p9Q3sQSv5KGJqDTWkmUfgDk5nlGO0LUUiilM7S-ZlJHISh-uvkVDZehcUrOH2D9QmU0wcOmvwVwp0GDVGmfRUo9VHKL0B6qeEHA&tcut5n",
            "transferSize": 51937,
            "resourceType": "stylesheet",
            "mimeType": "text/css",
            "domain": "www.barcelona.cat"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "image",
            "count": 10,
            "transferBytes": 1398801
          },
          {
            "resourceType": "font",
            "count": 2,
            "transferBytes": 145483
          },
          {
            "resourceType": "script",
            "count": 1,
            "transferBytes": 76426
          },
          {
            "resourceType": "stylesheet",
            "count": 1,
            "transferBytes": 51937
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.barcelona.cat",
            "count": 13,
            "transferBytes": 1596221
          },
          {
            "domain": "cdn.matomo.cloud",
            "count": 1,
            "transferBytes": 76426
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Lazy-load offscreen images and media galleries",
            "urgency": "medium",
            "estimatedSavingsBytes": 91562,
            "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": "medium",
            "estimatedSavingsBytes": 54721,
            "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": "Defer non-critical UI modules until after first render",
            "urgency": "medium",
            "estimatedSavingsBytes": 0,
            "strategy": "Keep only above-the-fold resources in the initial path; hydrate or import secondary modules later.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 www.barcelona.cat",
            "urgency": "medium",
            "estimatedSavingsBytes": 194533,
            "strategy": "Serve a smaller placeholder first and load this asset only when the user scrolls to or requests the component.",
            "url": "https://www.barcelona.cat/sites/default/files/styles/destacat_gran/public/platja_mar_bella_528x228.jpg?itok=-PDzPbtG",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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.01,
          "displayValue": "8.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: 8.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 53 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 53 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,
          "displayValue": "Est savings of 82 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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 82 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,
          "displayValue": "Est savings of 1,190 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,190 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 983 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 983 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,
          "displayValue": "Est savings of 89 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 89 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": "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": 0,
          "displayValue": "Est savings of 870 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 Eliminate render-blocking resources\n\n- Lighthouse audit: render-blocking-resources\n- Current value: Est savings of 870 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\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": "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": 0.79,
          "displayValue": "4.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 Speed Index\n\n- Lighthouse audit: speed-index\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\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": "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": "1,031 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: 1,031 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://barcelona.cat/es/que-hacer-en-bcn/banos-y-playas/historia-de-las-playas",
      "status": "ok",
      "finalUrl": "https://www.barcelona.cat/es/que-hacer-en-bcn/banos-y-playas/historia-de-las-playas",
      "performanceScore": 0.44,
      "bestPracticesScore": 1,
      "transferBytes": 2193781,
      "co2Grams": 0.8403966967734,
      "greenWeb": {
        "page": {
          "hostname": "www.barcelona.cat",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-13T22:38:00.231825",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.barcelona.cat",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76425,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "stylesheet",
            "requestCount": 1,
            "transferBytes": 24654,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15566,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7152,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 4110,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/css/bcn-avisos.css",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2862,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "fonts.googleapis.com",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 2482,
            "sampleUrl": "https://fonts.googleapis.com/css?family=Source+Sans+3:200,200i,300,300i,400,400i,500,500i,600,600i,700,700i,900,900i",
            "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
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=KabdUB&url=https%3A%2F%2Fwww.barcelona.cat%2Fes%2Fque-hacer-en-bcn%2Fbanos-y-playas%2Fhistoria-de-las-playas",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 10,
          "greenCount": 4,
          "notGreenCount": 7,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 60,
        "urgency": "high",
        "pageElementOccurrences": 1,
        "uniqueElementsAssessed": 1,
        "reusedFromCacheCount": 1,
        "components": [
          {
            "signature": "form|get|/es/|input|text|query|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "text",
            "fieldName": "query",
            "formContext": "form|get|/es/",
            "hasLabel": true,
            "hasValidationRule": false,
            "hasErrorMessagingHook": false,
            "toolingFriendly": false,
            "assessment": {
              "score": 60,
              "urgency": "high",
              "issues": [
                "No explicit validation rule",
                "No error messaging hook",
                "Missing autocomplete for tooling support"
              ],
              "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.",
                "Provide meaningful autocomplete values to support browsers and assistive tooling."
              ]
            },
            "reusedFromCache": true
          }
        ],
        "recommendations": [
          {
            "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."
          },
          {
            "title": "Missing autocomplete for tooling support",
            "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": "Historia playas | Web de Barcelona | Ayuntamiento Barcelona",
          "lang": "es",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "Descubre la historia de las playas de Barcelona y cómo ha influido la costa y el mar en el desarrollo de la ciudad.",
          "robots": "",
          "canonical": "https://www.barcelona.cat/es/que-hacer-en-bcn/banos-y-playas/historia-de-las-playas",
          "ogTitle": "Historia de las playas",
          "ogDescription": "Conoce de qué forma ha influido el mar en el desarrollo de Barcelona: como puerta de entrada de nuevas culturas, como eje comercial y como espacio colectivo de ocio y cultura a partir del siglo XIX.",
          "ogType": "Web",
          "ogUrl": "https://www.barcelona.cat/es/que-hacer-en-bcn/banos-y-playas/historia-de-las-playas",
          "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": 34,
        "urgency": "medium",
        "checks": {
          "testedMobile": true,
          "testedTablet": true,
          "horizontalOverflowOnMobile": false,
          "horizontalOverflowOnTablet": false,
          "mobileSmallTapTargets": 38,
          "tabletSmallTapTargets": 33,
          "fixedWidthOffenders": 2,
          "oversizedMedia": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 1,
            "smallTapTargets": 38,
            "oversizedMedia": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 1,
            "smallTapTargets": 33,
            "oversizedMedia": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 38 small targets on mobile and 33 on tablet."
          },
          {
            "title": "Refactor fixed-width components",
            "urgency": "medium",
            "detail": "2 element(s) exceeded viewport width in tested layouts; use responsive component constraints."
          }
        ]
      },
      "securityLight": {
        "score": 59,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": true,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": true,
          "externalScriptCount": 7,
          "externalScriptsWithoutIntegrity": 7,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "cache-control": "max-age=300, public",
            "content-encoding": "gzip",
            "content-language": "es",
            "content-length": "18519",
            "content-type": "text/html; charset=UTF-8",
            "date": "Mon, 13 Apr 2026 23:00:37 GMT",
            "etag": "\"1776121237-gzip\"",
            "expires": "Sun, 19 Nov 1978 05:00:00 GMT",
            "last-modified": "Mon, 13 Apr 2026 23:00:37 GMT",
            "server": "nginx",
            "vary": "Cookie,Accept-Encoding",
            "via": "1.1 ca2190123e61f1744d1210c24c87c840.cloudfront.net (CloudFront)",
            "x-amz-cf-id": "5wrR_n1cQAc6UY27SkAHK-7tzjnYdVf_BiHNWqBY95kQMPJ_WQ981w==",
            "x-amz-cf-pop": "IAD12-P5",
            "x-cache": "Miss from cloudfront",
            "x-content-type-options": "nosniff",
            "x-frame-options": "SAMEORIGIN",
            "x-generator": "Drupal 10 (https://www.drupal.org)"
          },
          "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": "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": "7 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 25,
        "urgency": "low",
        "origin": "https://www.barcelona.cat",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://www.barcelona.cat/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/sitemap.xml",
            "found": true,
            "status": 200,
            "contentType": "application/xml; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/manifest.webmanifest",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/favicon.ico",
            "found": true,
            "status": 200,
            "contentType": "image/x-icon"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "low",
            "detail": "Missing beneficial file(s): /.well-known/security.txt, /manifest.webmanifest."
          }
        ]
      },
      "mediaHints": {
        "score": 29,
        "urgency": "low",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 17,
          "imagesWithLazy": 6,
          "imagesWithoutLazy": 11
        },
        "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": "11 of 17 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 85,
        "urgency": "medium",
        "data": {
          "hasPrintStyles": true,
          "hasReducedMotion": true,
          "media": {
            "totalImages": 22,
            "lazyImages": 7,
            "totalIframes": 1,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "\"Source Sans Pro\", \"Helvetica Neue\", Helvetica, Arial, sans-serif",
            "usesSystemFont": true
          },
          "tracking": {
            "count": 0,
            "scripts": []
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 7/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": "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"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 100,
        "urgency": "high",
        "totalEstimatedSavingsBytes": 2272864.5,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Use modern image compression formats",
            "urgency": "high",
            "estimatedSavingsBytes": 1231147.5000000002,
            "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": 1041717,
            "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: 1.17 MB."
          },
          {
            "title": "Improve image encoding quality/size",
            "urgency": "high",
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 1017.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": 2652986.5,
        "totalEstimatedBlockingMs": 1663,
        "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": 1231147.5000000002,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 1,202 KiB",
            "urgency": "high",
            "sourceAuditId": "modern-image-formats"
          },
          {
            "id": "uses-optimized-images",
            "title": "Compress oversized image assets",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss.",
            "estimatedSavingsBytes": 1041717,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 1,017 KiB",
            "urgency": "high",
            "sourceAuditId": "uses-optimized-images"
          },
          {
            "id": "uses-responsive-images",
            "title": "Right-size images for viewport",
            "detail": "Avoid sending larger images than the rendered size needs.",
            "estimatedSavingsBytes": 153831,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 150 KiB",
            "urgency": "high",
            "sourceAuditId": "uses-responsive-images"
          },
          {
            "id": "render-blocking-resources",
            "title": "Eliminate render-blocking resources",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering.",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1663,
            "displayValue": "Est savings of 1,660 ms",
            "urgency": "high",
            "sourceAuditId": "render-blocking-resources"
          },
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 87109,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 85 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": 83486,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 82 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-css-rules"
          },
          {
            "id": "unused-javascript",
            "title": "Remove unused JavaScript",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code.",
            "estimatedSavingsBytes": 55696,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 54 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-javascript"
          }
        ],
        "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.17 MB."
          },
          {
            "title": "Compress oversized image assets",
            "urgency": "high",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 1017.30 KB."
          },
          {
            "title": "Right-size images for viewport",
            "urgency": "high",
            "detail": "Avoid sending larger images than the rendered size needs. Estimated byte savings: 150.23 KB."
          },
          {
            "title": "Eliminate render-blocking resources",
            "urgency": "high",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering. Estimated render unblocking: 1663 ms."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "medium",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 85.07 KB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "medium",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 81.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": 10,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 7,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "7 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": 168009.42098463688
        },
        "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: 164.07 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: 164.07 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": "medium",
        "transferBytes": 2193781,
        "css": {
          "unusedBytes": 83486,
          "ratio": 0.038055758528312535,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 55696,
          "duplicatedBytes": 0,
          "ratio": 0.025388131267432803,
          "auditIds": [
            "unused-javascript",
            "duplicated-javascript"
          ]
        },
        "html": {
          "estimatedPenalty": 0.25,
          "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": "high",
            "estimatedSavingsBytes": 83486,
            "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": "medium",
            "estimatedSavingsBytes": 55696,
            "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": 2193781,
        "estimatedDeferrableBytes": 226291,
        "renderBlockingMs": 1663,
        "breakdown": {
          "offscreenImageSavings": 87109,
          "unusedJavascriptSavings": 55696,
          "unusedCssSavings": 83486
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 87109,
            "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": "medium",
            "estimatedSavingsBytes": 55696,
            "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": "high",
            "estimatedSavingsBytes": 83486,
            "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": "Eliminate render-blocking resources",
            "area": "render-path",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1663,
            "strategy": "Defer scripts/styles not required for first paint and preload only truly critical assets.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-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 www.barcelona.cat",
            "area": "image",
            "urgency": "high",
            "estimatedSavingsBytes": 480027,
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_medium/public/platges7186188803_dd14b08728_c.jpg?itok=NJ_h-jF7",
            "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 www.barcelona.cat",
            "area": "font",
            "urgency": "medium",
            "estimatedSavingsBytes": 90562,
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "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": 64,
        "urgency": "high",
        "providerCount": 7,
        "requestCount": 8,
        "transferBytes": 139466,
        "notGreenCount": 5,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76425,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15566,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7152,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2862,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=KabdUB&url=https%3A%2F%2Fwww.barcelona.cat%2Fes%2Fque-hacer-en-bcn%2Fbanos-y-playas%2Fhistoria-de-las-playas",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "high",
            "detail": "Track 7 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."
          },
          {
            "title": "Prioritize greener alternatives for third-party providers",
            "urgency": "high",
            "detail": "5 third-party script origin(s) are not confirmed green in the Green Web Foundation dataset."
          }
        ]
      },
      "redundancy": {
        "score": 23,
        "urgency": "medium",
        "transferBytes": 2193781,
        "estimatedRedundantBytes": 139182,
        "redundancyRatio": 0.06344388979574533,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 83486,
            "displayValue": "Est savings of 82 KiB"
          },
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 55696,
            "displayValue": "Est savings of 54 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 83486,
            "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 unused javascript",
            "urgency": "medium",
            "estimatedSavingsBytes": 55696,
            "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 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": 38,
        "urgency": "high",
        "totalTransferBytes": 2193781,
        "heavyRequestCount": 7,
        "heavyBytes": 1636793,
        "heavyRatio": 0.746105923973268,
        "heavyRequests": [
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_medium/public/platges7186188803_dd14b08728_c.jpg?itok=NJ_h-jF7",
            "transferSize": 480027,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_medium/public/bcn002046_2.jpg?itok=jl8158k1",
            "transferSize": 457813,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_medium/public/bcn001547_2.jpg?itok=79oiUeh_",
            "transferSize": 425111,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "transferSize": 90562,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "transferSize": 76425,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "cdn.matomo.cloud"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament/fonts/icoajuntament.ttf?8aaig7",
            "transferSize": 54921,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/css/css_qDD4BCxE8K-iT7MRORwp32v03DlJblP9-xrYwOBWlQo.css?delta=6&language=es&theme=barcelonacat_theme&include=eJyFz8FuxCAMBNAfCsuhH4QG4ia0DkbYpJu_L9JKW1VitSdbM-8y-OrFcFCxgDOrqH8ch5qXiJaIpSDBgpzUWl5J_dDdmQiP_pWp2MidmX7-A9vpIB9FTK2hhrSWGfhESVeU-6zbWCLYqV2cyzYTOYnDc9dMKOf07ZASqebINDXSRxYURcPHO1CbLDGVMFiDf36B7katgJeKhm0s3tWvrVfw7S-59VJ75Kw7rYteanT4CKVfKxCiTQ&tcut5n",
            "transferSize": 51934,
            "resourceType": "stylesheet",
            "mimeType": "text/css",
            "domain": "www.barcelona.cat"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "image",
            "count": 3,
            "transferBytes": 1362951
          },
          {
            "resourceType": "font",
            "count": 2,
            "transferBytes": 145483
          },
          {
            "resourceType": "script",
            "count": 1,
            "transferBytes": 76425
          },
          {
            "resourceType": "stylesheet",
            "count": 1,
            "transferBytes": 51934
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.barcelona.cat",
            "count": 6,
            "transferBytes": 1560368
          },
          {
            "domain": "cdn.matomo.cloud",
            "count": 1,
            "transferBytes": 76425
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Lazy-load offscreen images and media galleries",
            "urgency": "medium",
            "estimatedSavingsBytes": 87109,
            "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": "medium",
            "estimatedSavingsBytes": 55696,
            "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": "Defer non-critical UI modules until after first render",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "strategy": "Keep only above-the-fold resources in the initial path; hydrate or import secondary modules later.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 www.barcelona.cat",
            "urgency": "high",
            "estimatedSavingsBytes": 480027,
            "strategy": "Serve a smaller placeholder first and load this asset only when the user scrolls to or requests the component.",
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_medium/public/platges7186188803_dd14b08728_c.jpg?itok=NJ_h-jF7",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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": "15.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: 15.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 54 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 54 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,
          "displayValue": "Est savings of 82 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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 82 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,
          "displayValue": "Est savings of 1,202 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,202 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 1,017 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 1,017 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,
          "displayValue": "Est savings of 85 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 85 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": "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": 0,
          "displayValue": "Est savings of 1,660 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 Eliminate render-blocking resources\n\n- Lighthouse audit: render-blocking-resources\n- Current value: Est savings of 1,660 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\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": "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,
          "displayValue": "1,085 elements",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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: 1,085 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"
        },
        {
          "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": 0.76,
          "displayValue": "4.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 Speed Index\n\n- Lighthouse audit: speed-index\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\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"
        }
      ]
    },
    {
      "url": "https://barcelona.cat/es/que-hacer-en-bcn/parques-y-jardines/parques-forestales",
      "status": "ok",
      "finalUrl": "https://www.barcelona.cat/es/que-hacer-en-bcn/parques-y-jardines/parques-forestales",
      "performanceScore": 0.67,
      "bestPracticesScore": 1,
      "transferBytes": 976004,
      "co2Grams": 0.37388897872560006,
      "greenWeb": {
        "page": {
          "hostname": "www.barcelona.cat",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-13T22:38:00.231825",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.barcelona.cat",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76425,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "stylesheet",
            "requestCount": 1,
            "transferBytes": 24659,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "cdnjs.cloudflare.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15864,
            "sampleUrl": "https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js",
            "greenCheck": {
              "hostname": "cdnjs.cloudflare.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:34",
              "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/cdnjs.cloudflare.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15565,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7146,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 4110,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/css/bcn-avisos.css",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "fonts.googleapis.com",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 2483,
            "sampleUrl": "https://fonts.googleapis.com/css?family=Source+Sans+3:200,200i,300,300i,400,400i,500,500i,600,600i,700,700i,900,900i",
            "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
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=Z1uerw&url=https%3A%2F%2Fwww.barcelona.cat%2Fes%2Fque-hacer-en-bcn%2Fparques-y-jardines%2Fparques-forestales",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 11,
          "greenCount": 5,
          "notGreenCount": 7,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 75,
        "urgency": "high",
        "pageElementOccurrences": 4,
        "uniqueElementsAssessed": 2,
        "reusedFromCacheCount": 2,
        "components": [
          {
            "signature": "form|get|/es/|input|text|query|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "text",
            "fieldName": "query",
            "formContext": "form|get|/es/",
            "hasLabel": true,
            "hasValidationRule": false,
            "hasErrorMessagingHook": false,
            "toolingFriendly": false,
            "assessment": {
              "score": 60,
              "urgency": "high",
              "issues": [
                "No explicit validation rule",
                "No error messaging hook",
                "Missing autocomplete for tooling support"
              ],
              "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.",
                "Provide meaningful autocomplete values to support browsers and assistive tooling."
              ]
            },
            "reusedFromCache": true
          },
          {
            "signature": "no-form|select|select|anonymous|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "select",
            "fieldName": null,
            "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": "No explicit validation rule",
            "urgency": "medium",
            "detail": "2 unique form control signature(s) on this page include this issue."
          },
          {
            "title": "No error messaging hook",
            "urgency": "medium",
            "detail": "2 unique form control signature(s) on this page include this issue."
          },
          {
            "title": "Missing autocomplete for tooling support",
            "urgency": "medium",
            "detail": "1 unique form control signature(s) on this page include this issue."
          },
          {
            "title": "Missing associated label",
            "urgency": "high",
            "detail": "1 unique form control signature(s) on this page include this issue."
          }
        ]
      },
      "metadata": {
        "score": 25,
        "urgency": "low",
        "checks": {
          "hasTitle": true,
          "hasLang": true,
          "hasDescription": false,
          "hasCanonical": true,
          "hasOpenGraphCore": false,
          "hasTwitterCard": true,
          "hasViewport": true,
          "hasCharset": true,
          "hasValidStructuredData": true,
          "hasInvalidStructuredData": false
        },
        "observed": {
          "title": "Parques forestales | Barcelona.cat | Ajuntament de Barcelona",
          "lang": "es",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "",
          "robots": "",
          "canonical": "https://www.barcelona.cat/es/que-hacer-en-bcn/parques-y-jardines/parques-forestales",
          "ogTitle": "Parques forestales",
          "ogDescription": "",
          "ogType": "Web",
          "ogUrl": "https://www.barcelona.cat/es/que-hacer-en-bcn/parques-y-jardines/parques-forestales",
          "twitterCard": "summary_large_image",
          "ldJsonCount": 0,
          "validLdJsonCount": 0,
          "invalidLdJsonCount": 0
        },
        "recommendations": [
          {
            "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."
          }
        ]
      },
      "layoutAdaptation": {
        "score": 30,
        "urgency": "medium",
        "checks": {
          "testedMobile": true,
          "testedTablet": true,
          "horizontalOverflowOnMobile": false,
          "horizontalOverflowOnTablet": false,
          "mobileSmallTapTargets": 42,
          "tabletSmallTapTargets": 40,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 42,
            "oversizedMedia": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 40,
            "oversizedMedia": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 42 small targets on mobile and 40 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 59,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": true,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": true,
          "externalScriptCount": 8,
          "externalScriptsWithoutIntegrity": 8,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "cache-control": "max-age=300, public",
            "content-encoding": "gzip",
            "content-language": "es",
            "content-length": "11004",
            "content-type": "text/html; charset=UTF-8",
            "date": "Mon, 13 Apr 2026 23:00:52 GMT",
            "etag": "\"1776121251-gzip\"",
            "expires": "Sun, 19 Nov 1978 05:00:00 GMT",
            "last-modified": "Mon, 13 Apr 2026 23:00:51 GMT",
            "server": "nginx",
            "vary": "Cookie,Accept-Encoding",
            "via": "1.1 ca2190123e61f1744d1210c24c87c840.cloudfront.net (CloudFront)",
            "x-amz-cf-id": "3thRu5jabf4RhAnL_Z_1sv_VZoph-lwgYcRg_Qvj42JAic2-Ia8xgg==",
            "x-amz-cf-pop": "IAD12-P5",
            "x-cache": "Miss from cloudfront",
            "x-content-type-options": "nosniff",
            "x-frame-options": "SAMEORIGIN",
            "x-generator": "Drupal 10 (https://www.drupal.org)"
          },
          "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": "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": "8 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 25,
        "urgency": "low",
        "origin": "https://www.barcelona.cat",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://www.barcelona.cat/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/sitemap.xml",
            "found": true,
            "status": 200,
            "contentType": "application/xml; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/manifest.webmanifest",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/favicon.ico",
            "found": true,
            "status": 200,
            "contentType": "image/x-icon"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "low",
            "detail": "Missing beneficial file(s): /.well-known/security.txt, /manifest.webmanifest."
          }
        ]
      },
      "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": 85,
        "urgency": "medium",
        "data": {
          "hasPrintStyles": true,
          "hasReducedMotion": true,
          "media": {
            "totalImages": 18,
            "lazyImages": 1,
            "totalIframes": 1,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "\"Source Sans Pro\", \"Helvetica Neue\", Helvetica, Arial, sans-serif",
            "usesSystemFont": true
          },
          "tracking": {
            "count": 0,
            "scripts": []
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 1/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": "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"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 22,
        "urgency": "low",
        "totalEstimatedSavingsBytes": 214501.35,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Use modern image compression formats",
            "urgency": "medium",
            "estimatedSavingsBytes": 143840.35,
            "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size."
          },
          {
            "id": "uses-optimized-images",
            "title": "Improve image encoding quality/size",
            "urgency": "medium",
            "estimatedSavingsBytes": 70661,
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings."
          }
        ],
        "recommendations": [
          {
            "title": "Use modern image compression formats",
            "urgency": "medium",
            "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size. Estimated savings: 140.47 KB."
          },
          {
            "title": "Improve image encoding quality/size",
            "urgency": "medium",
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 69.00 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": 555422.35,
        "totalEstimatedBlockingMs": 1592,
        "opportunities": [
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 216252,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 211 KiB",
            "urgency": "high",
            "sourceAuditId": "offscreen-images"
          },
          {
            "id": "render-blocking-resources",
            "title": "Eliminate render-blocking resources",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering.",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1592,
            "displayValue": "Est savings of 1,590 ms",
            "urgency": "high",
            "sourceAuditId": "render-blocking-resources"
          },
          {
            "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": 143840.35,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 140 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": 92188,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 90 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-css-rules"
          },
          {
            "id": "uses-optimized-images",
            "title": "Compress oversized image assets",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss.",
            "estimatedSavingsBytes": 70661,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 69 KiB",
            "urgency": "medium",
            "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": 32481,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 32 KiB",
            "urgency": "low",
            "sourceAuditId": "unused-javascript"
          }
        ],
        "recommendations": [
          {
            "title": "Lazy-load offscreen images",
            "urgency": "high",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 211.18 KB."
          },
          {
            "title": "Eliminate render-blocking resources",
            "urgency": "high",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering. Estimated render unblocking: 1592 ms."
          },
          {
            "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: 140.47 KB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "medium",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 90.03 KB."
          },
          {
            "title": "Compress oversized image assets",
            "urgency": "medium",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 69.00 KB."
          },
          {
            "title": "Remove unused JavaScript",
            "urgency": "low",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 31.72 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": 10,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 8,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "8 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": 292606.2647346369
        },
        "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: 285.75 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: 285.75 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": "medium",
        "transferBytes": 976004,
        "css": {
          "unusedBytes": 92188,
          "ratio": 0.09445453092405359,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 32481,
          "duplicatedBytes": 0,
          "ratio": 0.03327957672304622,
          "auditIds": [
            "unused-javascript",
            "duplicated-javascript"
          ]
        },
        "html": {
          "estimatedPenalty": 0.25,
          "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": "high",
            "estimatedSavingsBytes": 92188,
            "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": "medium",
            "estimatedSavingsBytes": 32481,
            "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": 976004,
        "estimatedDeferrableBytes": 340921,
        "renderBlockingMs": 1592,
        "breakdown": {
          "offscreenImageSavings": 216252,
          "unusedJavascriptSavings": 32481,
          "unusedCssSavings": 92188
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 216252,
            "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": "medium",
            "estimatedSavingsBytes": 32481,
            "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": "high",
            "estimatedSavingsBytes": 92188,
            "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": "Eliminate render-blocking resources",
            "area": "render-path",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1592,
            "strategy": "Defer scripts/styles not required for first paint and preload only truly critical assets.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-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 www.barcelona.cat",
            "area": "font",
            "urgency": "medium",
            "estimatedSavingsBytes": 90559,
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "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 www.barcelona.cat",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 84136,
            "url": "https://www.barcelona.cat/themes/barcelonacat_theme/images/menu/viula.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 image from estatics-nasia.dtibcn.cat",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 76787,
            "url": "https://estatics-nasia.dtibcn.cat/nasia-pro/media/316054116060915.570x321.607522de.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 cdn.matomo.cloud",
            "area": "script",
            "urgency": "medium",
            "estimatedSavingsBytes": 76425,
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.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": 65,
        "urgency": "high",
        "providerCount": 8,
        "requestCount": 9,
        "transferBytes": 155322,
        "notGreenCount": 5,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76425,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "cdnjs.cloudflare.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15864,
            "sampleUrl": "https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js",
            "greenCheck": {
              "hostname": "cdnjs.cloudflare.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:34",
              "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/cdnjs.cloudflare.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15565,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7146,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=Z1uerw&url=https%3A%2F%2Fwww.barcelona.cat%2Fes%2Fque-hacer-en-bcn%2Fparques-y-jardines%2Fparques-forestales",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "high",
            "detail": "Track 8 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."
          },
          {
            "title": "Prioritize greener alternatives for third-party providers",
            "urgency": "high",
            "detail": "5 third-party script origin(s) are not confirmed green in the Green Web Foundation dataset."
          }
        ]
      },
      "redundancy": {
        "score": 27,
        "urgency": "low",
        "transferBytes": 976004,
        "estimatedRedundantBytes": 124669,
        "redundancyRatio": 0.1277341076470998,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 92188,
            "displayValue": "Est savings of 90 KiB"
          },
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 32481,
            "displayValue": "Est savings of 32 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 92188,
            "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 unused javascript",
            "urgency": "medium",
            "estimatedSavingsBytes": 32481,
            "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 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": 20,
        "urgency": "medium",
        "totalTransferBytes": 976004,
        "heavyRequestCount": 4,
        "heavyBytes": 271000,
        "heavyRatio": 0.2776627964639489,
        "heavyRequests": [
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "transferSize": 90559,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "transferSize": 76425,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "cdn.matomo.cloud"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament/fonts/icoajuntament.ttf?8aaig7",
            "transferSize": 54921,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/css/css_evpTRQTawGYS1Ro7RbXq3hBxwat7AU-RJm1V8ZgzeaE.css?delta=5&language=es&theme=barcelonacat_theme&include=eJyFztEOwiAMheEXgnDhA5EDq4gySmiZ7u1dYuJinPGqTf_voriOqpipqseShcW9hkXLBntMI8NNUGo53qh_JzpjFBUT0CMVrohQzwv1nicSt8lhlbls_ZdpSGSXTPdPoBeayQVmFe1oPk71CKTCAcWKriXXdCRyZLv_fSSEx3bzgir-9A-0zibE6jfW4d6bp4dSryhGVlGaXYDQE_H9jbg&tcut5n",
            "transferSize": 49095,
            "resourceType": "stylesheet",
            "mimeType": "text/css",
            "domain": "www.barcelona.cat"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "font",
            "count": 2,
            "transferBytes": 145480
          },
          {
            "resourceType": "script",
            "count": 1,
            "transferBytes": 76425
          },
          {
            "resourceType": "stylesheet",
            "count": 1,
            "transferBytes": 49095
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.barcelona.cat",
            "count": 3,
            "transferBytes": 194575
          },
          {
            "domain": "cdn.matomo.cloud",
            "count": 1,
            "transferBytes": 76425
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Lazy-load offscreen images and media galleries",
            "urgency": "high",
            "estimatedSavingsBytes": 216252,
            "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": "Defer non-critical UI modules until after first render",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "strategy": "Keep only above-the-fold resources in the initial path; hydrate or import secondary modules later.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 www.barcelona.cat",
            "urgency": "medium",
            "estimatedSavingsBytes": 90559,
            "strategy": "Subset or defer this font so full font payloads are only fetched when needed.",
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 cdn.matomo.cloud",
            "urgency": "medium",
            "estimatedSavingsBytes": 76425,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.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.07,
          "displayValue": "6.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: 6.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-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,
          "displayValue": "Est savings of 90 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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 90 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,
          "displayValue": "Est savings of 140 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 140 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 69 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 69 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,
          "displayValue": "Est savings of 211 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 211 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": "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": 0,
          "displayValue": "Est savings of 1,590 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 Eliminate render-blocking resources\n\n- Lighthouse audit: render-blocking-resources\n- Current value: Est savings of 1,590 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\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": "server-response-time",
          "title": "Reduce initial server response time",
          "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": 0,
          "displayValue": "Root document took 980 ms",
          "impact": "high",
          "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 Reduce initial server response time\n\n- Lighthouse audit: server-response-time\n- Current value: Root document took 980 ms\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": "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,
          "displayValue": "975 elements",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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: 975 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"
        },
        {
          "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": 0.76,
          "displayValue": "4.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 Speed Index\n\n- Lighthouse audit: speed-index\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\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": 0.5,
          "displayValue": "Est savings of 32 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 32 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"
        }
      ]
    },
    {
      "url": "https://barcelona.cat/es/vivir-en-bcn/con-personas-mayores/vivir-con-tranquilidad",
      "status": "ok",
      "finalUrl": "https://www.barcelona.cat/es/vivir-en-bcn/con-personas-mayores/vivir-con-tranquilidad",
      "performanceScore": 0.67,
      "bestPracticesScore": 1,
      "transferBytes": 1445544,
      "co2Grams": 0.5537610192815999,
      "greenWeb": {
        "page": {
          "hostname": "www.barcelona.cat",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-13T22:38:00.231825",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.barcelona.cat",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76425,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "stylesheet",
            "requestCount": 1,
            "transferBytes": 24659,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15565,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7143,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 4109,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/css/bcn-avisos.css",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "fonts.googleapis.com",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 2483,
            "sampleUrl": "https://fonts.googleapis.com/css?family=Source+Sans+3:200,200i,300,300i,400,400i,500,500i,600,600i,700,700i,900,900i",
            "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
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=n4eGNM&url=https%3A%2F%2Fwww.barcelona.cat%2Fes%2Fvivir-en-bcn%2Fcon-personas-mayores%2Fvivir-con-tranquilidad",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 10,
          "greenCount": 4,
          "notGreenCount": 7,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 60,
        "urgency": "high",
        "pageElementOccurrences": 1,
        "uniqueElementsAssessed": 1,
        "reusedFromCacheCount": 1,
        "components": [
          {
            "signature": "form|get|/es/|input|text|query|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "text",
            "fieldName": "query",
            "formContext": "form|get|/es/",
            "hasLabel": true,
            "hasValidationRule": false,
            "hasErrorMessagingHook": false,
            "toolingFriendly": false,
            "assessment": {
              "score": 60,
              "urgency": "high",
              "issues": [
                "No explicit validation rule",
                "No error messaging hook",
                "Missing autocomplete for tooling support"
              ],
              "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.",
                "Provide meaningful autocomplete values to support browsers and assistive tooling."
              ]
            },
            "reusedFromCache": true
          }
        ],
        "recommendations": [
          {
            "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."
          },
          {
            "title": "Missing autocomplete for tooling support",
            "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": "Vivir con tranquilidad | Personas mayores | Web de Barcelona",
          "lang": "es",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "Residencias, atención domiciliaria, viviendas tuteladas, centros de día y más información sobre los servicios para ayudar las personas mayores de Barcelona.",
          "robots": "",
          "canonical": "https://www.barcelona.cat/es/vivir-en-bcn/con-personas-mayores/vivir-con-tranquilidad",
          "ogTitle": "Vivir con tranquilidad",
          "ogDescription": "Información sobre los servicios de ayuda y apoyo para aquellas personas que no pueden llevar una vida independiente.",
          "ogType": "Web",
          "ogUrl": "https://www.barcelona.cat/es/vivir-en-bcn/con-personas-mayores/vivir-con-tranquilidad",
          "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": 44,
          "tabletSmallTapTargets": 38,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 44,
            "oversizedMedia": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 38,
            "oversizedMedia": 0
          }
        ],
        "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 38 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 59,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": true,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": true,
          "externalScriptCount": 7,
          "externalScriptsWithoutIntegrity": 7,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "cache-control": "max-age=300, public",
            "content-encoding": "gzip",
            "content-language": "es",
            "content-length": "11684",
            "content-type": "text/html; charset=UTF-8",
            "date": "Mon, 13 Apr 2026 23:01:05 GMT",
            "etag": "\"1776121264-gzip\"",
            "expires": "Sun, 19 Nov 1978 05:00:00 GMT",
            "last-modified": "Mon, 13 Apr 2026 23:01:04 GMT",
            "server": "nginx",
            "vary": "Cookie,Accept-Encoding",
            "via": "1.1 ca2190123e61f1744d1210c24c87c840.cloudfront.net (CloudFront)",
            "x-amz-cf-id": "Kb8TbHutF0NWhLFUnIYz_BMn2Vv5CZMmGftG3ROSxXAkBbJuK4bTcg==",
            "x-amz-cf-pop": "IAD12-P5",
            "x-cache": "Miss from cloudfront",
            "x-content-type-options": "nosniff",
            "x-frame-options": "SAMEORIGIN",
            "x-generator": "Drupal 10 (https://www.drupal.org)"
          },
          "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": "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": "7 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 25,
        "urgency": "low",
        "origin": "https://www.barcelona.cat",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://www.barcelona.cat/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/sitemap.xml",
            "found": true,
            "status": 200,
            "contentType": "application/xml; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/manifest.webmanifest",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/favicon.ico",
            "found": true,
            "status": 200,
            "contentType": "image/x-icon"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "low",
            "detail": "Missing beneficial file(s): /.well-known/security.txt, /manifest.webmanifest."
          }
        ]
      },
      "mediaHints": {
        "score": 25,
        "urgency": "low",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 19,
          "imagesWithLazy": 8,
          "imagesWithoutLazy": 11
        },
        "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": "11 of 19 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 85,
        "urgency": "medium",
        "data": {
          "hasPrintStyles": true,
          "hasReducedMotion": true,
          "media": {
            "totalImages": 24,
            "lazyImages": 9,
            "totalIframes": 1,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "\"Source Sans Pro\", \"Helvetica Neue\", Helvetica, Arial, sans-serif",
            "usesSystemFont": true
          },
          "tracking": {
            "count": 0,
            "scripts": []
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 9/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": "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"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 79,
        "urgency": "high",
        "totalEstimatedSavingsBytes": 1141048.4500000002,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Use modern image compression formats",
            "urgency": "high",
            "estimatedSavingsBytes": 625881.4500000001,
            "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": 515167,
            "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: 611.21 KB."
          },
          {
            "title": "Improve image encoding quality/size",
            "urgency": "high",
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 503.09 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": 1283310.4500000002,
        "totalEstimatedBlockingMs": 1634,
        "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": 625881.4500000001,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 611 KiB",
            "urgency": "high",
            "sourceAuditId": "modern-image-formats"
          },
          {
            "id": "uses-optimized-images",
            "title": "Compress oversized image assets",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss.",
            "estimatedSavingsBytes": 515167,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 503 KiB",
            "urgency": "high",
            "sourceAuditId": "uses-optimized-images"
          },
          {
            "id": "render-blocking-resources",
            "title": "Eliminate render-blocking resources",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering.",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1634,
            "displayValue": "Est savings of 1,630 ms",
            "urgency": "high",
            "sourceAuditId": "render-blocking-resources"
          },
          {
            "id": "unused-css-rules",
            "title": "Remove unused CSS",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped.",
            "estimatedSavingsBytes": 84093,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 82 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-css-rules"
          },
          {
            "id": "unused-javascript",
            "title": "Remove unused JavaScript",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code.",
            "estimatedSavingsBytes": 54721,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 53 KiB",
            "urgency": "medium",
            "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": 3448,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 3 KiB",
            "urgency": "low",
            "sourceAuditId": "offscreen-images"
          }
        ],
        "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: 611.21 KB."
          },
          {
            "title": "Compress oversized image assets",
            "urgency": "high",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 503.09 KB."
          },
          {
            "title": "Eliminate render-blocking resources",
            "urgency": "high",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering. Estimated render unblocking: 1634 ms."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "medium",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 82.12 KB."
          },
          {
            "title": "Remove unused JavaScript",
            "urgency": "medium",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 53.44 KB."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "low",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 3.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": 10,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 7,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "7 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": 167990.72098463692
        },
        "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: 164.05 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: 164.05 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": 6,
        "urgency": "medium",
        "transferBytes": 1445544,
        "css": {
          "unusedBytes": 84093,
          "ratio": 0.05817394697082898,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 54721,
          "duplicatedBytes": 0,
          "ratio": 0.03785495287587234,
          "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": "high",
            "estimatedSavingsBytes": 84093,
            "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": "medium",
            "estimatedSavingsBytes": 54721,
            "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": 1445544,
        "estimatedDeferrableBytes": 142262,
        "renderBlockingMs": 1634,
        "breakdown": {
          "offscreenImageSavings": 3448,
          "unusedJavascriptSavings": 54721,
          "unusedCssSavings": 84093
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 3448,
            "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": "medium",
            "estimatedSavingsBytes": 54721,
            "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": "high",
            "estimatedSavingsBytes": 84093,
            "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": "Eliminate render-blocking resources",
            "area": "render-path",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1634,
            "strategy": "Defer scripts/styles not required for first paint and preload only truly critical assets.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-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 www.barcelona.cat",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 147104,
            "url": "https://www.barcelona.cat/sites/default/files/styles/destacat_gran/public/residencies_528x228_1.jpg?itok=eLRK0j80",
            "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 www.barcelona.cat",
            "area": "font",
            "urgency": "medium",
            "estimatedSavingsBytes": 90559,
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "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": 64,
        "urgency": "high",
        "providerCount": 7,
        "requestCount": 8,
        "transferBytes": 139455,
        "notGreenCount": 5,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76425,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15565,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7143,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=n4eGNM&url=https%3A%2F%2Fwww.barcelona.cat%2Fes%2Fvivir-en-bcn%2Fcon-personas-mayores%2Fvivir-con-tranquilidad",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "high",
            "detail": "Track 7 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."
          },
          {
            "title": "Prioritize greener alternatives for third-party providers",
            "urgency": "high",
            "detail": "5 third-party script origin(s) are not confirmed green in the Green Web Foundation dataset."
          }
        ]
      },
      "redundancy": {
        "score": 15,
        "urgency": "medium",
        "transferBytes": 1445544,
        "estimatedRedundantBytes": 138814,
        "redundancyRatio": 0.09602889984670131,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 84093,
            "displayValue": "Est savings of 82 KiB"
          },
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 54721,
            "displayValue": "Est savings of 53 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 84093,
            "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 unused javascript",
            "urgency": "medium",
            "estimatedSavingsBytes": 54721,
            "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 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": 22,
        "urgency": "medium",
        "totalTransferBytes": 1445544,
        "heavyRequestCount": 6,
        "heavyBytes": 548789,
        "heavyRatio": 0.3796418510955045,
        "heavyRequests": [
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/destacat_gran/public/residencies_528x228_1.jpg?itok=eLRK0j80",
            "transferSize": 147104,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/destacat_gran/public/radars_528x228_1.jpg?itok=2g1Dis4m",
            "transferSize": 127834,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "transferSize": 90559,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "transferSize": 76425,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "cdn.matomo.cloud"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament/fonts/icoajuntament.ttf?8aaig7",
            "transferSize": 54922,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/css/css_qDD4BCxE8K-iT7MRORwp32v03DlJblP9-xrYwOBWlQo.css?delta=5&language=es&theme=barcelonacat_theme&include=eJyFz0EKwzAMBMAPxfjQB5m1o6YujmQsJU1-X0MhUHDpScvuXITnxoaV2AL2rKL-cxxqniJaoiKMBAuyU2t5JvVdb85ESt9_mYqF3J7p9Q3sQSv5KGJqDTWkmUfgDk5nlGO0LUUiilM7S-ZlJHISh-uvkVDZehcUrOH2D9QmU0wcOmvwVwp0GDVGmfRUo9VHKL0B6qeEHA&tcut5n",
            "transferSize": 51945,
            "resourceType": "stylesheet",
            "mimeType": "text/css",
            "domain": "www.barcelona.cat"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "image",
            "count": 2,
            "transferBytes": 274938
          },
          {
            "resourceType": "font",
            "count": 2,
            "transferBytes": 145481
          },
          {
            "resourceType": "script",
            "count": 1,
            "transferBytes": 76425
          },
          {
            "resourceType": "stylesheet",
            "count": 1,
            "transferBytes": 51945
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.barcelona.cat",
            "count": 5,
            "transferBytes": 472364
          },
          {
            "domain": "cdn.matomo.cloud",
            "count": 1,
            "transferBytes": 76425
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Split JavaScript by route or interaction",
            "urgency": "medium",
            "estimatedSavingsBytes": 54721,
            "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": "Defer non-critical UI modules until after first render",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "strategy": "Keep only above-the-fold resources in the initial path; hydrate or import secondary modules later.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 www.barcelona.cat",
            "urgency": "medium",
            "estimatedSavingsBytes": 147104,
            "strategy": "Serve a smaller placeholder first and load this asset only when the user scrolls to or requests the component.",
            "url": "https://www.barcelona.cat/sites/default/files/styles/destacat_gran/public/residencies_528x228_1.jpg?itok=eLRK0j80",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 www.barcelona.cat",
            "urgency": "medium",
            "estimatedSavingsBytes": 90559,
            "strategy": "Subset or defer this font so full font payloads are only fetched when needed.",
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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.01,
          "displayValue": "8.6 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: 8.6 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 53 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 53 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,
          "displayValue": "Est savings of 82 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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 82 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,
          "displayValue": "Est savings of 611 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 611 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 503 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 503 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": "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": 0,
          "displayValue": "Est savings of 1,630 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 Eliminate render-blocking resources\n\n- Lighthouse audit: render-blocking-resources\n- Current value: Est savings of 1,630 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\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": "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": 0.89,
          "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 Speed Index\n\n- Lighthouse audit: speed-index\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\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": "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 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 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": "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": "1,017 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: 1,017 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://barcelona.cat/es/que-hacer-en-bcn/ponte-en-forma/clubes",
      "status": "ok",
      "finalUrl": "https://www.barcelona.cat/es/que-hacer-en-bcn/ponte-en-forma/clubes",
      "performanceScore": 0.63,
      "bestPracticesScore": 1,
      "transferBytes": 938704,
      "co2Grams": 0.3596000425056,
      "greenWeb": {
        "page": {
          "hostname": "www.barcelona.cat",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-13T22:38:00.231825",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.barcelona.cat",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76426,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31745,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "stylesheet",
            "requestCount": 1,
            "transferBytes": 24659,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "cdnjs.cloudflare.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15865,
            "sampleUrl": "https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js",
            "greenCheck": {
              "hostname": "cdnjs.cloudflare.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:34",
              "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/cdnjs.cloudflare.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15566,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7144,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 4110,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/css/bcn-avisos.css",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "fonts.googleapis.com",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 2483,
            "sampleUrl": "https://fonts.googleapis.com/css?family=Source+Sans+3:200,200i,300,300i,400,400i,500,500i,600,600i,700,700i,900,900i",
            "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
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=LHU9cF&url=https%3A%2F%2Fwww.barcelona.cat%2Fes%2Fque-hacer-en-bcn%2Fponte-en-forma%2Fclubes",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 11,
          "greenCount": 5,
          "notGreenCount": 7,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 75,
        "urgency": "high",
        "pageElementOccurrences": 6,
        "uniqueElementsAssessed": 2,
        "reusedFromCacheCount": 2,
        "components": [
          {
            "signature": "form|get|/es/|input|text|query|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "text",
            "fieldName": "query",
            "formContext": "form|get|/es/",
            "hasLabel": true,
            "hasValidationRule": false,
            "hasErrorMessagingHook": false,
            "toolingFriendly": false,
            "assessment": {
              "score": 60,
              "urgency": "high",
              "issues": [
                "No explicit validation rule",
                "No error messaging hook",
                "Missing autocomplete for tooling support"
              ],
              "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.",
                "Provide meaningful autocomplete values to support browsers and assistive tooling."
              ]
            },
            "reusedFromCache": true
          },
          {
            "signature": "no-form|select|select|anonymous|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "select",
            "fieldName": null,
            "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": "No explicit validation rule",
            "urgency": "medium",
            "detail": "2 unique form control signature(s) on this page include this issue."
          },
          {
            "title": "No error messaging hook",
            "urgency": "medium",
            "detail": "2 unique form control signature(s) on this page include this issue."
          },
          {
            "title": "Missing autocomplete for tooling support",
            "urgency": "medium",
            "detail": "1 unique form control signature(s) on this page include this issue."
          },
          {
            "title": "Missing associated label",
            "urgency": "high",
            "detail": "1 unique form control signature(s) on this page include this issue."
          }
        ]
      },
      "metadata": {
        "score": 25,
        "urgency": "low",
        "checks": {
          "hasTitle": true,
          "hasLang": true,
          "hasDescription": false,
          "hasCanonical": true,
          "hasOpenGraphCore": false,
          "hasTwitterCard": true,
          "hasViewport": true,
          "hasCharset": true,
          "hasValidStructuredData": true,
          "hasInvalidStructuredData": false
        },
        "observed": {
          "title": "Clubes | Barcelona.cat | Ajuntament de Barcelona",
          "lang": "es",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "",
          "robots": "",
          "canonical": "https://www.barcelona.cat/es/que-hacer-en-bcn/ponte-en-forma/clubes",
          "ogTitle": "Clubes",
          "ogDescription": "",
          "ogType": "Web",
          "ogUrl": "https://www.barcelona.cat/es/que-hacer-en-bcn/ponte-en-forma/clubes",
          "twitterCard": "summary_large_image",
          "ldJsonCount": 0,
          "validLdJsonCount": 0,
          "invalidLdJsonCount": 0
        },
        "recommendations": [
          {
            "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."
          }
        ]
      },
      "layoutAdaptation": {
        "score": 30,
        "urgency": "medium",
        "checks": {
          "testedMobile": true,
          "testedTablet": true,
          "horizontalOverflowOnMobile": false,
          "horizontalOverflowOnTablet": false,
          "mobileSmallTapTargets": 63,
          "tabletSmallTapTargets": 62,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 63,
            "oversizedMedia": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 62,
            "oversizedMedia": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 63 small targets on mobile and 62 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 59,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": true,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": true,
          "externalScriptCount": 8,
          "externalScriptsWithoutIntegrity": 8,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "cache-control": "max-age=300, public",
            "content-encoding": "gzip",
            "content-language": "es",
            "content-length": "13987",
            "content-type": "text/html; charset=UTF-8",
            "date": "Mon, 13 Apr 2026 23:01:19 GMT",
            "etag": "\"1776121278-gzip\"",
            "expires": "Sun, 19 Nov 1978 05:00:00 GMT",
            "last-modified": "Mon, 13 Apr 2026 23:01:18 GMT",
            "server": "nginx",
            "vary": "Cookie,Accept-Encoding",
            "via": "1.1 ca2190123e61f1744d1210c24c87c840.cloudfront.net (CloudFront)",
            "x-amz-cf-id": "njO4ljOcUxLB5l_XZXRQf1agwBl3kR8qQGY0-_IE_-XkzSZm-Yj88w==",
            "x-amz-cf-pop": "IAD12-P5",
            "x-cache": "Miss from cloudfront",
            "x-content-type-options": "nosniff",
            "x-frame-options": "SAMEORIGIN",
            "x-generator": "Drupal 10 (https://www.drupal.org)"
          },
          "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": "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": "8 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 25,
        "urgency": "low",
        "origin": "https://www.barcelona.cat",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://www.barcelona.cat/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/sitemap.xml",
            "found": true,
            "status": 200,
            "contentType": "application/xml; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/manifest.webmanifest",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/favicon.ico",
            "found": true,
            "status": 200,
            "contentType": "image/x-icon"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "low",
            "detail": "Missing beneficial file(s): /.well-known/security.txt, /manifest.webmanifest."
          }
        ]
      },
      "mediaHints": {
        "score": 50,
        "urgency": "medium",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 21,
          "imagesWithLazy": 0,
          "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 21 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 85,
        "urgency": "medium",
        "data": {
          "hasPrintStyles": true,
          "hasReducedMotion": true,
          "media": {
            "totalImages": 26,
            "lazyImages": 1,
            "totalIframes": 1,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "\"Source Sans Pro\", \"Helvetica Neue\", Helvetica, Arial, sans-serif",
            "usesSystemFont": true
          },
          "tracking": {
            "count": 0,
            "scripts": []
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 1/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": "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"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 23,
        "urgency": "low",
        "totalEstimatedSavingsBytes": 214886.55,
        "checks": {
          "hasEffectiveTextCompression": false
        },
        "opportunities": [
          {
            "id": "uses-text-compression",
            "title": "Enable Brotli/gzip for text assets",
            "urgency": "medium",
            "estimatedSavingsBytes": 84444,
            "detail": "Compress HTML, CSS, JS, JSON, SVG, and XML responses with Brotli or gzip."
          },
          {
            "id": "modern-image-formats",
            "title": "Use modern image compression formats",
            "urgency": "medium",
            "estimatedSavingsBytes": 72410.55,
            "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size."
          },
          {
            "id": "uses-optimized-images",
            "title": "Improve image encoding quality/size",
            "urgency": "medium",
            "estimatedSavingsBytes": 58032,
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings."
          }
        ],
        "recommendations": [
          {
            "title": "Enable Brotli/gzip for text assets",
            "urgency": "medium",
            "detail": "Compress HTML, CSS, JS, JSON, SVG, and XML responses with Brotli or gzip. Estimated savings: 82.46 KB."
          },
          {
            "title": "Use modern image compression formats",
            "urgency": "medium",
            "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size. Estimated savings: 70.71 KB."
          },
          {
            "title": "Improve image encoding quality/size",
            "urgency": "medium",
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 56.67 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": 426398.55,
        "totalEstimatedBlockingMs": 1647,
        "opportunities": [
          {
            "id": "render-blocking-resources",
            "title": "Eliminate render-blocking resources",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering.",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1647,
            "displayValue": "Est savings of 1,650 ms",
            "urgency": "high",
            "sourceAuditId": "render-blocking-resources"
          },
          {
            "id": "unused-css-rules",
            "title": "Remove unused CSS",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped.",
            "estimatedSavingsBytes": 91923,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 90 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-css-rules"
          },
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 87108,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 85 KiB",
            "urgency": "medium",
            "sourceAuditId": "offscreen-images"
          },
          {
            "id": "uses-text-compression",
            "title": "Enable text compression",
            "detail": "Serve text assets with Brotli or gzip to remove avoidable transfer bloat.",
            "estimatedSavingsBytes": 84444,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 82 KiB",
            "urgency": "medium",
            "sourceAuditId": "uses-text-compression"
          },
          {
            "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": 72410.55,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 71 KiB",
            "urgency": "medium",
            "sourceAuditId": "modern-image-formats"
          },
          {
            "id": "uses-optimized-images",
            "title": "Compress oversized image assets",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss.",
            "estimatedSavingsBytes": 58032,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 57 KiB",
            "urgency": "medium",
            "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": 32481,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 32 KiB",
            "urgency": "low",
            "sourceAuditId": "unused-javascript"
          }
        ],
        "recommendations": [
          {
            "title": "Eliminate render-blocking resources",
            "urgency": "high",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering. Estimated render unblocking: 1647 ms."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "medium",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 89.77 KB."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "medium",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 85.07 KB."
          },
          {
            "title": "Enable text compression",
            "urgency": "medium",
            "detail": "Serve text assets with Brotli or gzip to remove avoidable transfer bloat. Estimated byte savings: 82.46 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: 70.71 KB."
          },
          {
            "title": "Compress oversized image assets",
            "urgency": "medium",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 56.67 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": 10,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 8,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "8 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": 167994.8644553073
        },
        "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: 164.06 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: 164.06 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": "medium",
        "transferBytes": 938704,
        "css": {
          "unusedBytes": 91923,
          "ratio": 0.09792543762463993,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 32481,
          "duplicatedBytes": 0,
          "ratio": 0.03460196185378991,
          "auditIds": [
            "unused-javascript",
            "duplicated-javascript"
          ]
        },
        "html": {
          "estimatedPenalty": 0.25,
          "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": "high",
            "estimatedSavingsBytes": 91923,
            "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": "medium",
            "estimatedSavingsBytes": 32481,
            "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": 938704,
        "estimatedDeferrableBytes": 211512,
        "renderBlockingMs": 1647,
        "breakdown": {
          "offscreenImageSavings": 87108,
          "unusedJavascriptSavings": 32481,
          "unusedCssSavings": 91923
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 87108,
            "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": "medium",
            "estimatedSavingsBytes": 32481,
            "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": "high",
            "estimatedSavingsBytes": 91923,
            "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": "Eliminate render-blocking resources",
            "area": "render-path",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1647,
            "strategy": "Defer scripts/styles not required for first paint and preload only truly critical assets.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-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 www.barcelona.cat",
            "area": "font",
            "urgency": "medium",
            "estimatedSavingsBytes": 90559,
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "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 www.barcelona.cat",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 84136,
            "url": "https://www.barcelona.cat/themes/barcelonacat_theme/images/menu/viula.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 cdn.matomo.cloud",
            "area": "script",
            "urgency": "medium",
            "estimatedSavingsBytes": 76426,
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.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": 65,
        "urgency": "high",
        "providerCount": 8,
        "requestCount": 9,
        "transferBytes": 155322,
        "notGreenCount": 5,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76426,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31745,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "cdnjs.cloudflare.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15865,
            "sampleUrl": "https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js",
            "greenCheck": {
              "hostname": "cdnjs.cloudflare.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:34",
              "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/cdnjs.cloudflare.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15566,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7144,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=LHU9cF&url=https%3A%2F%2Fwww.barcelona.cat%2Fes%2Fque-hacer-en-bcn%2Fponte-en-forma%2Fclubes",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "high",
            "detail": "Track 8 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."
          },
          {
            "title": "Prioritize greener alternatives for third-party providers",
            "urgency": "high",
            "detail": "5 third-party script origin(s) are not confirmed green in the Green Web Foundation dataset."
          }
        ]
      },
      "redundancy": {
        "score": 42,
        "urgency": "medium",
        "transferBytes": 938704,
        "estimatedRedundantBytes": 124404,
        "redundancyRatio": 0.13252739947842984,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 91923,
            "displayValue": "Est savings of 90 KiB"
          },
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 32481,
            "displayValue": "Est savings of 32 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 91923,
            "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 unused javascript",
            "urgency": "medium",
            "estimatedSavingsBytes": 32481,
            "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": "Enable and verify text compression",
            "urgency": "medium",
            "estimatedSavingsBytes": 84444,
            "auditId": "uses-text-compression",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "2",
              "title": "Remove unnecessary or redundant information",
              "url": "https://www.w3.org/TR/web-sustainability-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": 18,
        "urgency": "medium",
        "totalTransferBytes": 938704,
        "heavyRequestCount": 4,
        "heavyBytes": 271002,
        "heavyRatio": 0.28869803473725475,
        "heavyRequests": [
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "transferSize": 90559,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "transferSize": 76426,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "cdn.matomo.cloud"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament/fonts/icoajuntament.ttf?8aaig7",
            "transferSize": 54922,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/css/css_evpTRQTawGYS1Ro7RbXq3hBxwat7AU-RJm1V8ZgzeaE.css?delta=5&language=es&theme=barcelonacat_theme&include=eJyFztEOwiAMheEXgnDhA5EDq4gySmiZ7u1dYuJinPGqTf_voriOqpipqseShcW9hkXLBntMI8NNUGo53qh_JzpjFBUT0CMVrohQzwv1nicSt8lhlbls_ZdpSGSXTPdPoBeayQVmFe1oPk71CKTCAcWKriXXdCRyZLv_fSSEx3bzgir-9A-0zibE6jfW4d6bp4dSryhGVlGaXYDQE_H9jbg&tcut5n",
            "transferSize": 49095,
            "resourceType": "stylesheet",
            "mimeType": "text/css",
            "domain": "www.barcelona.cat"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "font",
            "count": 2,
            "transferBytes": 145481
          },
          {
            "resourceType": "script",
            "count": 1,
            "transferBytes": 76426
          },
          {
            "resourceType": "stylesheet",
            "count": 1,
            "transferBytes": 49095
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.barcelona.cat",
            "count": 3,
            "transferBytes": 194576
          },
          {
            "domain": "cdn.matomo.cloud",
            "count": 1,
            "transferBytes": 76426
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Lazy-load offscreen images and media galleries",
            "urgency": "medium",
            "estimatedSavingsBytes": 87108,
            "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": "Defer non-critical UI modules until after first render",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "strategy": "Keep only above-the-fold resources in the initial path; hydrate or import secondary modules later.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 www.barcelona.cat",
            "urgency": "medium",
            "estimatedSavingsBytes": 90559,
            "strategy": "Subset or defer this font so full font payloads are only fetched when needed.",
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 cdn.matomo.cloud",
            "urgency": "medium",
            "estimatedSavingsBytes": 76426,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.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": "9.9 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: 9.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,
          "displayValue": "Est savings of 32 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 32 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,
          "displayValue": "Est savings of 90 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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 90 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,
          "displayValue": "Est savings of 71 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 71 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 57 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 57 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,
          "displayValue": "Est savings of 85 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 85 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": "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": 0,
          "displayValue": "Est savings of 1,650 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 Eliminate render-blocking resources\n\n- Lighthouse audit: render-blocking-resources\n- Current value: Est savings of 1,650 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\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": 0,
          "displayValue": "Est savings of 82 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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- Current value: Est savings of 82 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\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": "server-response-time",
          "title": "Reduce initial server response time",
          "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": 0,
          "displayValue": "Root document took 1,040 ms",
          "impact": "high",
          "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 Reduce initial server response time\n\n- Lighthouse audit: server-response-time\n- Current value: Root document took 1,040 ms\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": "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,
          "displayValue": "1,176 elements",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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: 1,176 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"
        },
        {
          "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": 0.77,
          "displayValue": "4.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 Speed Index\n\n- Lighthouse audit: speed-index\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\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"
        }
      ]
    },
    {
      "url": "https://barcelona.cat/en/what-to-do-in-bcn/parks-and-gardens/history",
      "status": "ok",
      "finalUrl": "https://www.barcelona.cat/en/what-to-do-in-bcn/parks-and-gardens/history",
      "performanceScore": 0.47,
      "bestPracticesScore": 1,
      "transferBytes": 2517632,
      "co2Grams": 0.9644579912448001,
      "greenWeb": {
        "page": {
          "hostname": "www.barcelona.cat",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-13T22:38:00.231825",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.barcelona.cat",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76424,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "stylesheet",
            "requestCount": 1,
            "transferBytes": 24654,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15565,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7144,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 4110,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/css/bcn-avisos.css",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "fonts.googleapis.com",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 2484,
            "sampleUrl": "https://fonts.googleapis.com/css?family=Source+Sans+3:200,200i,300,300i,400,400i,500,500i,600,600i,700,700i,900,900i",
            "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
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=mREbag&url=https%3A%2F%2Fwww.barcelona.cat%2Fen%2Fwhat-to-do-in-bcn%2Fparks-and-gardens%2Fhistory",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 10,
          "greenCount": 4,
          "notGreenCount": 7,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 60,
        "urgency": "high",
        "pageElementOccurrences": 1,
        "uniqueElementsAssessed": 1,
        "reusedFromCacheCount": 1,
        "components": [
          {
            "signature": "form|get|/en|input|text|query|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "text",
            "fieldName": "query",
            "formContext": "form|get|/en",
            "hasLabel": true,
            "hasValidationRule": false,
            "hasErrorMessagingHook": false,
            "toolingFriendly": false,
            "assessment": {
              "score": 60,
              "urgency": "high",
              "issues": [
                "No explicit validation rule",
                "No error messaging hook",
                "Missing autocomplete for tooling support"
              ],
              "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.",
                "Provide meaningful autocomplete values to support browsers and assistive tooling."
              ]
            },
            "reusedFromCache": true
          }
        ],
        "recommendations": [
          {
            "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."
          },
          {
            "title": "Missing autocomplete for tooling support",
            "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": "Parks History | Barcelona website | Barcelona City Council",
          "lang": "en",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "Discover the history behind Barcelona's parks and gardens, a truly fascinating story you will be amazed by, and find out how our city's parks were formed.",
          "robots": "",
          "canonical": "https://www.barcelona.cat/en/what-to-do-in-bcn/parks-and-gardens/history",
          "ogTitle": "History",
          "ogDescription": "Learn about the history of the city’s parks and gardens: from the early days following the industrial revolution, through the 1888 Universal Exhibition and the 1929 International Exhibition, right up until the present day.",
          "ogType": "Web",
          "ogUrl": "https://www.barcelona.cat/en/what-to-do-in-bcn/parks-and-gardens/history",
          "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": 34,
        "urgency": "medium",
        "checks": {
          "testedMobile": true,
          "testedTablet": true,
          "horizontalOverflowOnMobile": false,
          "horizontalOverflowOnTablet": false,
          "mobileSmallTapTargets": 40,
          "tabletSmallTapTargets": 34,
          "fixedWidthOffenders": 2,
          "oversizedMedia": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 1,
            "smallTapTargets": 40,
            "oversizedMedia": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 1,
            "smallTapTargets": 34,
            "oversizedMedia": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 40 small targets on mobile and 34 on tablet."
          },
          {
            "title": "Refactor fixed-width components",
            "urgency": "medium",
            "detail": "2 element(s) exceeded viewport width in tested layouts; use responsive component constraints."
          }
        ]
      },
      "securityLight": {
        "score": 59,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": true,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": true,
          "externalScriptCount": 7,
          "externalScriptsWithoutIntegrity": 7,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "cache-control": "max-age=300, public",
            "content-encoding": "gzip",
            "content-language": "en",
            "content-length": "14894",
            "content-type": "text/html; charset=UTF-8",
            "date": "Mon, 13 Apr 2026 23:01:33 GMT",
            "etag": "\"1776121293-gzip\"",
            "expires": "Sun, 19 Nov 1978 05:00:00 GMT",
            "last-modified": "Mon, 13 Apr 2026 23:01:33 GMT",
            "server": "nginx",
            "vary": "Cookie,Accept-Encoding",
            "via": "1.1 ca2190123e61f1744d1210c24c87c840.cloudfront.net (CloudFront)",
            "x-amz-cf-id": "i8Lh1laLfCCiU-PqnhVSaWiRSdAtJqEA1lv_dJMo2aVSmYKY1NadTw==",
            "x-amz-cf-pop": "IAD12-P5",
            "x-cache": "Miss from cloudfront",
            "x-content-type-options": "nosniff",
            "x-frame-options": "SAMEORIGIN",
            "x-generator": "Drupal 10 (https://www.drupal.org)"
          },
          "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": "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": "7 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 25,
        "urgency": "low",
        "origin": "https://www.barcelona.cat",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://www.barcelona.cat/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/sitemap.xml",
            "found": true,
            "status": 200,
            "contentType": "application/xml; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/manifest.webmanifest",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/favicon.ico",
            "found": true,
            "status": 200,
            "contentType": "image/x-icon"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "low",
            "detail": "Missing beneficial file(s): /.well-known/security.txt, /manifest.webmanifest."
          }
        ]
      },
      "mediaHints": {
        "score": 25,
        "urgency": "low",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 19,
          "imagesWithLazy": 8,
          "imagesWithoutLazy": 11
        },
        "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": "11 of 19 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 85,
        "urgency": "medium",
        "data": {
          "hasPrintStyles": true,
          "hasReducedMotion": true,
          "media": {
            "totalImages": 24,
            "lazyImages": 9,
            "totalIframes": 1,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "\"Source Sans Pro\", \"Helvetica Neue\", Helvetica, Arial, sans-serif",
            "usesSystemFont": true
          },
          "tracking": {
            "count": 0,
            "scripts": []
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 9/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": "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"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 100,
        "urgency": "high",
        "totalEstimatedSavingsBytes": 2806935.1500000004,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Use modern image compression formats",
            "urgency": "high",
            "estimatedSavingsBytes": 1516471.1500000001,
            "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": 1290464,
            "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: 1.45 MB."
          },
          {
            "title": "Improve image encoding quality/size",
            "urgency": "high",
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 1.23 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": 3225720.1500000004,
        "totalEstimatedBlockingMs": 2114,
        "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": 1516471.1500000001,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 1,481 KiB",
            "urgency": "high",
            "sourceAuditId": "modern-image-formats"
          },
          {
            "id": "uses-optimized-images",
            "title": "Compress oversized image assets",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss.",
            "estimatedSavingsBytes": 1290464,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 1,260 KiB",
            "urgency": "high",
            "sourceAuditId": "uses-optimized-images"
          },
          {
            "id": "uses-responsive-images",
            "title": "Right-size images for viewport",
            "detail": "Avoid sending larger images than the rendered size needs.",
            "estimatedSavingsBytes": 193030,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 189 KiB",
            "urgency": "high",
            "sourceAuditId": "uses-responsive-images"
          },
          {
            "id": "render-blocking-resources",
            "title": "Eliminate render-blocking resources",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering.",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 2114,
            "displayValue": "Est savings of 2,110 ms",
            "urgency": "high",
            "sourceAuditId": "render-blocking-resources"
          },
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 87109,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 85 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": 83290,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 81 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-css-rules"
          },
          {
            "id": "unused-javascript",
            "title": "Remove unused JavaScript",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code.",
            "estimatedSavingsBytes": 55356,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 54 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-javascript"
          }
        ],
        "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.45 MB."
          },
          {
            "title": "Compress oversized image assets",
            "urgency": "high",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 1.23 MB."
          },
          {
            "title": "Right-size images for viewport",
            "urgency": "high",
            "detail": "Avoid sending larger images than the rendered size needs. Estimated byte savings: 188.51 KB."
          },
          {
            "title": "Eliminate render-blocking resources",
            "urgency": "high",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering. Estimated render unblocking: 2114 ms."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "medium",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 85.07 KB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "medium",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 81.34 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": 10,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 7,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "7 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": 167993.09001396652
        },
        "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: 164.06 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: 164.06 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": "medium",
        "transferBytes": 2517632,
        "css": {
          "unusedBytes": 83290,
          "ratio": 0.03308267451319335,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 55356,
          "duplicatedBytes": 0,
          "ratio": 0.0219873277746708,
          "auditIds": [
            "unused-javascript",
            "duplicated-javascript"
          ]
        },
        "html": {
          "estimatedPenalty": 0.25,
          "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": "high",
            "estimatedSavingsBytes": 83290,
            "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": "medium",
            "estimatedSavingsBytes": 55356,
            "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": 2517632,
        "estimatedDeferrableBytes": 225755,
        "renderBlockingMs": 2114,
        "breakdown": {
          "offscreenImageSavings": 87109,
          "unusedJavascriptSavings": 55356,
          "unusedCssSavings": 83290
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 87109,
            "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": "medium",
            "estimatedSavingsBytes": 55356,
            "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": "high",
            "estimatedSavingsBytes": 83290,
            "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": "Eliminate render-blocking resources",
            "area": "render-path",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 2114,
            "strategy": "Defer scripts/styles not required for first paint and preload only truly critical assets.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-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 www.barcelona.cat",
            "area": "image",
            "urgency": "high",
            "estimatedSavingsBytes": 640814,
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_medium/public/parc%20historia4%209000_2.jpg?itok=44acrWim",
            "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": 64,
        "urgency": "high",
        "providerCount": 7,
        "requestCount": 8,
        "transferBytes": 139455,
        "notGreenCount": 5,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76424,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15565,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7144,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=mREbag&url=https%3A%2F%2Fwww.barcelona.cat%2Fen%2Fwhat-to-do-in-bcn%2Fparks-and-gardens%2Fhistory",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "high",
            "detail": "Track 7 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."
          },
          {
            "title": "Prioritize greener alternatives for third-party providers",
            "urgency": "high",
            "detail": "5 third-party script origin(s) are not confirmed green in the Green Web Foundation dataset."
          }
        ]
      },
      "redundancy": {
        "score": 23,
        "urgency": "medium",
        "transferBytes": 2517632,
        "estimatedRedundantBytes": 138646,
        "redundancyRatio": 0.05507000228786415,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 83290,
            "displayValue": "Est savings of 81 KiB"
          },
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 55356,
            "displayValue": "Est savings of 54 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 83290,
            "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 unused javascript",
            "urgency": "medium",
            "estimatedSavingsBytes": 55356,
            "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 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": 41,
        "urgency": "high",
        "totalTransferBytes": 2517632,
        "heavyRequestCount": 8,
        "heavyBytes": 1984121,
        "heavyRatio": 0.7880901577355229,
        "heavyRequests": [
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_medium/public/parc%20historia4%209000_2.jpg?itok=44acrWim",
            "transferSize": 640814,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_medium/public/kZttyEUGUJaxb8LlEs08MDrl7GHEFLy8nd50SuCA7-k_1.jpeg?itok=iuAGsOFj",
            "transferSize": 414447,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_medium/public/ciutadella%201_1.jpg?itok=0LrL8vjf",
            "transferSize": 376223,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_medium/public/horta_2.jpg?itok=CrhTqQES",
            "transferSize": 278798,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "transferSize": 90560,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "transferSize": 76424,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "cdn.matomo.cloud"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament/fonts/icoajuntament.ttf?8aaig7",
            "transferSize": 54921,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/css/css_qDD4BCxE8K-iT7MRORwp32v03DlJblP9-xrYwOBWlQo.css?delta=6&language=en&theme=barcelonacat_theme&include=eJyFz8FuxCAMBNAfCsuhH4QG4ia0DkbYpJu_L9JKW1VitSdbM-8y-OrFcFCxgDOrqH8ch5qXiJaIpSDBgpzUWl5J_dDdmQiP_pWp2MidmX7-A9vpIB9FTK2hhrSWGfhESVeU-6zbWCLYqV2cyzYTOYnDc9dMKOf07ZASqebINDXSRxYURcPHO1CbLDGVMFiDf36B7katgJeKhm0s3tWvrVfw7S-59VJ75Kw7rYteanT4CKVfKxCiTQ&tcut5n",
            "transferSize": 51934,
            "resourceType": "stylesheet",
            "mimeType": "text/css",
            "domain": "www.barcelona.cat"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "image",
            "count": 4,
            "transferBytes": 1710282
          },
          {
            "resourceType": "font",
            "count": 2,
            "transferBytes": 145481
          },
          {
            "resourceType": "script",
            "count": 1,
            "transferBytes": 76424
          },
          {
            "resourceType": "stylesheet",
            "count": 1,
            "transferBytes": 51934
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.barcelona.cat",
            "count": 7,
            "transferBytes": 1907697
          },
          {
            "domain": "cdn.matomo.cloud",
            "count": 1,
            "transferBytes": 76424
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Lazy-load offscreen images and media galleries",
            "urgency": "medium",
            "estimatedSavingsBytes": 87109,
            "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": "medium",
            "estimatedSavingsBytes": 55356,
            "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": "Defer non-critical UI modules until after first render",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "strategy": "Keep only above-the-fold resources in the initial path; hydrate or import secondary modules later.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 www.barcelona.cat",
            "urgency": "high",
            "estimatedSavingsBytes": 640814,
            "strategy": "Serve a smaller placeholder first and load this asset only when the user scrolls to or requests the component.",
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_medium/public/parc%20historia4%209000_2.jpg?itok=44acrWim",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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": "18.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: 18.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 54 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 54 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,
          "displayValue": "Est savings of 81 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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 81 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,
          "displayValue": "Est savings of 1,481 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,481 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 1,260 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 1,260 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,
          "displayValue": "Est savings of 85 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 85 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": "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": 0,
          "displayValue": "Est savings of 2,110 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 Eliminate render-blocking resources\n\n- Lighthouse audit: render-blocking-resources\n- Current value: Est savings of 2,110 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\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": "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,
          "displayValue": "1,025 elements",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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: 1,025 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"
        },
        {
          "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": 0.72,
          "displayValue": "4.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 Speed Index\n\n- Lighthouse audit: speed-index\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\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"
        }
      ]
    },
    {
      "url": "https://barcelona.cat/es/que-hacer-en-bcn/parque-montjuic/conoce-el-consejo-del-parque-de-montjuic",
      "status": "ok",
      "finalUrl": "https://www.barcelona.cat/es/que-hacer-en-bcn/parque-montjuic/conoce-el-consejo-del-parque-de-montjuic",
      "performanceScore": 0.51,
      "bestPracticesScore": 1,
      "transferBytes": 1057686,
      "co2Grams": 0.4051798336404,
      "greenWeb": {
        "page": {
          "hostname": "www.barcelona.cat",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-13T22:38:00.231825",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.barcelona.cat",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76427,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31745,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "stylesheet",
            "requestCount": 1,
            "transferBytes": 24654,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15566,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7145,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5656,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 4109,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/css/bcn-avisos.css",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "fonts.googleapis.com",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 2483,
            "sampleUrl": "https://fonts.googleapis.com/css?family=Source+Sans+3:200,200i,300,300i,400,400i,500,500i,600,600i,700,700i,900,900i",
            "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
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=uvqNOF&url=https%3A%2F%2Fwww.barcelona.cat%2Fes%2Fque-hacer-en-bcn%2Fparque-montjuic%2Fconoce-el-consejo-del-parque-de-montjuic",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 10,
          "greenCount": 4,
          "notGreenCount": 7,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 60,
        "urgency": "high",
        "pageElementOccurrences": 1,
        "uniqueElementsAssessed": 1,
        "reusedFromCacheCount": 1,
        "components": [
          {
            "signature": "form|get|/es/|input|text|query|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "text",
            "fieldName": "query",
            "formContext": "form|get|/es/",
            "hasLabel": true,
            "hasValidationRule": false,
            "hasErrorMessagingHook": false,
            "toolingFriendly": false,
            "assessment": {
              "score": 60,
              "urgency": "high",
              "issues": [
                "No explicit validation rule",
                "No error messaging hook",
                "Missing autocomplete for tooling support"
              ],
              "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.",
                "Provide meaningful autocomplete values to support browsers and assistive tooling."
              ]
            },
            "reusedFromCache": true
          }
        ],
        "recommendations": [
          {
            "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."
          },
          {
            "title": "Missing autocomplete for tooling support",
            "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": "Consejo del Parque de Montjuïc | Ayuntamiento de Barcelona",
          "lang": "es",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "El Consejo del Parque de Montjuïc es un órgano estable y permanente de participación del Distrito de Sants-Montjuïc creado en el 2014 para canalizar y coordinar las actuaciones y el funcionamiento del parque.",
          "robots": "",
          "canonical": "https://www.barcelona.cat/es/que-hacer-en-bcn/parque-montjuic/conoce-el-consejo-del-parque-de-montjuic",
          "ogTitle": "Consejo del Parque de Montjuïc | Ayuntamiento de Barcelona",
          "ogDescription": "El Consejo del Parque de Montjuïc es un órgano estable y permanente de participación del Distrito de Sants-Montjuïc creado en el 2014 para canalizar y coordinar las actuaciones y el funcionamiento del parque.",
          "ogType": "Web",
          "ogUrl": "https://www.barcelona.cat/es/que-hacer-en-bcn/parque-montjuic/conoce-el-consejo-del-parque-de-montjuic",
          "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": 34,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 37,
            "oversizedMedia": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 34,
            "oversizedMedia": 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 34 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 59,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": true,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": true,
          "externalScriptCount": 7,
          "externalScriptsWithoutIntegrity": 7,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "cache-control": "max-age=300, public",
            "content-encoding": "gzip",
            "content-language": "es",
            "content-length": "10998",
            "content-type": "text/html; charset=UTF-8",
            "date": "Mon, 13 Apr 2026 23:01:47 GMT",
            "etag": "\"1776121306-gzip\"",
            "expires": "Sun, 19 Nov 1978 05:00:00 GMT",
            "last-modified": "Mon, 13 Apr 2026 23:01:46 GMT",
            "server": "nginx",
            "vary": "Cookie,Accept-Encoding",
            "via": "1.1 ca2190123e61f1744d1210c24c87c840.cloudfront.net (CloudFront)",
            "x-amz-cf-id": "p7Qg9uD5FPodWdt2cL91SwNiFexEhXmnJai1EgoFtpyCQ4-D4ARCZg==",
            "x-amz-cf-pop": "IAD12-P5",
            "x-cache": "Miss from cloudfront",
            "x-content-type-options": "nosniff",
            "x-frame-options": "SAMEORIGIN",
            "x-generator": "Drupal 10 (https://www.drupal.org)"
          },
          "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": "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": "7 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 25,
        "urgency": "low",
        "origin": "https://www.barcelona.cat",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://www.barcelona.cat/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/sitemap.xml",
            "found": true,
            "status": 200,
            "contentType": "application/xml; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/manifest.webmanifest",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/favicon.ico",
            "found": true,
            "status": 200,
            "contentType": "image/x-icon"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "low",
            "detail": "Missing beneficial file(s): /.well-known/security.txt, /manifest.webmanifest."
          }
        ]
      },
      "mediaHints": {
        "score": 45,
        "urgency": "medium",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 12,
          "imagesWithLazy": 1,
          "imagesWithoutLazy": 11
        },
        "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": "11 of 12 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 85,
        "urgency": "medium",
        "data": {
          "hasPrintStyles": true,
          "hasReducedMotion": true,
          "media": {
            "totalImages": 17,
            "lazyImages": 2,
            "totalIframes": 1,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "\"Source Sans Pro\", \"Helvetica Neue\", Helvetica, Arial, sans-serif",
            "usesSystemFont": true
          },
          "tracking": {
            "count": 0,
            "scripts": []
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 2/17 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": "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"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 51,
        "urgency": "medium",
        "totalEstimatedSavingsBytes": 535998.95,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Use modern image compression formats",
            "urgency": "high",
            "estimatedSavingsBytes": 299663.95,
            "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": 236335,
            "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: 292.64 KB."
          },
          {
            "title": "Improve image encoding quality/size",
            "urgency": "high",
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 230.80 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": 768633.95,
        "totalEstimatedBlockingMs": 1629,
        "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": 299663.95,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 293 KiB",
            "urgency": "high",
            "sourceAuditId": "modern-image-formats"
          },
          {
            "id": "uses-optimized-images",
            "title": "Compress oversized image assets",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss.",
            "estimatedSavingsBytes": 236335,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 231 KiB",
            "urgency": "high",
            "sourceAuditId": "uses-optimized-images"
          },
          {
            "id": "render-blocking-resources",
            "title": "Eliminate render-blocking resources",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering.",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1629,
            "displayValue": "Est savings of 1,630 ms",
            "urgency": "high",
            "sourceAuditId": "render-blocking-resources"
          },
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 87108,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 85 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": 81306,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 79 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-css-rules"
          },
          {
            "id": "unused-javascript",
            "title": "Remove unused JavaScript",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code.",
            "estimatedSavingsBytes": 32481,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 32 KiB",
            "urgency": "low",
            "sourceAuditId": "unused-javascript"
          },
          {
            "id": "uses-responsive-images",
            "title": "Right-size images for viewport",
            "detail": "Avoid sending larger images than the rendered size needs.",
            "estimatedSavingsBytes": 31740,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 31 KiB",
            "urgency": "low",
            "sourceAuditId": "uses-responsive-images"
          }
        ],
        "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: 292.64 KB."
          },
          {
            "title": "Compress oversized image assets",
            "urgency": "high",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 230.80 KB."
          },
          {
            "title": "Eliminate render-blocking resources",
            "urgency": "high",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering. Estimated render unblocking: 1629 ms."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "medium",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 85.07 KB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "medium",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 79.40 KB."
          },
          {
            "title": "Remove unused JavaScript",
            "urgency": "low",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 31.72 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": 10,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 7,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "7 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": 167990.49542597766
        },
        "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: 164.05 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: 164.05 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": "medium",
        "transferBytes": 1057686,
        "css": {
          "unusedBytes": 81306,
          "ratio": 0.07687158570691112,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 32481,
          "duplicatedBytes": 0,
          "ratio": 0.03070949223115367,
          "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": "high",
            "estimatedSavingsBytes": 81306,
            "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": "medium",
            "estimatedSavingsBytes": 32481,
            "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": 20,
        "urgency": "high",
        "transferBytes": 1057686,
        "estimatedDeferrableBytes": 200895,
        "renderBlockingMs": 1629,
        "breakdown": {
          "offscreenImageSavings": 87108,
          "unusedJavascriptSavings": 32481,
          "unusedCssSavings": 81306
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 87108,
            "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": "medium",
            "estimatedSavingsBytes": 32481,
            "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": 81306,
            "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": "Eliminate render-blocking resources",
            "area": "render-path",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1629,
            "strategy": "Defer scripts/styles not required for first paint and preload only truly critical assets.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-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 www.barcelona.cat",
            "area": "image",
            "urgency": "high",
            "estimatedSavingsBytes": 281361,
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_medium/public/consell_parc_710x379.jpg?itok=UGq7VN6i",
            "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 www.barcelona.cat",
            "area": "font",
            "urgency": "medium",
            "estimatedSavingsBytes": 90561,
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "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 cdn.matomo.cloud",
            "area": "script",
            "urgency": "medium",
            "estimatedSavingsBytes": 76427,
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.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": 64,
        "urgency": "high",
        "providerCount": 7,
        "requestCount": 8,
        "transferBytes": 139669,
        "notGreenCount": 5,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76427,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31745,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15566,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7145,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5656,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=uvqNOF&url=https%3A%2F%2Fwww.barcelona.cat%2Fes%2Fque-hacer-en-bcn%2Fparque-montjuic%2Fconoce-el-consejo-del-parque-de-montjuic",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "high",
            "detail": "Track 7 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."
          },
          {
            "title": "Prioritize greener alternatives for third-party providers",
            "urgency": "high",
            "detail": "5 third-party script origin(s) are not confirmed green in the Green Web Foundation dataset."
          }
        ]
      },
      "redundancy": {
        "score": 16,
        "urgency": "low",
        "transferBytes": 1057686,
        "estimatedRedundantBytes": 113787,
        "redundancyRatio": 0.10758107793806479,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 81306,
            "displayValue": "Est savings of 79 KiB"
          },
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 32481,
            "displayValue": "Est savings of 32 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 81306,
            "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 unused javascript",
            "urgency": "medium",
            "estimatedSavingsBytes": 32481,
            "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 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": 28,
        "urgency": "medium",
        "totalTransferBytes": 1057686,
        "heavyRequestCount": 5,
        "heavyBytes": 552368,
        "heavyRatio": 0.5222419508247249,
        "heavyRequests": [
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_medium/public/consell_parc_710x379.jpg?itok=UGq7VN6i",
            "transferSize": 281361,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "transferSize": 90561,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "transferSize": 76427,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "cdn.matomo.cloud"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament/fonts/icoajuntament.ttf?8aaig7",
            "transferSize": 54922,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/css/css_evpTRQTawGYS1Ro7RbXq3hBxwat7AU-RJm1V8ZgzeaE.css?delta=5&language=es&theme=barcelonacat_theme&include=eJyFzsGKwzAMBNAfiuvDfpAZOyJxcSQjydn272sodFnIsieJmXcY3Ac7DmJPOKuJxfcJ6HXJ0EJNGAWe5CTVupLFqUdwkTb7v0zHRuGs9P0b-E4HxSzi5oqeyspXYGuS0YL5s1XerkQtEvDZfiVMxsySgS19_Qe6ypILp8kU8fMlejgpoy0dim0u3i2uOjra7Se5De4jt2o7rYs9zemIGUYvwgyJSg&tcut5n",
            "transferSize": 49097,
            "resourceType": "stylesheet",
            "mimeType": "text/css",
            "domain": "www.barcelona.cat"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "image",
            "count": 1,
            "transferBytes": 281361
          },
          {
            "resourceType": "font",
            "count": 2,
            "transferBytes": 145483
          },
          {
            "resourceType": "script",
            "count": 1,
            "transferBytes": 76427
          },
          {
            "resourceType": "stylesheet",
            "count": 1,
            "transferBytes": 49097
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.barcelona.cat",
            "count": 4,
            "transferBytes": 475941
          },
          {
            "domain": "cdn.matomo.cloud",
            "count": 1,
            "transferBytes": 76427
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Lazy-load offscreen images and media galleries",
            "urgency": "medium",
            "estimatedSavingsBytes": 87108,
            "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": "Defer non-critical UI modules until after first render",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "strategy": "Keep only above-the-fold resources in the initial path; hydrate or import secondary modules later.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 www.barcelona.cat",
            "urgency": "high",
            "estimatedSavingsBytes": 281361,
            "strategy": "Serve a smaller placeholder first and load this asset only when the user scrolls to or requests the component.",
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_medium/public/consell_parc_710x379.jpg?itok=UGq7VN6i",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 www.barcelona.cat",
            "urgency": "medium",
            "estimatedSavingsBytes": 90561,
            "strategy": "Subset or defer this font so full font payloads are only fetched when needed.",
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 cdn.matomo.cloud",
            "urgency": "medium",
            "estimatedSavingsBytes": 76427,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.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": "10.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: 10.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 32 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 32 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,
          "displayValue": "Est savings of 79 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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 79 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,
          "displayValue": "Est savings of 293 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 293 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 231 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 231 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,
          "displayValue": "Est savings of 85 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 85 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": "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": 0,
          "displayValue": "Est savings of 1,630 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 Eliminate render-blocking resources\n\n- Lighthouse audit: render-blocking-resources\n- Current value: Est savings of 1,630 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\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": "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": 0.83,
          "displayValue": "3.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 Speed Index\n\n- Lighthouse audit: speed-index\n- Current value: 3.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\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": "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": "963 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: 963 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://barcelona.cat/ca/viure-a-bcn/amb-nens-i-nenes",
      "status": "ok",
      "finalUrl": "https://www.barcelona.cat/ca/viure-a-bcn/amb-nens-i-nenes",
      "performanceScore": 0.65,
      "bestPracticesScore": 1,
      "transferBytes": 3086218,
      "co2Grams": 1.1822727121452,
      "greenWeb": {
        "page": {
          "hostname": "www.barcelona.cat",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-13T22:38:00.231825",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.barcelona.cat",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76425,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31745,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "stylesheet",
            "requestCount": 1,
            "transferBytes": 24654,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15566,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7143,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 4111,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/css/bcn-avisos.css",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "fonts.googleapis.com",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 2483,
            "sampleUrl": "https://fonts.googleapis.com/css?family=Source+Sans+3:200,200i,300,300i,400,400i,500,500i,600,600i,700,700i,900,900i",
            "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
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=xoTr4x&url=https%3A%2F%2Fwww.barcelona.cat%2Fca%2Fviure-a-bcn%2Famb-nens-i-nenes",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 10,
          "greenCount": 4,
          "notGreenCount": 7,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 60,
        "urgency": "high",
        "pageElementOccurrences": 1,
        "uniqueElementsAssessed": 1,
        "reusedFromCacheCount": 1,
        "components": [
          {
            "signature": "form|get|/ca|input|text|query|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "text",
            "fieldName": "query",
            "formContext": "form|get|/ca",
            "hasLabel": true,
            "hasValidationRule": false,
            "hasErrorMessagingHook": false,
            "toolingFriendly": false,
            "assessment": {
              "score": 60,
              "urgency": "high",
              "issues": [
                "No explicit validation rule",
                "No error messaging hook",
                "Missing autocomplete for tooling support"
              ],
              "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.",
                "Provide meaningful autocomplete values to support browsers and assistive tooling."
              ]
            },
            "reusedFromCache": true
          }
        ],
        "recommendations": [
          {
            "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."
          },
          {
            "title": "Missing autocomplete for tooling support",
            "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": "Nens i nenes | Barcelona.cat | Ajuntament de Barcelona",
          "lang": "ca",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "Consulta l'agenda d'activitats i els serveis de salut i educació per viure Barcelona amb nens i nenes.",
          "robots": "",
          "canonical": "https://www.barcelona.cat/ca/viure-a-bcn/amb-nens-i-nenes",
          "ogTitle": "Barcelona amb nens i nenes",
          "ogDescription": "Tot el que necessites per viure la ciutat amb nens i nenes: des de l'agenda municipal fins a recursos educatius i serveis per a famílies. Explora-ho!",
          "ogType": "Web",
          "ogUrl": "https://www.barcelona.cat/ca/viure-a-bcn/amb-nens-i-nenes",
          "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": 69,
          "tabletSmallTapTargets": 67,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 69,
            "oversizedMedia": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 67,
            "oversizedMedia": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 69 small targets on mobile and 67 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 59,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": true,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": true,
          "externalScriptCount": 7,
          "externalScriptsWithoutIntegrity": 7,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "cache-control": "max-age=300, public",
            "content-encoding": "gzip",
            "content-language": "ca",
            "content-length": "14777",
            "content-type": "text/html; charset=UTF-8",
            "date": "Mon, 13 Apr 2026 23:02:00 GMT",
            "etag": "\"1776121319-gzip\"",
            "expires": "Sun, 19 Nov 1978 05:00:00 GMT",
            "last-modified": "Mon, 13 Apr 2026 23:01:59 GMT",
            "server": "nginx",
            "vary": "Cookie,Accept-Encoding",
            "via": "1.1 ca2190123e61f1744d1210c24c87c840.cloudfront.net (CloudFront)",
            "x-amz-cf-id": "Q7-EzFZzZ2HntqsAVFz8vLmzplxkKjUO6LiU0V3gR8R8bpmb9IPhHQ==",
            "x-amz-cf-pop": "IAD12-P5",
            "x-cache": "Miss from cloudfront",
            "x-content-type-options": "nosniff",
            "x-frame-options": "SAMEORIGIN",
            "x-generator": "Drupal 10 (https://www.drupal.org)"
          },
          "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": "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": "7 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 25,
        "urgency": "low",
        "origin": "https://www.barcelona.cat",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://www.barcelona.cat/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/sitemap.xml",
            "found": true,
            "status": 200,
            "contentType": "application/xml; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/manifest.webmanifest",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/favicon.ico",
            "found": true,
            "status": 200,
            "contentType": "image/x-icon"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "low",
            "detail": "Missing beneficial file(s): /.well-known/security.txt, /manifest.webmanifest."
          }
        ]
      },
      "mediaHints": {
        "score": 20,
        "urgency": "low",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 30,
          "imagesWithLazy": 19,
          "imagesWithoutLazy": 11
        },
        "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."
          }
        ]
      },
      "wsgCustom": {
        "score": 85,
        "urgency": "medium",
        "data": {
          "hasPrintStyles": true,
          "hasReducedMotion": true,
          "media": {
            "totalImages": 35,
            "lazyImages": 20,
            "totalIframes": 1,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "\"Source Sans Pro\", \"Helvetica Neue\", Helvetica, Arial, sans-serif",
            "usesSystemFont": true
          },
          "tracking": {
            "count": 0,
            "scripts": []
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 20/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": "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"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 100,
        "urgency": "high",
        "totalEstimatedSavingsBytes": 3454801.8,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Use modern image compression formats",
            "urgency": "high",
            "estimatedSavingsBytes": 1958197.7999999998,
            "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": 1496604,
            "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: 1.87 MB."
          },
          {
            "title": "Improve image encoding quality/size",
            "urgency": "high",
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 1.43 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": 3605092.8,
        "totalEstimatedBlockingMs": 1513,
        "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": 1958197.7999999998,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 1,912 KiB",
            "urgency": "high",
            "sourceAuditId": "modern-image-formats"
          },
          {
            "id": "uses-optimized-images",
            "title": "Compress oversized image assets",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss.",
            "estimatedSavingsBytes": 1496604,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 1,462 KiB",
            "urgency": "high",
            "sourceAuditId": "uses-optimized-images"
          },
          {
            "id": "render-blocking-resources",
            "title": "Eliminate render-blocking resources",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering.",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1513,
            "displayValue": "Est savings of 1,510 ms",
            "urgency": "high",
            "sourceAuditId": "render-blocking-resources"
          },
          {
            "id": "unused-css-rules",
            "title": "Remove unused CSS",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped.",
            "estimatedSavingsBytes": 83588,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 82 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-css-rules"
          },
          {
            "id": "unused-javascript",
            "title": "Remove unused JavaScript",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code.",
            "estimatedSavingsBytes": 58790,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 57 KiB",
            "urgency": "medium",
            "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": 7913,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 8 KiB",
            "urgency": "low",
            "sourceAuditId": "offscreen-images"
          }
        ],
        "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.87 MB."
          },
          {
            "title": "Compress oversized image assets",
            "urgency": "high",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 1.43 MB."
          },
          {
            "title": "Eliminate render-blocking resources",
            "urgency": "high",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering. Estimated render unblocking: 1513 ms."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "medium",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 81.63 KB."
          },
          {
            "title": "Remove unused JavaScript",
            "urgency": "medium",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 57.41 KB."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "low",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 7.73 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": 10,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 7,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "7 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": 168002.12723463686
        },
        "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: 164.06 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: 164.06 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": "medium",
        "transferBytes": 3086218,
        "css": {
          "unusedBytes": 83588,
          "ratio": 0.02708428244537489,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 58790,
          "duplicatedBytes": 0,
          "ratio": 0.019049205208446066,
          "auditIds": [
            "unused-javascript",
            "duplicated-javascript"
          ]
        },
        "html": {
          "estimatedPenalty": 0.25,
          "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": "high",
            "estimatedSavingsBytes": 83588,
            "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": "medium",
            "estimatedSavingsBytes": 58790,
            "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": 16,
        "urgency": "high",
        "transferBytes": 3086218,
        "estimatedDeferrableBytes": 150291,
        "renderBlockingMs": 1513,
        "breakdown": {
          "offscreenImageSavings": 7913,
          "unusedJavascriptSavings": 58790,
          "unusedCssSavings": 83588
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 7913,
            "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": "medium",
            "estimatedSavingsBytes": 58790,
            "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": "high",
            "estimatedSavingsBytes": 83588,
            "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": "Eliminate render-blocking resources",
            "area": "render-path",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1513,
            "strategy": "Defer scripts/styles not required for first paint and preload only truly critical assets.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-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 www.barcelona.cat",
            "area": "image",
            "urgency": "high",
            "estimatedSavingsBytes": 265351,
            "url": "https://www.barcelona.cat/sites/default/files/styles/distribuidora_interior/public/dise-drassanes-13-2-13-al-01_529x410.jpg?itok=2-rbjPFi",
            "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": 64,
        "urgency": "high",
        "providerCount": 7,
        "requestCount": 8,
        "transferBytes": 139455,
        "notGreenCount": 5,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76425,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31745,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15566,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7143,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=xoTr4x&url=https%3A%2F%2Fwww.barcelona.cat%2Fca%2Fviure-a-bcn%2Famb-nens-i-nenes",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "high",
            "detail": "Track 7 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."
          },
          {
            "title": "Prioritize greener alternatives for third-party providers",
            "urgency": "high",
            "detail": "5 third-party script origin(s) are not confirmed green in the Green Web Foundation dataset."
          }
        ]
      },
      "redundancy": {
        "score": 23,
        "urgency": "medium",
        "transferBytes": 3086218,
        "estimatedRedundantBytes": 142378,
        "redundancyRatio": 0.046133487653820957,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 83588,
            "displayValue": "Est savings of 82 KiB"
          },
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 58790,
            "displayValue": "Est savings of 57 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 83588,
            "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 unused javascript",
            "urgency": "medium",
            "estimatedSavingsBytes": 58790,
            "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 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": 42,
        "urgency": "high",
        "totalTransferBytes": 3086218,
        "heavyRequestCount": 17,
        "heavyBytes": 2439696,
        "heavyRatio": 0.7905131782654369,
        "heavyRequests": [
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/distribuidora_interior/public/dise-drassanes-13-2-13-al-01_529x410.jpg?itok=2-rbjPFi",
            "transferSize": 265351,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/distribuidora_interior/public/dise-cosmocaixa-8-4-14-vz-02_529x410.jpg?itok=6Q6nH-h2",
            "transferSize": 242330,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/distribuidora_interior/public/museu_musica_sara_guastevi_529x410.jpg?itok=3NnQz2vu",
            "transferSize": 226624,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/destacat_gran/public/amb-estudis-triar-escola-528x228_1.jpg?itok=m_PHk46_",
            "transferSize": 188812,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/distribuidora_interior/public/museu_xocolata_2_529x410.jpg?itok=9ECf-pD1",
            "transferSize": 174000,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/destacat_gran/public/amb_nens_i_nenes_fem_esports_528x228.jpg?itok=oFqtEhFj",
            "transferSize": 167965,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/destacat_petit/public/anem_parc_64a1708_252x228.png?itok=mXr-SkP1",
            "transferSize": 166421,
            "resourceType": "image",
            "mimeType": "image/png",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/destacat_gran/public/amb_nens_i_nenes_lleure_528x228.jpg?itok=rthlEzMl",
            "transferSize": 131262,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/distribuidora_interior/public/dise-museu-blau-20-09-11-vz-023_529x410.jpg?itok=crYeytoy",
            "transferSize": 128992,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/destacat_gran/public/amb_nens_i_nenes_atencio_social_528x228.jpg?itok=eY335nDg",
            "transferSize": 121914,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/destacat_gran/public/amb_nens_i_nenes_infants_sans_528x228.jpg?itok=SDeIbmMy",
            "transferSize": 121864,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/destacat_gran/public/amb_nens_i_nenes_familia_528x228.jpg?itok=1kzT0qDV",
            "transferSize": 121622,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/destacat_gran/public/amb_nens_i_nenes_com_eduquem_528x228.jpg?itok=1nSO8OAL",
            "transferSize": 108689,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "transferSize": 90560,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "transferSize": 76425,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "cdn.matomo.cloud"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament/fonts/icoajuntament.ttf?8aaig7",
            "transferSize": 54921,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/css/css_qDD4BCxE8K-iT7MRORwp32v03DlJblP9-xrYwOBWlQo.css?delta=5&language=ca&theme=barcelonacat_theme&include=eJyFz8GOwyAMBNAfCuXQD0ID8SasiI2wSZu_X6RKXa3EqidbM-8y-O5sOIgt4Mwq6l_HoeYloiUqwkiwICe1lldSP3R3JlJG_5-p2MidmR5_ge10kI8iptZQQ1p5Br7A6YrynHVbkYji1K6SeZuJnMThvWsm5FFmsUofWVCwhvsnUJssMXEYrMG_v0BPo8YoS0XDNkbu6tfWK8rtN7l1rj2WrDuti15qdPgIpR8d6Z1O&tcut5n",
            "transferSize": 51944,
            "resourceType": "stylesheet",
            "mimeType": "text/css",
            "domain": "www.barcelona.cat"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "image",
            "count": 13,
            "transferBytes": 2165846
          },
          {
            "resourceType": "font",
            "count": 2,
            "transferBytes": 145481
          },
          {
            "resourceType": "script",
            "count": 1,
            "transferBytes": 76425
          },
          {
            "resourceType": "stylesheet",
            "count": 1,
            "transferBytes": 51944
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.barcelona.cat",
            "count": 16,
            "transferBytes": 2363271
          },
          {
            "domain": "cdn.matomo.cloud",
            "count": 1,
            "transferBytes": 76425
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Split JavaScript by route or interaction",
            "urgency": "medium",
            "estimatedSavingsBytes": 58790,
            "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": "Defer non-critical UI modules until after first render",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "strategy": "Keep only above-the-fold resources in the initial path; hydrate or import secondary modules later.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 www.barcelona.cat",
            "urgency": "high",
            "estimatedSavingsBytes": 265351,
            "strategy": "Serve a smaller placeholder first and load this asset only when the user scrolls to or requests the component.",
            "url": "https://www.barcelona.cat/sites/default/files/styles/distribuidora_interior/public/dise-drassanes-13-2-13-al-01_529x410.jpg?itok=2-rbjPFi",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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.01,
          "displayValue": "8.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: 8.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 57 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 57 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,
          "displayValue": "Est savings of 82 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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 82 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,
          "displayValue": "Est savings of 1,912 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,912 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 1,462 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 1,462 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": "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": 0,
          "displayValue": "Est savings of 1,510 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 Eliminate render-blocking resources\n\n- Lighthouse audit: render-blocking-resources\n- Current value: Est savings of 1,510 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\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": "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,
          "displayValue": "1,198 elements",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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: 1,198 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"
        },
        {
          "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": 0.88,
          "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 Speed Index\n\n- Lighthouse audit: speed-index\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\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": "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 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 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,014 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,014 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://barcelona.cat/es/conocebcn/la-historia/la-barcelona-contemporanea",
      "status": "ok",
      "finalUrl": "https://www.barcelona.cat/es/conocebcn/la-historia/la-barcelona-contemporanea",
      "performanceScore": 0.55,
      "bestPracticesScore": 1,
      "transferBytes": 1486914,
      "co2Grams": 0.5696090967996001,
      "greenWeb": {
        "page": {
          "hostname": "www.barcelona.cat",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-13T22:38:00.231825",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.barcelona.cat",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76426,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "stylesheet",
            "requestCount": 1,
            "transferBytes": 24657,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15565,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7146,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 4110,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/css/bcn-avisos.css",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "fonts.googleapis.com",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 2483,
            "sampleUrl": "https://fonts.googleapis.com/css?family=Source+Sans+3:200,200i,300,300i,400,400i,500,500i,600,600i,700,700i,900,900i",
            "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
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 268,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=1zV97Y&url=https%3A%2F%2Fwww.barcelona.cat%2Fes%2Fconocebcn%2Fla-historia%2Fla-barcelona-contemporanea",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 10,
          "greenCount": 4,
          "notGreenCount": 7,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 60,
        "urgency": "high",
        "pageElementOccurrences": 1,
        "uniqueElementsAssessed": 1,
        "reusedFromCacheCount": 1,
        "components": [
          {
            "signature": "form|get|/es/|input|text|query|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "text",
            "fieldName": "query",
            "formContext": "form|get|/es/",
            "hasLabel": true,
            "hasValidationRule": false,
            "hasErrorMessagingHook": false,
            "toolingFriendly": false,
            "assessment": {
              "score": 60,
              "urgency": "high",
              "issues": [
                "No explicit validation rule",
                "No error messaging hook",
                "Missing autocomplete for tooling support"
              ],
              "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.",
                "Provide meaningful autocomplete values to support browsers and assistive tooling."
              ]
            },
            "reusedFromCache": true
          }
        ],
        "recommendations": [
          {
            "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."
          },
          {
            "title": "Missing autocomplete for tooling support",
            "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": "La Barcelona contemporánea | Web de Barcelona | Ayuntamiento de Barcelona",
          "lang": "es",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "Recorrido por la historia de Barcelona durante el siglo XX y principios del siglo XXI. Conoce la Barcelona contemporánea.",
          "robots": "",
          "canonical": "https://www.barcelona.cat/es/conocebcn/la-historia/la-barcelona-contemporanea",
          "ogTitle": "La Barcelona contemporánea | Web de Barcelona | Ayuntamiento de Barcelona",
          "ogDescription": "Recorrido por la historia de Barcelona durante el siglo XX y principios del siglo XXI. Conoce la Barcelona contemporánea.",
          "ogType": "Web",
          "ogUrl": "https://www.barcelona.cat/es/conocebcn/la-historia/la-barcelona-contemporanea",
          "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": 34,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 36,
            "oversizedMedia": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 34,
            "oversizedMedia": 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 34 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 59,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": true,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": true,
          "externalScriptCount": 7,
          "externalScriptsWithoutIntegrity": 7,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "cache-control": "max-age=300, public",
            "content-encoding": "gzip",
            "content-language": "es",
            "content-length": "15225",
            "content-type": "text/html; charset=UTF-8",
            "date": "Mon, 13 Apr 2026 23:02:13 GMT",
            "etag": "\"1776121333-gzip\"",
            "expires": "Sun, 19 Nov 1978 05:00:00 GMT",
            "last-modified": "Mon, 13 Apr 2026 23:02:13 GMT",
            "server": "nginx",
            "vary": "Cookie,Accept-Encoding",
            "via": "1.1 ca2190123e61f1744d1210c24c87c840.cloudfront.net (CloudFront)",
            "x-amz-cf-id": "8jS9l8d1lVDMO4Ovc1HA4tTsRxFJznTI98EuEa1pbiPbOYwWsu3_gQ==",
            "x-amz-cf-pop": "IAD12-P5",
            "x-cache": "Miss from cloudfront",
            "x-content-type-options": "nosniff",
            "x-frame-options": "SAMEORIGIN",
            "x-generator": "Drupal 10 (https://www.drupal.org)"
          },
          "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": "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": "7 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 25,
        "urgency": "low",
        "origin": "https://www.barcelona.cat",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://www.barcelona.cat/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/sitemap.xml",
            "found": true,
            "status": 200,
            "contentType": "application/xml; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/manifest.webmanifest",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/favicon.ico",
            "found": true,
            "status": 200,
            "contentType": "image/x-icon"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "low",
            "detail": "Missing beneficial file(s): /.well-known/security.txt, /manifest.webmanifest."
          }
        ]
      },
      "mediaHints": {
        "score": 23,
        "urgency": "low",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 20,
          "imagesWithLazy": 9,
          "imagesWithoutLazy": 11
        },
        "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": "11 of 20 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 85,
        "urgency": "medium",
        "data": {
          "hasPrintStyles": true,
          "hasReducedMotion": true,
          "media": {
            "totalImages": 25,
            "lazyImages": 10,
            "totalIframes": 1,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "\"Source Sans Pro\", \"Helvetica Neue\", Helvetica, Arial, sans-serif",
            "usesSystemFont": true
          },
          "tracking": {
            "count": 0,
            "scripts": []
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 10/25 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": "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"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 78,
        "urgency": "high",
        "totalEstimatedSavingsBytes": 1166571.85,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Use modern image compression formats",
            "urgency": "high",
            "estimatedSavingsBytes": 647780.85,
            "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": 518791,
            "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: 632.60 KB."
          },
          {
            "title": "Improve image encoding quality/size",
            "urgency": "high",
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 506.63 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": 1404377.85,
        "totalEstimatedBlockingMs": 1524,
        "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": 647780.85,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 633 KiB",
            "urgency": "high",
            "sourceAuditId": "modern-image-formats"
          },
          {
            "id": "uses-optimized-images",
            "title": "Compress oversized image assets",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss.",
            "estimatedSavingsBytes": 518791,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 507 KiB",
            "urgency": "high",
            "sourceAuditId": "uses-optimized-images"
          },
          {
            "id": "render-blocking-resources",
            "title": "Eliminate render-blocking resources",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering.",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1524,
            "displayValue": "Est savings of 1,520 ms",
            "urgency": "high",
            "sourceAuditId": "render-blocking-resources"
          },
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 91571,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 89 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": 80846,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 79 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-css-rules"
          },
          {
            "id": "uses-responsive-images",
            "title": "Right-size images for viewport",
            "detail": "Avoid sending larger images than the rendered size needs.",
            "estimatedSavingsBytes": 32908,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 32 KiB",
            "urgency": "low",
            "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": 32481,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 32 KiB",
            "urgency": "low",
            "sourceAuditId": "unused-javascript"
          }
        ],
        "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: 632.60 KB."
          },
          {
            "title": "Compress oversized image assets",
            "urgency": "high",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 506.63 KB."
          },
          {
            "title": "Eliminate render-blocking resources",
            "urgency": "high",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering. Estimated render unblocking: 1524 ms."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "medium",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 89.42 KB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "medium",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 78.95 KB."
          },
          {
            "title": "Right-size images for viewport",
            "urgency": "low",
            "detail": "Avoid sending larger images than the rendered size needs. Estimated byte savings: 32.14 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": 10,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 7,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "7 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": 168004.13320530727
        },
        "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: 164.07 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: 164.07 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": 5,
        "urgency": "medium",
        "transferBytes": 1486914,
        "css": {
          "unusedBytes": 80846,
          "ratio": 0.05437167179809996,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 32481,
          "duplicatedBytes": 0,
          "ratio": 0.021844572046533964,
          "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": "high",
            "estimatedSavingsBytes": 80846,
            "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": "medium",
            "estimatedSavingsBytes": 32481,
            "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": 1486914,
        "estimatedDeferrableBytes": 204898,
        "renderBlockingMs": 1524,
        "breakdown": {
          "offscreenImageSavings": 91571,
          "unusedJavascriptSavings": 32481,
          "unusedCssSavings": 80846
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 91571,
            "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": "medium",
            "estimatedSavingsBytes": 32481,
            "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": 80846,
            "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": "Eliminate render-blocking resources",
            "area": "render-path",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1524,
            "strategy": "Defer scripts/styles not required for first paint and preload only truly critical assets.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-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 www.barcelona.cat",
            "area": "image",
            "urgency": "high",
            "estimatedSavingsBytes": 291680,
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_medium/public/0_port_olimpic_hemav_710x379.jpg?itok=-rYD7HVH",
            "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 www.barcelona.cat",
            "area": "font",
            "urgency": "medium",
            "estimatedSavingsBytes": 90560,
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "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 cdn.matomo.cloud",
            "area": "script",
            "urgency": "medium",
            "estimatedSavingsBytes": 76426,
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.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": 64,
        "urgency": "high",
        "providerCount": 7,
        "requestCount": 8,
        "transferBytes": 139458,
        "notGreenCount": 5,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76426,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15565,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7146,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 268,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=1zV97Y&url=https%3A%2F%2Fwww.barcelona.cat%2Fes%2Fconocebcn%2Fla-historia%2Fla-barcelona-contemporanea",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "high",
            "detail": "Track 7 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."
          },
          {
            "title": "Prioritize greener alternatives for third-party providers",
            "urgency": "high",
            "detail": "5 third-party script origin(s) are not confirmed green in the Green Web Foundation dataset."
          }
        ]
      },
      "redundancy": {
        "score": 14,
        "urgency": "low",
        "transferBytes": 1486914,
        "estimatedRedundantBytes": 113327,
        "redundancyRatio": 0.07621624384463392,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 80846,
            "displayValue": "Est savings of 79 KiB"
          },
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 32481,
            "displayValue": "Est savings of 32 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 80846,
            "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 unused javascript",
            "urgency": "medium",
            "estimatedSavingsBytes": 32481,
            "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 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": 22,
        "urgency": "medium",
        "totalTransferBytes": 1486914,
        "heavyRequestCount": 5,
        "heavyBytes": 562682,
        "heavyRatio": 0.3784226929062474,
        "heavyRequests": [
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_medium/public/0_port_olimpic_hemav_710x379.jpg?itok=-rYD7HVH",
            "transferSize": 291680,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "transferSize": 90560,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "transferSize": 76426,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "cdn.matomo.cloud"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament/fonts/icoajuntament.ttf?8aaig7",
            "transferSize": 54921,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/css/css_evpTRQTawGYS1Ro7RbXq3hBxwat7AU-RJm1V8ZgzeaE.css?delta=5&language=es&theme=barcelonacat_theme&include=eJyFzsGKwzAMBNAfiuvDfpAZOyJxcSQjydn272sodFnIsieJmXcY3Ac7DmJPOKuJxfcJ6HXJ0EJNGAWe5CTVupLFqUdwkTb7v0zHRuGs9P0b-E4HxSzi5oqeyspXYGuS0YL5s1XerkQtEvDZfiVMxsySgS19_Qe6ypILp8kU8fMlejgpoy0dim0u3i2uOjra7Se5De4jt2o7rYs9zemIGUYvwgyJSg&tcut5n",
            "transferSize": 49095,
            "resourceType": "stylesheet",
            "mimeType": "text/css",
            "domain": "www.barcelona.cat"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "image",
            "count": 1,
            "transferBytes": 291680
          },
          {
            "resourceType": "font",
            "count": 2,
            "transferBytes": 145481
          },
          {
            "resourceType": "script",
            "count": 1,
            "transferBytes": 76426
          },
          {
            "resourceType": "stylesheet",
            "count": 1,
            "transferBytes": 49095
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.barcelona.cat",
            "count": 4,
            "transferBytes": 486256
          },
          {
            "domain": "cdn.matomo.cloud",
            "count": 1,
            "transferBytes": 76426
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Lazy-load offscreen images and media galleries",
            "urgency": "medium",
            "estimatedSavingsBytes": 91571,
            "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": "Defer non-critical UI modules until after first render",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "strategy": "Keep only above-the-fold resources in the initial path; hydrate or import secondary modules later.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 www.barcelona.cat",
            "urgency": "high",
            "estimatedSavingsBytes": 291680,
            "strategy": "Serve a smaller placeholder first and load this asset only when the user scrolls to or requests the component.",
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_medium/public/0_port_olimpic_hemav_710x379.jpg?itok=-rYD7HVH",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 www.barcelona.cat",
            "urgency": "medium",
            "estimatedSavingsBytes": 90560,
            "strategy": "Subset or defer this font so full font payloads are only fetched when needed.",
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 cdn.matomo.cloud",
            "urgency": "medium",
            "estimatedSavingsBytes": 76426,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.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": "10.6 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: 10.6 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 32 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 32 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,
          "displayValue": "Est savings of 79 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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 79 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,
          "displayValue": "Est savings of 633 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 633 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 507 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 507 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,
          "displayValue": "Est savings of 89 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 89 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": "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": 0,
          "displayValue": "Est savings of 1,520 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 Eliminate render-blocking resources\n\n- Lighthouse audit: render-blocking-resources\n- Current value: Est savings of 1,520 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\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": "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": 0.89,
          "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 Speed Index\n\n- Lighthouse audit: speed-index\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\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": "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": "1,029 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: 1,029 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://barcelona.cat/en/discoverbcn/ciutadella-knowledge-hub/transformation-park",
      "status": "ok",
      "finalUrl": "https://www.barcelona.cat/en/discoverbcn/ciutadella-knowledge-hub/transformation-park",
      "performanceScore": 0.5,
      "bestPracticesScore": 1,
      "transferBytes": 1989114,
      "co2Grams": 0.7619925758796001,
      "greenWeb": {
        "page": {
          "hostname": "www.barcelona.cat",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-13T22:38:00.231825",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.barcelona.cat",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76425,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "stylesheet",
            "requestCount": 1,
            "transferBytes": 24654,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15565,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7144,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 4112,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/css/bcn-avisos.css",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "fonts.googleapis.com",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 2482,
            "sampleUrl": "https://fonts.googleapis.com/css?family=Source+Sans+3:200,200i,300,300i,400,400i,500,500i,600,600i,700,700i,900,900i",
            "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
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=sYkU06&url=https%3A%2F%2Fwww.barcelona.cat%2Fen%2Fdiscoverbcn%2Fciutadella-knowledge-hub%2Ftransformation-park",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 10,
          "greenCount": 4,
          "notGreenCount": 7,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 60,
        "urgency": "high",
        "pageElementOccurrences": 1,
        "uniqueElementsAssessed": 1,
        "reusedFromCacheCount": 1,
        "components": [
          {
            "signature": "form|get|/en|input|text|query|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "text",
            "fieldName": "query",
            "formContext": "form|get|/en",
            "hasLabel": true,
            "hasValidationRule": false,
            "hasErrorMessagingHook": false,
            "toolingFriendly": false,
            "assessment": {
              "score": 60,
              "urgency": "high",
              "issues": [
                "No explicit validation rule",
                "No error messaging hook",
                "Missing autocomplete for tooling support"
              ],
              "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.",
                "Provide meaningful autocomplete values to support browsers and assistive tooling."
              ]
            },
            "reusedFromCache": true
          }
        ],
        "recommendations": [
          {
            "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."
          },
          {
            "title": "Missing autocomplete for tooling support",
            "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": "The transformation of the park | La Ciutadella Knowledge Hub | Barcelona City Council",
          "lang": "en",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "The Parc de la Ciutadella is being renovated to update the infrastructure, the greenery and the heritage elements, to improve accessibility to the neighbourhoods and to host new scientific and cultural activities.",
          "robots": "",
          "canonical": "https://www.barcelona.cat/en/discoverbcn/ciutadella-knowledge-hub/transformation-park",
          "ogTitle": "The transformation of the park | La Ciutadella Knowledge Hub | Barcelona City Council",
          "ogDescription": "The Parc de la Ciutadella is being renovated to update the infrastructure, the greenery and the heritage elements, to improve accessibility to the neighbourhoods and to host new scientific and cultural activities.",
          "ogType": "Web",
          "ogUrl": "https://www.barcelona.cat/en/discoverbcn/ciutadella-knowledge-hub/transformation-park",
          "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": 34,
        "urgency": "medium",
        "checks": {
          "testedMobile": true,
          "testedTablet": true,
          "horizontalOverflowOnMobile": false,
          "horizontalOverflowOnTablet": false,
          "mobileSmallTapTargets": 40,
          "tabletSmallTapTargets": 34,
          "fixedWidthOffenders": 2,
          "oversizedMedia": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 1,
            "smallTapTargets": 40,
            "oversizedMedia": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 1,
            "smallTapTargets": 34,
            "oversizedMedia": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 40 small targets on mobile and 34 on tablet."
          },
          {
            "title": "Refactor fixed-width components",
            "urgency": "medium",
            "detail": "2 element(s) exceeded viewport width in tested layouts; use responsive component constraints."
          }
        ]
      },
      "securityLight": {
        "score": 59,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": true,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": true,
          "externalScriptCount": 7,
          "externalScriptsWithoutIntegrity": 7,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "cache-control": "max-age=300, public",
            "content-encoding": "gzip",
            "content-language": "en",
            "content-length": "13533",
            "content-type": "text/html; charset=UTF-8",
            "date": "Mon, 13 Apr 2026 23:02:27 GMT",
            "etag": "\"1776121346-gzip\"",
            "expires": "Sun, 19 Nov 1978 05:00:00 GMT",
            "last-modified": "Mon, 13 Apr 2026 23:02:26 GMT",
            "server": "nginx",
            "vary": "Cookie,Accept-Encoding",
            "via": "1.1 ca2190123e61f1744d1210c24c87c840.cloudfront.net (CloudFront)",
            "x-amz-cf-id": "kiDc8asszMfOo-S3VoEswxZYKhLiYT8gqCNcRMUH8GpTSuXLltRGrg==",
            "x-amz-cf-pop": "IAD12-P5",
            "x-cache": "Miss from cloudfront",
            "x-content-type-options": "nosniff",
            "x-frame-options": "SAMEORIGIN",
            "x-generator": "Drupal 10 (https://www.drupal.org)"
          },
          "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": "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": "7 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 25,
        "urgency": "low",
        "origin": "https://www.barcelona.cat",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://www.barcelona.cat/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/sitemap.xml",
            "found": true,
            "status": 200,
            "contentType": "application/xml; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/manifest.webmanifest",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/favicon.ico",
            "found": true,
            "status": 200,
            "contentType": "image/x-icon"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "low",
            "detail": "Missing beneficial file(s): /.well-known/security.txt, /manifest.webmanifest."
          }
        ]
      },
      "mediaHints": {
        "score": 20,
        "urgency": "low",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 29,
          "imagesWithLazy": 18,
          "imagesWithoutLazy": 11
        },
        "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."
          }
        ]
      },
      "wsgCustom": {
        "score": 85,
        "urgency": "medium",
        "data": {
          "hasPrintStyles": true,
          "hasReducedMotion": true,
          "media": {
            "totalImages": 34,
            "lazyImages": 19,
            "totalIframes": 1,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "\"Source Sans Pro\", \"Helvetica Neue\", Helvetica, Arial, sans-serif",
            "usesSystemFont": true
          },
          "tracking": {
            "count": 0,
            "scripts": []
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 19/34 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": "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"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 93,
        "urgency": "high",
        "totalEstimatedSavingsBytes": 1855540.65,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Use modern image compression formats",
            "urgency": "high",
            "estimatedSavingsBytes": 1009327.65,
            "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": 846213,
            "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: 985.67 KB."
          },
          {
            "title": "Improve image encoding quality/size",
            "urgency": "high",
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 826.38 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": 2209308.65,
        "totalEstimatedBlockingMs": 1636,
        "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": 1009327.65,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 986 KiB",
            "urgency": "high",
            "sourceAuditId": "modern-image-formats"
          },
          {
            "id": "uses-optimized-images",
            "title": "Compress oversized image assets",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss.",
            "estimatedSavingsBytes": 846213,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 826 KiB",
            "urgency": "high",
            "sourceAuditId": "uses-optimized-images"
          },
          {
            "id": "render-blocking-resources",
            "title": "Eliminate render-blocking resources",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering.",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1636,
            "displayValue": "Est savings of 1,640 ms",
            "urgency": "high",
            "sourceAuditId": "render-blocking-resources"
          },
          {
            "id": "uses-responsive-images",
            "title": "Right-size images for viewport",
            "detail": "Avoid sending larger images than the rendered size needs.",
            "estimatedSavingsBytes": 128657,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 126 KiB",
            "urgency": "medium",
            "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": 87110,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 85 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": 83259,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 81 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-css-rules"
          },
          {
            "id": "unused-javascript",
            "title": "Remove unused JavaScript",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code.",
            "estimatedSavingsBytes": 54742,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 53 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-javascript"
          }
        ],
        "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: 985.67 KB."
          },
          {
            "title": "Compress oversized image assets",
            "urgency": "high",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 826.38 KB."
          },
          {
            "title": "Eliminate render-blocking resources",
            "urgency": "high",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering. Estimated render unblocking: 1636 ms."
          },
          {
            "title": "Right-size images for viewport",
            "urgency": "medium",
            "detail": "Avoid sending larger images than the rendered size needs. Estimated byte savings: 125.64 KB."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "medium",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 85.07 KB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "medium",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 81.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": 10,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 7,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "7 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": 167993.8709846369
        },
        "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: 164.06 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: 164.06 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": "medium",
        "transferBytes": 1989114,
        "css": {
          "unusedBytes": 83259,
          "ratio": 0.041857329444164586,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 54742,
          "duplicatedBytes": 0,
          "ratio": 0.02752079569094582,
          "auditIds": [
            "unused-javascript",
            "duplicated-javascript"
          ]
        },
        "html": {
          "estimatedPenalty": 0.25,
          "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": "high",
            "estimatedSavingsBytes": 83259,
            "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": "medium",
            "estimatedSavingsBytes": 54742,
            "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": 1989114,
        "estimatedDeferrableBytes": 225111,
        "renderBlockingMs": 1636,
        "breakdown": {
          "offscreenImageSavings": 87110,
          "unusedJavascriptSavings": 54742,
          "unusedCssSavings": 83259
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 87110,
            "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": "medium",
            "estimatedSavingsBytes": 54742,
            "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": "high",
            "estimatedSavingsBytes": 83259,
            "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": "Eliminate render-blocking resources",
            "area": "render-path",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1636,
            "strategy": "Defer scripts/styles not required for first paint and preload only truly critical assets.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-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 www.barcelona.cat",
            "area": "image",
            "urgency": "high",
            "estimatedSavingsBytes": 347833,
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_medium/public/220712_e_refugisclimatics_parcdelaciutadella_019-710x379.jpg?itok=O9EBbToe",
            "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": 64,
        "urgency": "high",
        "providerCount": 7,
        "requestCount": 8,
        "transferBytes": 139456,
        "notGreenCount": 5,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76425,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31746,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15565,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7144,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=sYkU06&url=https%3A%2F%2Fwww.barcelona.cat%2Fen%2Fdiscoverbcn%2Fciutadella-knowledge-hub%2Ftransformation-park",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "high",
            "detail": "Track 7 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."
          },
          {
            "title": "Prioritize greener alternatives for third-party providers",
            "urgency": "high",
            "detail": "5 third-party script origin(s) are not confirmed green in the Green Web Foundation dataset."
          }
        ]
      },
      "redundancy": {
        "score": 24,
        "urgency": "medium",
        "transferBytes": 1989114,
        "estimatedRedundantBytes": 138001,
        "redundancyRatio": 0.06937812513511041,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 83259,
            "displayValue": "Est savings of 81 KiB"
          },
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 54742,
            "displayValue": "Est savings of 53 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 83259,
            "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 unused javascript",
            "urgency": "medium",
            "estimatedSavingsBytes": 54742,
            "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 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": 38,
        "urgency": "high",
        "totalTransferBytes": 1989114,
        "heavyRequestCount": 8,
        "heavyBytes": 1414417,
        "heavyRatio": 0.7110789024661232,
        "heavyRequests": [
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_medium/public/220712_e_refugisclimatics_parcdelaciutadella_019-710x379.jpg?itok=O9EBbToe",
            "transferSize": 347833,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_medium/public/aerea_parc_710x379.jpg?itok=auJT9Nb2",
            "transferSize": 316899,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_medium/public/llac_cenital-710x379.jpg?itok=0g3xfeSE",
            "transferSize": 262613,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_medium/public/710x379_final_2.jpg?itok=5f1jEtXv",
            "transferSize": 213233,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "transferSize": 90559,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "transferSize": 76425,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "cdn.matomo.cloud"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament/fonts/icoajuntament.ttf?8aaig7",
            "transferSize": 54921,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/css/css_qDD4BCxE8K-iT7MRORwp32v03DlJblP9-xrYwOBWlQo.css?delta=6&language=en&theme=barcelonacat_theme&include=eJyFz8FuxCAMBNAfCsuhH4QG4ia0DkbYpJu_L9JKW1VitSdbM-8y-OrFcFCxgDOrqH8ch5qXiJaIpSDBgpzUWl5J_dDdmQiP_pWp2MidmX7-A9vpIB9FTK2hhrSWGfhESVeU-6zbWCLYqV2cyzYTOYnDc9dMKOf07ZASqebINDXSRxYURcPHO1CbLDGVMFiDf36B7katgJeKhm0s3tWvrVfw7S-59VJ75Kw7rYteanT4CKVfKxCiTQ&tcut5n",
            "transferSize": 51934,
            "resourceType": "stylesheet",
            "mimeType": "text/css",
            "domain": "www.barcelona.cat"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "image",
            "count": 4,
            "transferBytes": 1140578
          },
          {
            "resourceType": "font",
            "count": 2,
            "transferBytes": 145480
          },
          {
            "resourceType": "script",
            "count": 1,
            "transferBytes": 76425
          },
          {
            "resourceType": "stylesheet",
            "count": 1,
            "transferBytes": 51934
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.barcelona.cat",
            "count": 7,
            "transferBytes": 1337992
          },
          {
            "domain": "cdn.matomo.cloud",
            "count": 1,
            "transferBytes": 76425
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Lazy-load offscreen images and media galleries",
            "urgency": "medium",
            "estimatedSavingsBytes": 87110,
            "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": "medium",
            "estimatedSavingsBytes": 54742,
            "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": "Defer non-critical UI modules until after first render",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "strategy": "Keep only above-the-fold resources in the initial path; hydrate or import secondary modules later.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 www.barcelona.cat",
            "urgency": "high",
            "estimatedSavingsBytes": 347833,
            "strategy": "Serve a smaller placeholder first and load this asset only when the user scrolls to or requests the component.",
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_medium/public/220712_e_refugisclimatics_parcdelaciutadella_019-710x379.jpg?itok=O9EBbToe",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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": "10.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: 10.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 53 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 53 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,
          "displayValue": "Est savings of 81 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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 81 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,
          "displayValue": "Est savings of 986 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 986 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 826 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 826 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,
          "displayValue": "Est savings of 85 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 85 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": "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": 0,
          "displayValue": "Est savings of 1,640 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 Eliminate render-blocking resources\n\n- Lighthouse audit: render-blocking-resources\n- Current value: Est savings of 1,640 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\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": "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,
          "displayValue": "1,039 elements",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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: 1,039 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"
        },
        {
          "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": 0.78,
          "displayValue": "4.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 Speed Index\n\n- Lighthouse audit: speed-index\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\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"
        }
      ]
    },
    {
      "url": "https://barcelona.cat/es/conocebcn/ciutadelladelconocimiento/polo-de-biociencia-del-csic",
      "status": "ok",
      "finalUrl": "https://www.barcelona.cat/es/conocebcn/ciutadelladelconocimiento/polo-de-biociencia-del-csic",
      "performanceScore": 0.55,
      "bestPracticesScore": 1,
      "transferBytes": 1034431,
      "co2Grams": 0.3962712756834,
      "greenWeb": {
        "page": {
          "hostname": "www.barcelona.cat",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-13T22:38:00.231825",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.barcelona.cat",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76425,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31747,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "stylesheet",
            "requestCount": 1,
            "transferBytes": 24654,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15565,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7144,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 4112,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/css/bcn-avisos.css",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "fonts.googleapis.com",
            "resourceType": "stylesheet",
            "requestCount": 2,
            "transferBytes": 2485,
            "sampleUrl": "https://fonts.googleapis.com/css?family=Source+Sans+3:200,200i,300,300i,400,400i,500,500i,600,600i,700,700i,900,900i",
            "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
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=HhdarH&url=https%3A%2F%2Fwww.barcelona.cat%2Fes%2Fconocebcn%2Fciutadelladelconocimiento%2Fpolo-de-biociencia-del-csic",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 10,
          "greenCount": 4,
          "notGreenCount": 7,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 60,
        "urgency": "high",
        "pageElementOccurrences": 1,
        "uniqueElementsAssessed": 1,
        "reusedFromCacheCount": 1,
        "components": [
          {
            "signature": "form|get|/es/|input|text|query|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "text",
            "fieldName": "query",
            "formContext": "form|get|/es/",
            "hasLabel": true,
            "hasValidationRule": false,
            "hasErrorMessagingHook": false,
            "toolingFriendly": false,
            "assessment": {
              "score": 60,
              "urgency": "high",
              "issues": [
                "No explicit validation rule",
                "No error messaging hook",
                "Missing autocomplete for tooling support"
              ],
              "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.",
                "Provide meaningful autocomplete values to support browsers and assistive tooling."
              ]
            },
            "reusedFromCache": true
          }
        ],
        "recommendations": [
          {
            "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."
          },
          {
            "title": "Missing autocomplete for tooling support",
            "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": "Polo de biociencia del CSIC | La Ciutadella del Conocimiento | Ayuntamiento de Barcelona",
          "lang": "es",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "Nuevo centro de servicios que concentre las diferentes unidades de investigación del CSIC en Cataluña en el solar que actualmente acoge el Parque Móvil del Estado.",
          "robots": "",
          "canonical": "https://www.barcelona.cat/es/conocebcn/ciutadelladelconocimiento/polo-de-biociencia-del-csic",
          "ogTitle": "Polo de biociencia del CSIC | La Ciutadella del Conocimiento | Ayuntamiento de Barcelona",
          "ogDescription": "Nuevo centro de servicios que concentre las diferentes unidades de investigación del CSIC en Cataluña en el solar que actualmente acoge el Parque Móvil del Estado.",
          "ogType": "Web",
          "ogUrl": "https://www.barcelona.cat/es/conocebcn/ciutadelladelconocimiento/polo-de-biociencia-del-csic",
          "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": 33,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 35,
            "oversizedMedia": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 33,
            "oversizedMedia": 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 33 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 59,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": true,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": true,
          "externalScriptCount": 7,
          "externalScriptsWithoutIntegrity": 7,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "cache-control": "max-age=300, public",
            "content-encoding": "gzip",
            "content-language": "es",
            "content-length": "11107",
            "content-type": "text/html; charset=UTF-8",
            "date": "Mon, 13 Apr 2026 23:02:40 GMT",
            "etag": "\"1776121360-gzip\"",
            "expires": "Sun, 19 Nov 1978 05:00:00 GMT",
            "last-modified": "Mon, 13 Apr 2026 23:02:40 GMT",
            "server": "nginx",
            "vary": "Cookie,Accept-Encoding",
            "via": "1.1 ca2190123e61f1744d1210c24c87c840.cloudfront.net (CloudFront)",
            "x-amz-cf-id": "VtOV89ToVkyjJiIe04h9rbKvK174TdxpXnQjxUbRrhvTwzpZ_-7FOg==",
            "x-amz-cf-pop": "IAD12-P5",
            "x-cache": "Miss from cloudfront",
            "x-content-type-options": "nosniff",
            "x-frame-options": "SAMEORIGIN",
            "x-generator": "Drupal 10 (https://www.drupal.org)"
          },
          "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": "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": "7 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 25,
        "urgency": "low",
        "origin": "https://www.barcelona.cat",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://www.barcelona.cat/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/sitemap.xml",
            "found": true,
            "status": 200,
            "contentType": "application/xml; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/manifest.webmanifest",
            "found": false,
            "status": 404,
            "contentType": "text/html"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://www.barcelona.cat/favicon.ico",
            "found": true,
            "status": 200,
            "contentType": "image/x-icon"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "low",
            "detail": "Missing beneficial file(s): /.well-known/security.txt, /manifest.webmanifest."
          }
        ]
      },
      "mediaHints": {
        "score": 20,
        "urgency": "low",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 22,
          "imagesWithLazy": 11,
          "imagesWithoutLazy": 11
        },
        "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."
          }
        ]
      },
      "wsgCustom": {
        "score": 85,
        "urgency": "medium",
        "data": {
          "hasPrintStyles": true,
          "hasReducedMotion": true,
          "media": {
            "totalImages": 27,
            "lazyImages": 12,
            "totalIframes": 1,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "\"Source Sans Pro\", \"Helvetica Neue\", Helvetica, Arial, sans-serif",
            "usesSystemFont": true
          },
          "tracking": {
            "count": 0,
            "scripts": []
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 12/27 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": "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"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 46,
        "urgency": "medium",
        "totalEstimatedSavingsBytes": 476925.8,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Use modern image compression formats",
            "urgency": "high",
            "estimatedSavingsBytes": 257898.8,
            "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": 219027,
            "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: 251.85 KB."
          },
          {
            "title": "Improve image encoding quality/size",
            "urgency": "high",
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 213.89 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": 702211.8,
        "totalEstimatedBlockingMs": 1489,
        "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": 257898.8,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 252 KiB",
            "urgency": "high",
            "sourceAuditId": "modern-image-formats"
          },
          {
            "id": "uses-optimized-images",
            "title": "Compress oversized image assets",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss.",
            "estimatedSavingsBytes": 219027,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 214 KiB",
            "urgency": "high",
            "sourceAuditId": "uses-optimized-images"
          },
          {
            "id": "render-blocking-resources",
            "title": "Eliminate render-blocking resources",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering.",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1489,
            "displayValue": "Est savings of 1,490 ms",
            "urgency": "high",
            "sourceAuditId": "render-blocking-resources"
          },
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 87109,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 85 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": 81353,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 79 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-css-rules"
          },
          {
            "id": "unused-javascript",
            "title": "Remove unused JavaScript",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code.",
            "estimatedSavingsBytes": 32481,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 32 KiB",
            "urgency": "low",
            "sourceAuditId": "unused-javascript"
          },
          {
            "id": "uses-responsive-images",
            "title": "Right-size images for viewport",
            "detail": "Avoid sending larger images than the rendered size needs.",
            "estimatedSavingsBytes": 24343,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 24 KiB",
            "urgency": "low",
            "sourceAuditId": "uses-responsive-images"
          }
        ],
        "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: 251.85 KB."
          },
          {
            "title": "Compress oversized image assets",
            "urgency": "high",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 213.89 KB."
          },
          {
            "title": "Eliminate render-blocking resources",
            "urgency": "high",
            "detail": "Inline critical assets and defer non-critical scripts/styles for faster rendering. Estimated render unblocking: 1489 ms."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "medium",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 85.07 KB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "medium",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 79.45 KB."
          },
          {
            "title": "Remove unused JavaScript",
            "urgency": "low",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 31.72 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": 10,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 7,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "7 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": 167997.7397346369
        },
        "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: 164.06 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: 164.06 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": "medium",
        "transferBytes": 1034431,
        "css": {
          "unusedBytes": 81353,
          "ratio": 0.0786451682132496,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 32481,
          "duplicatedBytes": 0,
          "ratio": 0.031399871040214376,
          "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": "high",
            "estimatedSavingsBytes": 81353,
            "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": "medium",
            "estimatedSavingsBytes": 32481,
            "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": 20,
        "urgency": "high",
        "transferBytes": 1034431,
        "estimatedDeferrableBytes": 200943,
        "renderBlockingMs": 1489,
        "breakdown": {
          "offscreenImageSavings": 87109,
          "unusedJavascriptSavings": 32481,
          "unusedCssSavings": 81353
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 87109,
            "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": "medium",
            "estimatedSavingsBytes": 32481,
            "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": 81353,
            "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": "Eliminate render-blocking resources",
            "area": "render-path",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "estimatedBlockingMs": 1489,
            "strategy": "Defer scripts/styles not required for first paint and preload only truly critical assets.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-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 www.barcelona.cat",
            "area": "image",
            "urgency": "high",
            "estimatedSavingsBytes": 215891,
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_medium/public/211220_af_biobancrecursos_033-710x379.jpg?itok=nW5rKy7M",
            "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 www.barcelona.cat",
            "area": "font",
            "urgency": "medium",
            "estimatedSavingsBytes": 90560,
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "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 cdn.matomo.cloud",
            "area": "script",
            "urgency": "medium",
            "estimatedSavingsBytes": 76425,
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.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": 64,
        "urgency": "high",
        "providerCount": 7,
        "requestCount": 8,
        "transferBytes": 139457,
        "notGreenCount": 5,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "cdn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 76425,
            "sampleUrl": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "greenCheck": {
              "hostname": "cdn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T08:54:12.814577",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.matomo.cloud",
              "error": null
            }
          },
          {
            "hostname": "cdn.lawwwing.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 31747,
            "sampleUrl": "https://cdn.lawwwing.com/widgets/current/19e3126d-e1c9-4f40-9e90-8d7c407ac1cb/cookie-widget.min.js",
            "greenCheck": {
              "hostname": "cdn.lawwwing.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Hetzner Online GmbH",
              "hostedByWebsite": "https://www.hetzner.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-06T10:31:21",
              "supportingDocuments": [
                {
                  "id": 1094,
                  "title": "Sustainability page",
                  "link": "https://www.hetzner.com/unternehmen/nachhaltigkeit/"
                },
                {
                  "id": 1469,
                  "title": "Renewable Energy Certificates - Finland",
                  "link": "https://media.greenweb.org/uploads/Hetzner-Finland-Oy-HydroGoO-Diploma-25-26_FfGBnqO.pdf"
                },
                {
                  "id": 2070,
                  "title": "EMAS Certfificate - Germany",
                  "link": "https://cdn.hetzner.com/assets/downloads/Certificate_EMAS_EN_Hetzner.jpg"
                },
                {
                  "id": 2071,
                  "title": "ISO14001:2015",
                  "link": "https://media.greenweb.org/uploads/Zertifikat_ISO14001_Hetzner_20250729_EN_eK.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/cdn.lawwwing.com",
              "error": null
            }
          },
          {
            "hostname": "stackpath.bootstrapcdn.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 15565,
            "sampleUrl": "https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js",
            "greenCheck": {
              "hostname": "stackpath.bootstrapcdn.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:50:38",
              "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/stackpath.bootstrapcdn.com",
              "error": null
            }
          },
          {
            "hostname": "ajuntament.barcelona.cat",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 7144,
            "sampleUrl": "https://ajuntament.barcelona.cat/widgets/bcn-avisos/js/bcn-avisos.js",
            "greenCheck": {
              "hostname": "ajuntament.barcelona.cat",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.422404",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/ajuntament.barcelona.cat",
              "error": null
            }
          },
          {
            "hostname": "code.jquery.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 5446,
            "sampleUrl": "https://code.jquery.com/jquery-migrate-1.0.0.js",
            "greenCheck": {
              "hostname": "code.jquery.com",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T16:13:08.750558",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/code.jquery.com",
              "error": null
            }
          },
          {
            "hostname": "plausible.io",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 2861,
            "sampleUrl": "https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js",
            "greenCheck": {
              "hostname": "plausible.io",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T02:27:14.095680",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/plausible.io",
              "error": null
            }
          },
          {
            "hostname": "dadesbcn.matomo.cloud",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 269,
            "sampleUrl": "https://dadesbcn.matomo.cloud/plugins/HeatmapSessionRecording/configs.php?idsite=19&trackerid=HhdarH&url=https%3A%2F%2Fwww.barcelona.cat%2Fes%2Fconocebcn%2Fciutadelladelconocimiento%2Fpolo-de-biociencia-del-csic",
            "greenCheck": {
              "hostname": "dadesbcn.matomo.cloud",
              "checked": true,
              "status": "not-green",
              "green": false,
              "hostedBy": null,
              "hostedByWebsite": null,
              "listedProvider": null,
              "partner": null,
              "modified": "2026-04-13T22:37:59.905790",
              "supportingDocuments": [],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/dadesbcn.matomo.cloud",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "high",
            "detail": "Track 7 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."
          },
          {
            "title": "Prioritize greener alternatives for third-party providers",
            "urgency": "high",
            "detail": "5 third-party script origin(s) are not confirmed green in the Green Web Foundation dataset."
          }
        ]
      },
      "redundancy": {
        "score": 16,
        "urgency": "low",
        "transferBytes": 1034431,
        "estimatedRedundantBytes": 113834,
        "redundancyRatio": 0.11004503925346398,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 81353,
            "displayValue": "Est savings of 79 KiB"
          },
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 32481,
            "displayValue": "Est savings of 32 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 81353,
            "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 unused javascript",
            "urgency": "medium",
            "estimatedSavingsBytes": 32481,
            "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 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": 26,
        "urgency": "medium",
        "totalTransferBytes": 1034431,
        "heavyRequestCount": 5,
        "heavyBytes": 486894,
        "heavyRatio": 0.4706877500770955,
        "heavyRequests": [
          {
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_medium/public/211220_af_biobancrecursos_033-710x379.jpg?itok=nW5rKy7M",
            "transferSize": 215891,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "transferSize": 90560,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.js",
            "transferSize": 76425,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "cdn.matomo.cloud"
          },
          {
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament/fonts/icoajuntament.ttf?8aaig7",
            "transferSize": 54921,
            "resourceType": "font",
            "mimeType": "font/ttf",
            "domain": "www.barcelona.cat"
          },
          {
            "url": "https://www.barcelona.cat/sites/default/files/css/css_evpTRQTawGYS1Ro7RbXq3hBxwat7AU-RJm1V8ZgzeaE.css?delta=5&language=es&theme=barcelonacat_theme&include=eJyFzsGKwzAMBNAfiuvDfpAZOyJxcSQjydn272sodFnIsieJmXcY3Ac7DmJPOKuJxfcJ6HXJ0EJNGAWe5CTVupLFqUdwkTb7v0zHRuGs9P0b-E4HxSzi5oqeyspXYGuS0YL5s1XerkQtEvDZfiVMxsySgS19_Qe6ypILp8kU8fMlejgpoy0dim0u3i2uOjra7Se5De4jt2o7rYs9zemIGUYvwgyJSg&tcut5n",
            "transferSize": 49097,
            "resourceType": "stylesheet",
            "mimeType": "text/css",
            "domain": "www.barcelona.cat"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "image",
            "count": 1,
            "transferBytes": 215891
          },
          {
            "resourceType": "font",
            "count": 2,
            "transferBytes": 145481
          },
          {
            "resourceType": "script",
            "count": 1,
            "transferBytes": 76425
          },
          {
            "resourceType": "stylesheet",
            "count": 1,
            "transferBytes": 49097
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.barcelona.cat",
            "count": 4,
            "transferBytes": 410469
          },
          {
            "domain": "cdn.matomo.cloud",
            "count": 1,
            "transferBytes": 76425
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Lazy-load offscreen images and media galleries",
            "urgency": "medium",
            "estimatedSavingsBytes": 87109,
            "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": "Defer non-critical UI modules until after first render",
            "urgency": "high",
            "estimatedSavingsBytes": 0,
            "strategy": "Keep only above-the-fold resources in the initial path; hydrate or import secondary modules later.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 www.barcelona.cat",
            "urgency": "medium",
            "estimatedSavingsBytes": 215891,
            "strategy": "Serve a smaller placeholder first and load this asset only when the user scrolls to or requests the component.",
            "url": "https://www.barcelona.cat/sites/default/files/styles/galeria_medium/public/211220_af_biobancrecursos_033-710x379.jpg?itok=nW5rKy7M",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 www.barcelona.cat",
            "urgency": "medium",
            "estimatedSavingsBytes": 90560,
            "strategy": "Subset or defer this font so full font payloads are only fetched when needed.",
            "url": "https://www.barcelona.cat/assetsdi/icoajuntament-v2/fonts/icoajuntament-v2.ttf?4n8bjk",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#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 cdn.matomo.cloud",
            "urgency": "medium",
            "estimatedSavingsBytes": 76425,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://cdn.matomo.cloud/dadesbcn.matomo.cloud/container_beOBY9ep.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": "10.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: 10.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 32 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 32 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,
          "displayValue": "Est savings of 79 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-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 79 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,
          "displayValue": "Est savings of 252 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 252 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 214 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 214 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,
          "displayValue": "Est savings of 85 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 85 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": "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": 0,
          "displayValue": "Est savings of 1,490 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 Eliminate render-blocking resources\n\n- Lighthouse audit: render-blocking-resources\n- Current value: Est savings of 1,490 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\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": "server-response-time",
          "title": "Reduce initial server response time",
          "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": 0,
          "displayValue": "Root document took 600 ms",
          "impact": "high",
          "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 Reduce initial server response time\n\n- Lighthouse audit: server-response-time\n- Current value: Root document took 600 ms\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": "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": 0.87,
          "displayValue": "3.6 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 Speed Index\n\n- Lighthouse audit: speed-index\n- Current value: 3.6 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\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": "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": "965 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: 965 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"
        }
      ]
    }
  ]
}
