Free website speed test
Measure page weight, request count, image sizes, and load time against real thresholds, and see exactly which asset is slowing you down, in one scan, no signup.
We read one page, in one state, without signing in. Being clear about the edges is the point: a scanner that implies it sees everything is the one to distrust. See exactly what we can't see →
- 9 checks each pass, fail, or needs review
- Under a minute one page, one scan
- No signup no account, no email
What we check
Page weight
Total transferred bytes across every request the page makesFlagged major above 3,000,000 bytes (3 MB), minor above 1,500,000 bytes (1.5 MB), and we name whichever asset class, video, images, third-party embeds, or your own JS and CSS, contributes the most.
Every extra megabyte is bytes a visitor on a slow connection has to download before the page is usable, and the category we name is the one place trimming would actually move the number.
Learn more about Page weight →Request count
Total number of network requests the page makes to loadOn a page mostly served over HTTP/2 or HTTP/3, request count is not scored as a bottleneck at all, since those protocols multiplex many requests over one connection. On HTTP/1.1, flagged major above 100 requests, minor above 60.
On an older protocol, each extra request is a fresh round trip fighting for one of a handful of connections per host, exactly the bottleneck bundling and sprite sheets were invented to work around.
Learn more about Request count →Third-party requests
Requests to any domain other than the one being scanned, grouped by vendor (registrable domain)Flagged major above 60 third-party requests from more than 7 vendors, minor above 60 requests on their own or above 20 requests from more than 4 vendors.
Every third-party script is code you did not write, deciding when it runs and how much it weighs, and each additional vendor is one more origin your page's performance now depends on.
Learn more about Third-party requests →Large images
Every image request over 300,000 bytes (300 KB), whatever format it is served inFlagged major with 3 or more oversized images, minor with 1 or 2. The whole set is reported here unless every image in it is already WebP or AVIF: one oversized JPEG or PNG among ten WebPs puts all eleven under this check, because the convert-the-format step still applies to that one.
An unoptimised image over 300 KB is often the single largest asset on a page by itself, larger than the entire rest of the HTML, CSS, and JS combined.
Learn more about Large images →Large images (already modern format)
The same 300,000-byte threshold, used only when every over-threshold image on the page is already served as image/webp or image/avifAn all-or-nothing switch, not a per-image split: the finding moves to this checkId only when there is no oversized image left to convert, so the advice becomes resizing or heavier compression rather than re-exporting to WebP or AVIF. An oversized image whose Content-Type we never captured counts as not modern, deliberately, since claiming credit for a format we did not observe would be a false pass.
Telling a page to convert an image that is already WebP wastes a developer's time chasing a step already done, while the actual fix, a smaller crop or a lower quality setting, goes unmentioned.
Learn more about Large images (already modern format) →Load time
The browser's own loadEventEnd timing milestone, cold cache, unthrottledFlagged major above 5,000 ms (5 seconds), minor above 2,500 ms (2.5 seconds). When the browser's own timing is unavailable, we fall back to a wider window, major above 9,000 ms, minor above 4,500 ms, and say so.
By 2.5 seconds a meaningful share of visitors are already gone, and the number here is a single unthrottled load, not a guess at a slower real connection.
Learn more about Load time →Text compression
First-party HTML, script, and stylesheet responses missing Content-Encoding, above a 1,000-byte (1 KB) floor or of a size we never learnedFlagged if one or more qualifying assets are served uncompressed; assets under the 1 KB floor are excluded, since compression overhead can make a tiny response larger, not smaller. The floor only ever exempts a size we actually measured. A response with no usable Content-Length, a chunked or streamed document, is flagged whatever its recorded byte count reads, because a streamed SSR HTML page is the highest-value asset this check exists to catch and its size arrives as a stand-in zero rather than as a measurement.
An uncompressed HTML document or JS bundle can be several times larger in transit than it needs to be, for a setting that is usually one line of server or CDN configuration.
Learn more about Text compression →Static caching
Cache-Control header on first-party images, scripts, and stylesheetsFlagged if one or more of those asset types is served with no Cache-Control at all.
Without it, a repeat visitor downloads your logo, your CSS, and your JS bundle again on every single visit, instead of once.
Learn more about Static caching →Render-blocking resources
The number of requests the browser classifies as a stylesheet, first-party and third-party alike, which we count as render-blockingFlagged minor when the page makes more than 4 stylesheet requests, and never major however high the count goes. We count requests, not link tags, so we cannot tell a blocking stylesheet from one the browser fetches and never applies: a link marked disabled, a media="print" sheet, one behind a media query that does not match, and a rel=preload as=style each count as one, exactly like a stylesheet that blocks the first paint. 4 or fewer is a pass.
A stylesheet the browser does treat as blocking is one more round trip it has to finish before it can paint anything, which a visitor experiences as a blank white page. Because we count the requests rather than inspect how each is loaded, a high number here is a prompt to check which of yours actually block, not a verdict that all of them do.
Learn more about Render-blocking resources →
What we can't see
- Performance on a throttled connection: our load-time measurement is unthrottled, an ideal case, not a simulation of 3G or a slow laptop.
- Performance after the first load: we read a single cold-cache visit, not what a repeat visitor with your assets already cached experiences.
- Core Web Vitals: we do not measure LCP, CLS or INP at all, neither as field data from your visitors' browsers nor as a synthetic figure of our own. The one timing this scan records is the browser's own loadEventEnd milestone.
- Performance on pages other than the one scanned.
Ready to see where you stand?
Scan your site and get your Engineering Score with a prioritized roadmap in under a minute, no signup required.
EngineeringScore