diff --git a/config/last_updated.json b/config/last_updated.json
index 250901d9..31829c5a 100644
--- a/config/last_updated.json
+++ b/config/last_updated.json
@@ -111,8 +111,8 @@
},
"/static/js/histogram.js": {
"date_published": "2018-05-08T00:00:00.000Z",
- "date_modified": "2025-06-02T00:00:00.000Z",
- "hash": "58efe705af1fb94fe47af02ffa19fa95"
+ "date_modified": "2025-12-07T00:00:00.000Z",
+ "hash": "762edb2f242b0c9275f64963596288a7"
},
"/static/js/index.js": {
"date_published": "2018-05-08T00:00:00.000Z",
@@ -166,23 +166,23 @@
},
"/static/js/techreport.js": {
"date_published": "2023-10-09T00:00:00.000Z",
- "date_modified": "2025-10-16T00:00:00.000Z",
- "hash": "0621955a4fd4c1b61e59d19b4efcb38c"
+ "date_modified": "2025-12-07T00:00:00.000Z",
+ "hash": "f1d524a0c3936491e48e422013548e03"
},
"/static/js/techreport/section.js": {
"date_published": "2023-10-09T00:00:00.000Z",
- "date_modified": "2025-08-18T00:00:00.000Z",
- "hash": "1775005cbf8d70f6fc4974781b7e1b51"
+ "date_modified": "2025-12-07T00:00:00.000Z",
+ "hash": "ccd53f137a4aa746f70dd6c90428db3b"
},
"/static/js/techreport/timeseries.js": {
"date_published": "2023-10-09T00:00:00.000Z",
- "date_modified": "2025-10-15T00:00:00.000Z",
- "hash": "66106fc8e5a8ae322d813311e6366657"
+ "date_modified": "2025-12-07T00:00:00.000Z",
+ "hash": "fffa299ba030c83dbac35f5f81703ce5"
},
"/static/js/timeseries.js": {
"date_published": "2018-05-08T00:00:00.000Z",
- "date_modified": "2025-06-05T00:00:00.000Z",
- "hash": "88e02e130b048bdbc7797a3c5c369d6d"
+ "date_modified": "2025-12-07T00:00:00.000Z",
+ "hash": "626181398990a64da615b1ab1e5737d3"
},
"/static/js/web-vitals.js": {
"date_published": "2022-01-03T00:00:00.000Z",
diff --git a/package-lock.json b/package-lock.json
index fe7abf4a..72f5d07a 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -344,6 +344,7 @@
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz",
"integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==",
"dev": true,
+ "peer": true,
"bin": {
"acorn": "bin/acorn"
},
@@ -369,6 +370,7 @@
"integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==",
"dev": true,
"license": "MIT",
+ "peer": true,
"dependencies": {
"fast-deep-equal": "^3.1.3",
"fast-uri": "^3.0.1",
@@ -476,6 +478,7 @@
"url": "https://github.com/sponsors/ai"
}
],
+ "peer": true,
"dependencies": {
"baseline-browser-mapping": "^2.8.9",
"caniuse-lite": "^1.0.30001746",
@@ -1611,6 +1614,7 @@
"resolved": "https://registry.npmjs.org/webpack/-/webpack-5.103.0.tgz",
"integrity": "sha512-HU1JOuV1OavsZ+mfigY0j8d1TgQgbZ6M+J75zDkpEAwYeXjWSqrGJtgnPblJjd/mAyTNQ7ygw0MiKOn6etz8yw==",
"dev": true,
+ "peer": true,
"dependencies": {
"@types/eslint-scope": "^3.7.7",
"@types/estree": "^1.0.8",
@@ -1659,6 +1663,7 @@
"resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-6.0.1.tgz",
"integrity": "sha512-MfwFQ6SfwinsUVi0rNJm7rHZ31GyTcpVE5pgVA3hwFRb7COD4TzjUUwhGWKfO50+xdc2MQPuEBBJoqIMGt3JDw==",
"dev": true,
+ "peer": true,
"dependencies": {
"@discoveryjs/json-ext": "^0.6.1",
"@webpack-cli/configtest": "^3.0.1",
@@ -2048,7 +2053,8 @@
"version": "8.15.0",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz",
"integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==",
- "dev": true
+ "dev": true,
+ "peer": true
},
"acorn-import-phases": {
"version": "1.0.3",
@@ -2062,6 +2068,7 @@
"resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz",
"integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==",
"dev": true,
+ "peer": true,
"requires": {
"fast-deep-equal": "^3.1.3",
"fast-uri": "^3.0.1",
@@ -2129,6 +2136,7 @@
"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.26.3.tgz",
"integrity": "sha512-lAUU+02RFBuCKQPj/P6NgjlbCnLBMp4UtgTx7vNHd3XSIJF87s9a5rA3aH2yw3GS9DqZAUbOtZdCCiZeVRqt0w==",
"dev": true,
+ "peer": true,
"requires": {
"baseline-browser-mapping": "^2.8.9",
"caniuse-lite": "^1.0.30001746",
@@ -2908,6 +2916,7 @@
"resolved": "https://registry.npmjs.org/webpack/-/webpack-5.103.0.tgz",
"integrity": "sha512-HU1JOuV1OavsZ+mfigY0j8d1TgQgbZ6M+J75zDkpEAwYeXjWSqrGJtgnPblJjd/mAyTNQ7ygw0MiKOn6etz8yw==",
"dev": true,
+ "peer": true,
"requires": {
"@types/eslint-scope": "^3.7.7",
"@types/estree": "^1.0.8",
@@ -2941,6 +2950,7 @@
"resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-6.0.1.tgz",
"integrity": "sha512-MfwFQ6SfwinsUVi0rNJm7rHZ31GyTcpVE5pgVA3hwFRb7COD4TzjUUwhGWKfO50+xdc2MQPuEBBJoqIMGt3JDw==",
"dev": true,
+ "peer": true,
"requires": {
"@discoveryjs/json-ext": "^0.6.1",
"@webpack-cli/configtest": "^3.0.1",
diff --git a/server/csp.py b/server/csp.py
index 1f6d2f94..fb7dac9c 100644
--- a/server/csp.py
+++ b/server/csp.py
@@ -10,6 +10,8 @@
"spdcrv.global.ssl.fastly.net",
"lux.speedcurve.com",
"'unsafe-inline'",
+ "reports-dev-2vzgiib6.uc.gateway.dev",
+ "reports-prod-2vzgiib6.uc.gateway.dev",
],
"font-src": ["'self'"],
"connect-src": [
diff --git a/src/js/components/drilldownHeader.js b/src/js/components/drilldownHeader.js
index e8beeecf..c7eceb2b 100644
--- a/src/js/components/drilldownHeader.js
+++ b/src/js/components/drilldownHeader.js
@@ -8,7 +8,7 @@ function setTitle(title) {
function setIcon(icon) {
const img = document.querySelector('h1 .title-img');
- const imgUrl = `https://cdn.httparchive.org/static/icons/${icon}`;
+ const imgUrl = `https://reports-prod-2vzgiib6.uc.gateway.dev/v1/static/icons/${icon}`;
img.setAttribute('style', `background-image: url(${imgUrl})`);
}
diff --git a/src/js/histogram.js b/src/js/histogram.js
index 876946da..d686844d 100644
--- a/src/js/histogram.js
+++ b/src/js/histogram.js
@@ -11,7 +11,7 @@ const [COLOR_DESKTOP, COLOR_MOBILE, COLOR_DESKTOP_ALT, COLOR_MOBILE_ALT] = Color
function histogram(metric, date, options) {
options.date = date;
options.metric = metric;
- const dataUrl = `https://cdn.httparchive.org/reports/${options.lens ? `${options.lens.id}/` : ''}${date}/${metric}.json`;
+ const dataUrl = `https://reports-prod-2vzgiib6.uc.gateway.dev/v1/static/reports/${options.lens ? `${options.lens.id}/` : ''}${date}/${metric}.json`;
fetch(dataUrl)
.then(response => {
if (!response.ok) {
diff --git a/src/js/techreport/combobox.js b/src/js/techreport/combobox.js
index 2759fd4f..f79c7970 100644
--- a/src/js/techreport/combobox.js
+++ b/src/js/techreport/combobox.js
@@ -31,7 +31,7 @@ class ComboBox {
option.id = `${this.element.dataset.id}-${row.technology.replaceAll(' ','-')}`;
const logo = document.createElement('img');
logo.setAttribute('alt', '');
- logo.setAttribute('src', `https://cdn.httparchive.org/static/icons/${icon}`);
+ logo.setAttribute('src', `https://reports-prod-2vzgiib6.uc.gateway.dev/v1/static/icons/${icon}`);
logo.setAttribute('loading', 'lazy');
option.append(logo);
if(this.selected.includes(row.technology)) {
@@ -200,7 +200,7 @@ class ComboBox {
/* Add the app logo */
const appIcon = document.createElement('img');
- appIcon.setAttribute('src', `https://cdn.httparchive.org/static/icons/${encodeURI(icon)}`);
+ appIcon.setAttribute('src', `https://reports-prod-2vzgiib6.uc.gateway.dev/v1/static/icons/${encodeURI(icon)}`);
appIcon.setAttribute('alt', '');
appIcon.classList.add('logo');
deleteSelection.append(appIcon);
diff --git a/src/js/techreport/tableLinked.js b/src/js/techreport/tableLinked.js
index 810defcb..9311d13c 100644
--- a/src/js/techreport/tableLinked.js
+++ b/src/js/techreport/tableLinked.js
@@ -107,7 +107,7 @@ class TableLinked {
wrapper.classList.add('app-wrapper');
const img = document.createElement('span');
- const imgUrl = `https://cdn.httparchive.org/static/icons/${encodeURI(technology[0]?.icon)}`;
+ const imgUrl = `https://reports-prod-2vzgiib6.uc.gateway.dev/v1/static/icons/${encodeURI(technology[0]?.icon)}`;
img.setAttribute('aria-hidden', 'true');
img.setAttribute('style', `background-image: url(${imgUrl})`);
img.classList.add('app-img');
diff --git a/src/js/timeseries.js b/src/js/timeseries.js
index 17419143..b61a7078 100644
--- a/src/js/timeseries.js
+++ b/src/js/timeseries.js
@@ -8,7 +8,7 @@ import { el, prettyDate, chartExportOptions, drawMetricSummary, callOnceWhenVisi
function timeseries(metric, options, start, end) {
- const dataUrl = `https://cdn.httparchive.org/reports/${options.lens ? `${options.lens.id}/` : ''}${metric}.json`;
+ const dataUrl = `https://reports-prod-2vzgiib6.uc.gateway.dev/v1/static/reports/${options.lens ? `${options.lens.id}/` : ''}${metric}.json`;
options.chartId = `${metric}-chart`;
options.tableId = `${metric}-table`;
options.metric = metric;
diff --git a/templates/report/report.html b/templates/report/report.html
index a7b7ffea..e1fef3a4 100644
--- a/templates/report/report.html
+++ b/templates/report/report.html
@@ -15,7 +15,7 @@
{% block head %}
{{ super() }}
-
+
{% endblock %}
diff --git a/tools/scripts/test_reports.sh b/tools/scripts/test_reports.sh
index ce2d295b..10c6550d 100755
--- a/tools/scripts/test_reports.sh
+++ b/tools/scripts/test_reports.sh
@@ -22,20 +22,20 @@ LENSES="drupal magento wordpress top1k top10k top100k top1m"
# These dated report URLs are tested for 200 status
# We test the first and last report for each lens
REPORT_MONTHLY_URLS=$(cat <<-END
-https://cdn.httparchive.org/reports/${REPORT_DATE}/bootupJs.json
-https://cdn.httparchive.org/reports/${REPORT_DATE}/tcp.json
-https://cdn.httparchive.org/reports/${CRUX_REPORT_DATE}/cruxCls.json
-https://cdn.httparchive.org/reports/${CRUX_REPORT_DATE}/cruxOl.json
+https://reports-prod-2vzgiib6.uc.gateway.dev/v1/static/reports/${REPORT_DATE}/bootupJs.json
+https://reports-prod-2vzgiib6.uc.gateway.dev/v1/static/reports/${REPORT_DATE}/tcp.json
+https://reports-prod-2vzgiib6.uc.gateway.dev/v1/static/reports/${CRUX_REPORT_DATE}/cruxCls.json
+https://reports-prod-2vzgiib6.uc.gateway.dev/v1/static/reports/${CRUX_REPORT_DATE}/cruxOl.json
END
)
for LENS in ${LENSES}
do
REPORT_MONTHLY_URLS_LENS=$(cat <<-END
-https://cdn.httparchive.org/reports/${LENS}/${REPORT_DATE}/bootupJs.json
-https://cdn.httparchive.org/reports/${LENS}/${REPORT_DATE}/tcp.json
-https://cdn.httparchive.org/reports/${LENS}/${CRUX_REPORT_DATE}/cruxCls.json
-https://cdn.httparchive.org/reports/${LENS}/${CRUX_REPORT_DATE}/cruxOl.json
+https://reports-prod-2vzgiib6.uc.gateway.dev/v1/static/reports/${LENS}/${REPORT_DATE}/bootupJs.json
+https://reports-prod-2vzgiib6.uc.gateway.dev/v1/static/reports/${LENS}/${REPORT_DATE}/tcp.json
+https://reports-prod-2vzgiib6.uc.gateway.dev/v1/static/reports/${LENS}/${CRUX_REPORT_DATE}/cruxCls.json
+https://reports-prod-2vzgiib6.uc.gateway.dev/v1/static/reports/${LENS}/${CRUX_REPORT_DATE}/cruxOl.json
END
)
REPORT_MONTHLY_URLS="${REPORT_MONTHLY_URLS} ${REPORT_MONTHLY_URLS_LENS}"
@@ -45,16 +45,16 @@ done
# These timeseries URLs are tested if the date exists in the returned body
# We test the first and last report for each lens
TIMESERIES_URLS=$(cat <<-END
-https://cdn.httparchive.org/reports/numUrls.json
-https://cdn.httparchive.org/reports/a11yButtonName.json
+https://reports-prod-2vzgiib6.uc.gateway.dev/v1/static/reports/numUrls.json
+https://reports-prod-2vzgiib6.uc.gateway.dev/v1/static/reports/a11yButtonName.json
END
)
for LENS in ${LENSES}
do
TIMESERIES_URLS_LENS=$(cat <<-END
-https://cdn.httparchive.org/reports/${LENS}/numUrls.json
-https://cdn.httparchive.org/reports/${LENS}/a11yButtonName.json
+https://reports-prod-2vzgiib6.uc.gateway.dev/v1/static/reports/${LENS}/numUrls.json
+https://reports-prod-2vzgiib6.uc.gateway.dev/v1/static/reports/${LENS}/a11yButtonName.json
END
)
TIMESERIES_URLS="${TIMESERIES_URLS} ${TIMESERIES_URLS_LENS}"
@@ -64,16 +64,16 @@ done
# For CrUX we always test the month before (unless an explicit date was passed)
# We test the first and last report
CRUX_TIMESERIES_URLS=$(cat <<-END
-https://cdn.httparchive.org/reports/cruxFastDcl.json
-https://cdn.httparchive.org/reports/cruxSmallCls.json
+https://reports-prod-2vzgiib6.uc.gateway.dev/v1/static/reports/cruxFastDcl.json
+https://reports-prod-2vzgiib6.uc.gateway.dev/v1/static/reports/cruxSmallCls.json
END
)
for LENS in ${LENSES}
do
CRUX_TIMESERIES_URLS_LENS=$(cat <<-END
-https://cdn.httparchive.org/reports/${LENS}/cruxFastDcl.json
-https://cdn.httparchive.org/reports/${LENS}/cruxSmallCls.json
+https://reports-prod-2vzgiib6.uc.gateway.dev/v1/static/reports/${LENS}/cruxFastDcl.json
+https://reports-prod-2vzgiib6.uc.gateway.dev/v1/static/reports/${LENS}/cruxSmallCls.json
END
)
CRUX_TIMESERIES_URLS="${CRUX_TIMESERIES_URLS} ${CRUX_TIMESERIES_URLS_LENS}"