dotvitals

Scripts and stylesheets are sent without compression

MediumHigh confidenceQuick winperf.lab.subresources-uncompressed

What this check looks for

‹count› text file(s) this page loads — JavaScript, CSS, JSON or SVG — arrived uncompressed. Compressing them would save an estimated ‹savings bytes› on every visit.

Why it matters

Text compresses by roughly 70–90%. This is a server setting, not a code change, and it is the largest saving per minute of work available on most sites.

When the check passes, your report says: “Scripts and stylesheets arrive compressed”.

What it costs your score

When this check fails it removes 8 points from your Performance score, before the status, confidence and repeat multipliers are applied. Performance carries a weight of 8 in the overall score.

It shares the performance.assets family ceiling of 25 points: however many findings that family produces, together they cannot remove more than that from Performance. One underlying problem showing up in several places is still one problem.

Severity
medium
Default confidence
high
Status when triggered
warn
Deduction
8 points
Family cap
performance.assets · 25
Category
Performance
Module
Perf lab
Fix owned by
user
In the ruleset since
2026.09

How the whole score is calculated

How to fix it

Turn on gzip or Brotli compression for text responses on whatever serves your static assets.

An estimated ‹savings bytes› of compressible text is being sent in full on every visit, for the sake of one server setting.

  1. Find out what actually serves these files. The paths in this finding will tell you whether it is your web server, a CDN, or an object store — the setting lives wherever that is.

  2. Enable compression for text/*, application/javascript, application/json and image/svg+xml. Do not compress images, video or WOFF2 fonts; they are already compressed.

  3. Prefer Brotli where the server supports it, with gzip as the fallback for clients that do not ask for br.

  4. Make sure Vary: Accept-Encoding is sent, or a shared cache may hand a compressed body to a client that cannot read it.

  5. If the assets are on an object store that cannot compress on the fly, pre-compress at build time and upload both variants with the right Content-Encoding.

How to confirm it worked

  • Re-run this scan and confirm the uncompressed count has dropped.

  • curl -sSI -H 'Accept-Encoding: br, gzip' https://‹host›/path/to/app.js | grep -i 'content-encoding' — expect br or gzip

A named slot like ‹domain› — and the braces left in the configuration below — is filled in with your own values when this rule appears on a report.

Remediation by platform

nginx
gzip on;
gzip_vary on;
gzip_min_length 256;
gzip_types text/css application/javascript application/json image/svg+xml;

# Brotli, only if the ngx_brotli module is compiled in:
# brotli on;
# brotli_types text/css application/javascript application/json image/svg+xml;
Apache
<IfModule mod_deflate.c>
	AddOutputFilterByType DEFLATE text/css application/javascript application/json image/svg+xml
</IfModule>

<IfModule mod_brotli.c>
	AddOutputFilterByType BROTLI_COMPRESS text/css application/javascript application/json image/svg+xml
</IfModule>
Caddy
encode zstd gzip
  • text/html is compressed by nginx unconditionally and must not appear in gzip_types — listing it logs a duplicate-MIME warning. Brotli is not in a stock nginx build; nginx -V will tell you whether ngx_brotli is present before you uncomment those lines.

  • mod_deflate adds Vary: Accept-Encoding itself. mod_brotli ships with Apache 2.4.26 and later but is off by default — a2enmod brotli — and the IfModule guard keeps the config valid until it is enabled.

  • Caddy's encode negotiates the encoding and sets Vary: Accept-Encoding on its own. A stock build offers gzip and zstd, not Brotli, so do not write encode br and expect it to take effect.

Technical detail

Uncompressed text subresources: ‹count›, estimated saving **‹savings bytes›**.

‹detail›

This came from **one page load we performed**, not from your visitors. A lab measurement is reproducible and tells you exactly which bytes and which resources are responsible — which is why the numbers below are byte counts and resource lists rather than a score. What real visitors experience is in the field-data section, which is the evidence this report scores Core Web Vitals on.

**This finding is about the files the page loads, not about the page itself.** The main document's compression is checked separately by http.headers.compression-not-applied, which fetches that response directly and reports on it there. If you see both findings, they are two different responses and both need fixing; if you see only this one, the HTML is compressed and the assets are not — which usually means a separate asset host, a CDN or a storage bucket that was configured independently of the web server.

Brotli beats gzip on text by a further 15–20% and every current browser supports it, but the negotiation is per-server: check what your asset host actually offers before assuming. Compressing already-compressed formats (images, video, fonts in WOFF2) wastes CPU for no gain and should stay off.

Standards and references

Test this on your domain

Run the check that produces this finding, on its own, against any domain.

Open the perf lab checker

Other perf lab checks