# EasySpeed documentation (JoomlaMax)

> Version 1.1.0 · Updated 1 October 2026 · Full page: https://joomlamax.com/documents/easyspeed/ · Product: https://joomlamax.com/joomla-extensions/joomla-easyspeed

## What is EasySpeed?

**JoomlaMax EasySpeed** is a speed plugin for any Joomla 4.4, 5 or 6 site running PHP 7.4 or newer. It makes pages load faster and improves their Core Web Vitals without changing how the site looks, by working on each page as Joomla builds it. Your template's and extensions' stylesheets are merged into one file and cut down to the rules your pages actually use. Scripts that would hold up the page are deferred safely. Images are offered at the right size as WebP (or AVIF), text stops jumping when web fonts arrive, and icon fonts are cut down to the icons you use. Its built-in page cache stores finished pages, so guests get them without Joomla building them again.

It runs entirely inside your site, in plain PHP. There is no Node.js to install, no outside service and no account to connect, so it works on ordinary shared hosting. It works with any template and any extension, and has built-in adaptations for SP Page Builder, Helix Ultimate and YOOtheme Pro. Every optimised page is checked before it is sent. If it fails a check, the original page goes out untouched and the **Status** tab tells you why. Every feature has its own switch, and logged-in visitors are left alone unless you choose otherwise.

You start safely. In **Diagnostics** mode EasySpeed only measures and reports. When the report looks right, you switch to **Optimise**, check your pages, then turn on **Cache pages**. On servers that allow work in the background (PHP-FPM/FastCGI or LiteSpeed), the page store then fills itself from your sitemap. When you edit an article, only the pages that showed it are cleared and built again. To bypass EasySpeed for any single page, add `?easyspeed=off` to its address.

### Key facts

- **Extension:** Joomla system plugin, listed as **System - JoomlaMax EasySpeed**
- **Version documented:** 1.1.0
- **Joomla:** 4.4, 5 and 6
- **PHP:** 7.4 or newer. The installer stops with a clear message if your PHP or Joomla version is too old.
- **Image copies (WebP):** Need PHP's GD extension with WebP support. The **Status** tab shows both, under **Image toolchain** and **Image formats**.
- **AVIF (optional):** Needs PHP 8.1 or newer with GD built with AVIF support, and a web server that sends .avif files as image/avif. EasySpeed tests this and shows the reason if it cannot be used.
- **Templates and extensions:** Any. Built-in adaptations for SP Page Builder, Helix Ultimate and YOOtheme Pro. A few options serve one extension only (Joomla's reCAPTCHA plugin, J-BusinessDirectory) and say so.
- **Hosting:** Works on shared hosting. Nothing to install on the server: no Node.js, no external API.
- **Background work:** Filling the page store, rebuilding edited pages, refreshing stored pages after an update or a settings change, and removing old stylesheet files all happen after a visitor already has their page. That needs PHP-FPM/FastCGI or LiteSpeed. The **Status** tab shows it as **Refresh behind the visitor**. Without it, each page is stored the first time a guest opens it.
- **Shared memory:** Used automatically when the server has it (APCu). There is nothing to set up.
- **CDN:** Works behind Cloudflare and other CDNs. The **Server** tab checks whether your CDN keeps your files. EasySpeed does not rewrite file addresses to a separate CDN domain.
- **Who is affected:** Guests only by default. The Joomla administrator, edit forms and page builder editing screens are never touched.
- **Multilingual and subfolder sites:** Supported. Each language is stored separately, and a site installed in a folder works like one at the top of the domain.
- **Outside services:** None required. EasySpeed contacts another server only when you ask it to: **Measure images on other domains** (off by default), **Copy them here** and **List the tags**.
- **Settings tabs:** Plugin (where **Mode** lives), Status, Optimisation, Stylesheets, Images, Cache, Diagnostics, Server, Exclusions, Advanced
- **Licence:** GNU General Public License version 2 or later
- **Price:** EUR 49 a year. Details are on the [EasySpeed page](https://joomlamax.com/joomla-extensions/joomla-easyspeed).
- **Updates:** Through Joomla's own updater, with your Download ID from joomlamax.com
- **Uninstall:** Removes everything EasySpeed created. Your content, original images and template are untouched.

## How it works

1. **A visitor asks for a page** When **Mode** is **Optimise**, **Cache pages** is on and a stored copy of the page exists, EasySpeed sends that copy straight away, before Joomla builds the page. On the way out it puts in the visitor's own form security token, so search boxes and contact forms keep working. Logged-in visitors always get a freshly built page.
2. **Joomla builds the page as usual** Your template, page builder, modules and plugins all run as they always do. EasySpeed waits until every other extension has finished. That way the page it works on is the page your visitor actually gets, including dialogs and notices that other extensions add at the last moment.
3. **EasySpeed optimises the finished page** Following the switches you have on, it merges the page's stylesheets into one file cut down to the rules your pages use, and protects class names that scripts add later. It defers scripts that would stop the browser reading the page, and removes repeated style blocks and the few files it can prove the page does not need. Images get their missing dimensions, the right loading priority and smaller WebP copies. Fonts get size-matched fallbacks, and icon fonts are cut down. It also adds early-connection hints and removes needless whitespace from the HTML.
4. **Every change is checked** Before anything is sent, the optimised page goes through structural checks. If a closing tag went missing, script tags no longer pair up, all styling disappeared, or the page shrank or grew far more than expected, the original page is sent instead. The reason is shown under **Warnings** on the **Status** tab.
5. **Delivered to suit the visitor** Someone who has just arrived (from a search engine, another site, a bookmark or a speed test) gets the stylesheet and the head's scripts written into the page itself, so it can appear as soon as it arrives. When the stylesheet is very large, they get the rules for the first screen at once and the rest straight after. Someone moving between your pages gets the same files as normal files, already kept by their browser. It is the same page either way.
6. **Stored and kept up to date** The finished page is stored for the next guest. On servers that allow background work, EasySpeed then uses the moments after each visitor has their page to fill the store from your sitemap, rebuild pages an edit cleared, make image copies and remove stylesheet files nothing uses any more. Editing an article clears exactly the pages that showed it.

## Install and update

1. **Check the requirements** You need Joomla 4.4, 5 or 6 and PHP 7.4 or newer. For smaller image copies the server needs PHP's GD extension. Most hosts have it, and the **Status** tab will confirm it after installation.
2. **Download the package** Log in to your account on joomlamax.com and download the latest EasySpeed package, a zip file named like `plg_system_easyspeed-1.1.0.zip`. Do not unzip it.
3. **Install it in Joomla** In your Joomla administrator go to **System → Install → Extensions**, open **Upload Package File** and drop the zip onto the page. If your PHP or Joomla version is too old, the installer stops and tells you which version is needed.
4. **Enable the plugin** Joomla installs plugins switched off. Go to **System → Manage → Plugins**, search for *EasySpeed*, and click the status icon next to **System - JoomlaMax EasySpeed** to enable it. Click its name to open the settings. The first tab, **Plugin**, holds **Mode**. It starts on **Diagnostics (measure only)**, so your visitors see no change yet.
5. **Add your Download ID** Updates come through Joomla's own updater and need your Download ID. Copy it from your account dashboard on joomlamax.com. In Joomla go to **System → Update → Update Sites**, open **JoomlaMax EasySpeed**, paste the ID into **Download Key** and choose Save & Close.
6. **Update to a new version** When a new version is out, Joomla lists it under **System → Update → Extensions**. Select EasySpeed and press **Update**. You can also upload the new zip the same way you installed it. Your settings are kept either way. Stored pages built by the older version stay in use and are rebuilt in the background, the most important first, while **Refresh stored pages in the background** is Yes (the default) and your server allows background work. If the **Status** tab says **Refresh behind the visitor** is not possible on this server, press **Remove every stored page** on the **Cache** tab after updating, so every page is built by the new version.
7. **Never delete EasySpeed's folders by hand** Stored pages point at the stylesheet and image files EasySpeed made. To empty the store, use **Remove every stored page** on the **Cache** tab. Old stylesheet files are removed by themselves while **Remove stylesheets no page uses** is Yes and your server allows background work.
8. **Uninstalling** Go to **System → Manage → Extensions**, find EasySpeed and press **Uninstall**. Stored pages, generated stylesheets, image copies, video posters and reports are removed with it. Your content, original images and template are not touched. Lines you added to `.htaccess` from the **Server** tab stay, since they are ordinary server settings.

## Quick start

1. **Leave Mode on Diagnostics** After you enable the plugin, **Mode** on the **Plugin** tab is **Diagnostics (measure only)**. EasySpeed measures your pages and changes nothing your visitors see. Leave it there for your first look.
2. **Browse your site as a guest** Open a private (incognito) window so you are not logged in. Visit the pages that matter most: the front page, an article, a category or blog page, your contact page and any page built with a page builder. EasySpeed measures each one.
3. **Read the Status tab** Reload the plugin settings and open the **Status** tab. In the Environment box, **Image toolchain** should say GD available, **Image formats** should include webp, and **Private cache** and **Public cache** should say writable (or will be created). **Refresh behind the visitor** tells you whether background work is possible on your server. Below that, read the Findings for the latest page and the list of observed pages.
4. **Check your server** Open the **Server** tab and press **Check my server**. It tests compression, how long browsers may keep your files, and any CDN in front of the site. If something needs attention, it gives you the exact lines to add to your `.htaccess` file, or for nginx.
5. **Note your starting point** Test your front page at PageSpeed Insights (pagespeed.web.dev) on the Mobile tab. Run it three times and note the middle result. This is your before.
6. **Switch to Optimise** On the **Plugin** tab set **Mode** to **Optimise** and save. The recommended options are already on. A few stay off until you choose them, such as **Use AVIF where accepted** and **Load statistics tags after the page has loaded**, because each is a trade-off only you can weigh.
7. **Check your pages as a guest** In a new private window, open the same pages again. Try the menu (also at phone width), sliders, tabs, forms, maps and icons. If anything differs, add `?easyspeed=off` to the address to see the original, and use the [troubleshooting section](https://joomlamax.com/documents/easyspeed/#troubleshooting) below. The **Status** tab shows what the engine did on the latest page it measured, with any warnings. Each page is measured at most once every five minutes, so to measure one again straight away, open it with `?easyspeed=measure` added.
8. **Prepare images and video posters** On the **Images** tab press **Prepare all images**. It works in short batches while that page is open. If you close it, nothing is lost: the job carries on when you next open the **Images** tab. If a video plays by itself behind one of your sections, press **Make posters** as well. It lists the videos EasySpeed has seen on pages it has built, so open those pages first. Posters are made in your browser, so keep the tab open until it finishes.
9. **Turn on Cache pages** On the **Cache** tab set **Cache pages** to Yes and save. Read the sentence under the progress bar: it says whether your sitemap was found and how many pages it lists. If none was found, enter it in **Sitemap address**. Add search results and other ever-changing pages to **Never store these addresses**. If your server allows background work, the store now fills itself. If not, each page is stored the first time a guest opens it.
10. **Measure again** When the **Cache** tab shows your important pages as stored, test the same page in PageSpeed Insights again: three runs, middle result. To see EasySpeed's effect side by side, also test the address with `?easyspeed=off` added.
11. **Tidy up** When you are happy, set **Append summary comment** on the **Advanced** tab to No. It adds an invisible note with measurements at the end of each page, which is handy while testing and not needed after.
12. **Know your way back** For one page, add `?easyspeed=off` to its address. That works at once. For the whole site, set **Mode** to **Off** (or back to **Diagnostics (measure only)**) and save. This also removes the stored pages, so no out-of-date copy is ever served. For one feature, switch just that option to No. Stored pages pick up that change as they are rebuilt in the background. To apply it everywhere at once, press **Remove every stored page** on the **Cache** tab.

## The three modes

- **Off:** EasySpeed does nothing to your pages: nothing is measured, changed or stored, and no stored page is served. Use it to rule EasySpeed out completely. If **Cache pages** was on, saving with Mode set to Off removes the stored pages. That way, when you switch back, no visitor is given a copy that nobody kept up to date.
- **Diagnostics (measure only):** The mode a new installation starts in. Pages that guests open are measured and recorded on the **Status** tab, each page at most once every five minutes: stylesheet, script and HTML sizes, blocking scripts, images, and a list of findings such as images without dimensions. Nothing visible on the page changes. The only addition is a short HTML comment at the very end with the measurements, which visitors never see. To leave even that out, switch off **Append summary comment** on the **Advanced** tab. **Cache pages** does not work in this mode.
- **Optimise:** Applies every optimisation you have switched on, on the **Optimisation**, **Stylesheets** and **Images** tabs (and **Bundle stylesheets from other domains** on the **Diagnostics** tab), and checks each page before it is sent. **Cache pages** only works in this mode. Note: when **Cache pages** is on, any later change of Mode empties the page store. It fills itself again once you are back in Optimise.

## Settings reference

### Plugin tab

The **Plugin** tab is the first thing you see when you open EasySpeed (**System → Manage → Plugins**, then *System - JoomlaMax EasySpeed*). Joomla shows this tab for every plugin, and EasySpeed puts its four main switches on it. They decide whether EasySpeed works at all, and for whom. Set them first. Everything on the other tabs builds on them.

On the right of the same tab, Joomla's own *Status* box must say *Enabled*, or EasySpeed does nothing at all. Do not confuse it with EasySpeed's [Status tab](https://joomlamax.com/documents/easyspeed/#settings-status), which is the report.

When **Cache pages** is on, saving a change to any of these four empties EasySpeed's page store at once, because they change which page each visitor should get. Visitors then get freshly built pages until the store has filled again. So settle these early and leave them alone.

#### Mode

*Default: Diagnostics (measure only)*

Chooses whether EasySpeed is off, only measuring your pages, or actually making them faster.

**Off** switches the engine off completely. No page is measured, changed or served from the store.

**Diagnostics (measure only)** measures each page as Joomla builds it and writes a report on the [Status tab](https://joomlamax.com/documents/easyspeed/#settings-status). Pages go to the browser unchanged, apart from a short hidden note at the end of the source when **Append summary comment** is on.

**Optimise** applies the changes you have switched on in the Optimisation, Stylesheets and Images tabs. EasySpeed checks the result before it sends the page. If the check fails, the original page is sent untouched and the reason appears on the Status tab.

Storing finished pages (**Cache pages** on the [Cache tab](https://joomlamax.com/documents/easyspeed/#settings-cache)) works only in Optimise mode.

**When to change it:** Start on Diagnostics, read the Status tab, then switch to Optimise. Choose Off when you want to rule EasySpeed out completely while you track down a problem.
- Tip: Diagnostics is safe on a live site: visitors get the same pages as before, apart from the hidden note.
- Tip: After switching to Optimise, open your most important pages in a private browser window and check menus, sliders and forms.
- Tip: To see a single page without EasySpeed, you do not need to change the mode. Add `?easyspeed=off` to its address instead (see [Emergency switch](https://joomlamax.com/documents/easyspeed/#opt-advanced-note)).
- **Watch out:** If **Cache pages** is on, changing the mode empties the page store. After you switch back to Optimise, visitors get pages built from scratch until the store has filled again.

#### Apply to

*Default: Guests only*

Decides whether EasySpeed works for every visitor or only for visitors who are not logged in.

**Guests only** is the safe default. Logged-in visitors, including editors and administrators, are never affected: they get each page exactly as Joomla builds it.

**All visitors** optimises pages for logged-in visitors too. They never get a stored page, though. A stored page is shared, so it is only ever given to guests. A logged-in visitor always gets a page built just for them.

Page builder editors and Joomla's front-end editing screens are always left alone, whichever you choose.

**When to change it:** Leave it on Guests only unless most of your visitors log in, for example on a members' site or an intranet.
- Tip: While you test with Guests only, use a private browser window. If you are logged in on the front end, you see your site without EasySpeed and may think nothing has changed.
- **Watch out:** If you choose All visitors, log in as an ordinary member and check the pages members use most, such as their profile, account pages and forms, before you leave it on.
- **Watch out:** If **Cache pages** is on, changing this setting empties the page store.

#### Stand down in debug mode

*Default: Yes*

Makes EasySpeed step aside on every page while Joomla's debug mode is on.

Joomla's debug mode (System, Global Configuration, System tab, *Debug System*) adds technical information to every page. With this set to Yes, EasySpeed skips every page while debug mode is on, so that information is never altered.

During that time no page is measured, optimised or served from the store.

**When to change it:** Set it to No only if you want EasySpeed to keep measuring while you are debugging something else.
- Tip: If the Status tab stops updating for no clear reason, check Joomla's debug mode first.
- **Watch out:** If you leave Joomla's debug mode on for a live site, EasySpeed does nothing for anyone while this is Yes. Switch debug mode off when you have finished with it.
- **Watch out:** If you set this to No while debug mode is on, EasySpeed may change the debug information Joomla adds to the page.
- **Watch out:** If **Cache pages** is on, changing this setting empties the page store.

#### Skip component template requests

*Default: Yes*

Leaves alone the stripped-down pages Joomla shows inside pop-ups, iframes and the page builder editor.

Some addresses contain `tmpl=component`. Joomla then shows only the main content, without the template around it. These are usually pop-up windows (modals), content shown inside an iframe (a page embedded in another page), print views or a page builder's editor.

They rarely matter for speed and often depend on the page that opened them, so skipping them is recommended.

If you set this to No, these pages are optimised, but they are still never stored.

**When to change it:** Leave it on. Turn it off only if visitors open such pages directly and you want them optimised too.
- **Watch out:** If you set it to No, check that your pop-ups, print views and anything shown in an iframe still look and work as before.
- **Watch out:** If **Cache pages** is on, changing this setting empties the page store.

### Status tab

The **Status** tab is EasySpeed's dashboard. It sits right after the Plugin tab. It tells you whether your server has everything EasySpeed needs, what the most recently measured page looks like, and exactly what EasySpeed changed on it.

Come here after installing, after switching **Mode** to Optimise, and whenever a page looks or behaves differently. Reading this tab changes nothing. Only the **Clear collected data** button does.

The report is filled by real page views: EasySpeed measures a page while Joomla builds it. Until a page has been built with EasySpeed in Diagnostics or Optimise mode, there is nothing to show.

**At the top** you see the EasySpeed version and one line that says what the engine is doing right now: switched off, measuring only (Diagnostics mode), or applying and checking its changes on every page (Optimise mode).

**Copy report** copies everything on this tab as plain text, with the version number and your site's domain added at the top. Paste it into an email or a support ticket, and we see exactly what you see.

**Clear collected data** deletes the measurements, the stylesheets EasySpeed has generated and every stored page. Prepared images are kept. A short message beside the button says how many files were removed. The store then fills again, by itself where your server allows it. Use this sparingly on a busy site: until the store has filled, visitors get pages built from scratch. Normal setting changes never need it, because saving the settings already takes care of stored pages.

The buttons on this tab, and on the Images, Cache, Diagnostics and Server tabs, work only for a Super User. Other accounts get the message *Administrator privileges are required*.

**Environment** is a quick health check of your server. It starts with your *Joomla* and *PHP* versions and *zlib compression*, which EasySpeed uses to measure compressed file sizes. *Image toolchain* must say *GD available* (GD is PHP's built-in image library) for EasySpeed to make lighter copies of your images. *Image formats* lists the formats GD can write on this server, such as webp, jpeg and png, plus avif where supported. *SP Page Builder*, *Helix Ultimate* and *YOOtheme Pro* show whether those are installed, since EasySpeed has built-in adaptations for both. *Shared memory*, when available, lets stored pages also be kept in the server's memory and read from there instead of from disk. *Stored pages* shows how many finished pages are stored and how much space they take. *Private cache* and *Public cache* say whether EasySpeed can write to its two folders.

*Refresh behind the visitor* says whether PHP can finish sending a page and then carry on working, which PHP-FPM (FastCGI) and LiteSpeed servers allow. This is what lets EasySpeed fill its store, rebuild edited pages and refresh old ones without anyone waiting. If it says *not possible on this server*, pages are still stored and served, but an expired page is rebuilt while the next visitor waits, and the store does not fill itself in the background.

If a cache folder says *NOT writable*, EasySpeed cannot save its work. Ask your host to give the web server write access to that folder. *will be created* is fine: the folder simply does not exist yet.

**No measurements yet** appears until a page has been measured. Open your site in a private browser window, so that you visit as a guest, load a page, then reload this screen. Still empty? Check that the plugin is enabled, that **Mode** is Diagnostics or Optimise, and that Joomla's debug mode is off.

**What the engine did** appears in Optimise mode. A before-and-after table compares the page as Joomla built it with the page EasySpeed sent: stylesheet requests, script requests, parser-blocking scripts (scripts that make the browser stop reading the page until they have loaded), images without dimensions, and the compressed size of the HTML. Numbers that improved turn green. Below it you find how much visitors no longer download on every visit, any warnings, and the time each step took in milliseconds. Next comes a table of every change, with what it applied to and what it saved. Last is a folded list called *Left alone on purpose*, which names everything EasySpeed chose not to touch, and why. If a page ever fails EasySpeed's own checks, the original page is sent untouched and the reason is shown under *Warnings*.

**Findings** lists the problems found on the latest page, most serious first. Each one has a coloured badge (CRITICAL, HIGH, MEDIUM or LOW), a title and an explanation. EasySpeed looks for images that only get their real picture once JavaScript runs, a first image that is lazy loaded, heavy render-blocking stylesheets (CSS the browser must download before it shows anything), an icon font loaded twice, fonts loaded from Google Fonts, parser-blocking scripts, images without a width and height, a large block of CSS written into the page, local files it could not read, and a heavy load of JavaScript. The small grey label at the right of each finding, such as *Phase 2*, is an internal reference you can ignore. A clean page shows *No significant issues detected on this page*.

Good to know: some findings, such as *Render blocking stylesheets* and *Heavy JavaScript payload*, weigh the files as your extensions load them, before EasySpeed's changes. In Optimise mode they can stay listed even when EasySpeed has already dealt with them. The before-and-after table shows what really changed.

**Latest page** shows six tiles: *CSS payload* and *JS payload* (compressed size, with the number of files and the uncompressed size, as your extensions load them), *HTML payload*, *Blocking scripts* (with how many are already deferred or async), *Images* (with how many are lazy or driven by script) and *Engine overhead*, the milliseconds EasySpeed spent on the page. A caption names the template, the component and when the page was recorded.

**Payload by extension** groups the page's stylesheets and scripts by the extension that added them, with a bar showing each one's share. It is the fastest way to see which extension weighs the most.

**All assets** (click to open) lists every stylesheet and script: its type, how it was added, which extension it belongs to, its address, and its raw and compressed size. A note in brackets marks files that are *inline* (written into the page), *external* (on another domain) or *unresolved* (they look local but could not be read from disk, so they are passed through untouched).

**Observed pages** (click to open) is the history: the pages measured most recently, newest first, with their stylesheet and script counts and sizes, HTML size, blocking scripts and script-driven images. How many it keeps is set by **Pages to remember** on the [Advanced tab](https://joomlamax.com/documents/easyspeed/#settings-advanced).

The same page is measured at most once every five minutes. A page served from EasySpeed's store is not measured at all, because Joomla never builds it, and the latest page can be one EasySpeed built itself while filling its store. To measure a page again right away, open it as a guest with `?easyspeed=measure` added to its address.

### Optimisation tab

The Optimisation tab decides what EasySpeed changes on each page as Joomla builds it: how scripts load, which pictures come first, what the browser is told to fetch early, and a few clean-ups that make the page smaller. Come here when a speed test points at scripts, images or layout shift (content that jumps as the page loads), or when one change does not suit your site.

Every option starts at a safe setting, so most sites never need to change anything here. Three features start switched off on purpose, because the choice is yours: **Load statistics tags after the page has loaded**, **Run the page's start-up code in small pieces** and **Measure images on other domains**.

A few options serve one extension only: SP Page Builder, Helix Ultimate, J-BusinessDirectory or Joomla's reCAPTCHA plugin. Each one says so below. On a site without that extension the option does nothing, so you can leave it on.

#### These take effect in Optimise mode

*Default: Not a setting (information note)*

A reminder that nothing on this tab changes your pages until EasySpeed is in Optimise mode, and that every change is checked before a page is sent.

The options on this tab only do their work when **Mode** on the [Plugin tab](https://joomlamax.com/documents/easyspeed/#settings-plugin) is set to **Optimise**. In **Diagnostics (measure only)** mode, EasySpeed measures your pages but sends them exactly as Joomla built them.

EasySpeed checks every optimised page before it leaves your server. If the result fails a structural check, for example a closing tag went missing or the script tags no longer pair up, your visitor gets the original page, untouched. The reason appears under **Warnings** on the [Status tab](https://joomlamax.com/documents/easyspeed/#settings-status).

To see any page exactly as Joomla built it, add `?easyspeed=off` to its address, for example `https://example.com/about?easyspeed=off`. EasySpeed then stays out of that one request, and a stored copy of the page is not used either.
- Tip: By default EasySpeed only changes pages for visitors who are not logged in (**Apply to** on the [Plugin tab](https://joomlamax.com/documents/easyspeed/#settings-plugin)). To see what your visitors see, log out or open a private window.
- Tip: If the address already contains a `?`, add `&easyspeed=off` to the end instead.
- Tip: Before you blame EasySpeed for a problem, compare the page with and without `?easyspeed=off`. Some quirks come from the template and look the same either way.
- Tip: The **What the engine did** section of the [Status tab](https://joomlamax.com/documents/easyspeed/#settings-status) lists what EasySpeed changed on the most recent page. A list called **Left alone on purpose** shows what it chose not to touch, and why.
- Tip: If **Cache pages** is on, saving this tab does not empty your stored pages. They keep being served and are rebuilt in the background with the new settings, as long as **Refresh stored pages in the background** is Yes on the [Cache tab](https://joomlamax.com/documents/easyspeed/#settings-cache). To apply a change to every page at once, press **Remove every stored page** on that tab.
- Tip: Five options on this tab add or change a small script inside the page: **Run SP Page Builder's time zone cookie once the page is idle**, **Load Google reCAPTCHA when a visitor reaches its form**, **Load statistics tags after the page has loaded**, **Faster J-BusinessDirectory search filter** and **Run the page's start-up code in small pieces**. If your site sends a strict Content Security Policy (a security header that only lets approved scripts run, for example by a hash or a nonce), these five step aside and change nothing.

#### Defer blocking scripts

*Default: Yes*

Lets the browser keep reading and drawing the page while script files download, instead of stopping at each one. PageSpeed Insights lists such scripts under render-blocking requests.

A normal script tag makes the browser stop reading the page until that file has downloaded and run. A few of them can hold up the first paint (the moment anything at all appears on screen), and phones feel it most. This option adds the `defer` attribute to those scripts. The browser then downloads them in the background and runs them once it has read the whole page.

This is the safe kind of speed-up. Deferred scripts still run by themselves, in the same order as before, and before the page reports that it is ready. Sliders, menus and anything else that waits for the page keep working. Nothing waits for the visitor to move the mouse, so speed tests see the finished page.

EasySpeed reads each script file on your site to learn what it provides. If a small script written into the page needs one of those files straight away, for example it uses jQuery (a script library many Joomla extensions rely on) while the page is still being read, that file stays where it is. So does every file that file needs in turn.

Only script files are deferred. Code written straight into the page, scripts that already carry `async` or `defer`, and module scripts are left as they are.

**When to change it:** Leave it on. If one script causes trouble, list that script in **Never defer these scripts** rather than switching the whole option off.
- Tip: On the [Status tab](https://joomlamax.com/documents/easyspeed/#settings-status), each deferred script is listed by file name. Every script that was kept is listed under **Left alone on purpose**, with the reason.
- Tip: A script that writes into the page as it loads (`document.write`), as many advertising tags do, is never deferred when it is a file on your own site or the tag of a known ad server. Deferred, such a script would leave its space empty.
- Tip: To keep one script as it is, add `data-easyspeed-skip` to its tag in your template, or add it to **Never defer these scripts**. The `data-no-optimize` attribute that some other tools use works too.
- Tip: The before-and-after table on the Status tab shows how many parser-blocking scripts (scripts that stop the browser reading the page) are left.
- **Watch out:** If an advert or widget from another server stays empty after you switch to Optimise mode, its script probably writes into the page as it loads. Add its address to **Never defer these scripts**.
- **Watch out:** EasySpeed cannot read script files from other servers. It only recognises a few well-known libraries among them, such as jQuery, by their address. If a feature stops working, open the page with `?easyspeed=off`. If it works there, add the script that feature uses to **Never defer these scripts**, and tell JoomlaMax support so EasySpeed can learn to spot it.

#### Run SP Page Builder's time zone cookie once the page is idle

*Default: Yes* · **Only for SP Page Builder**

Runs SP Page Builder's small time zone script once the page is idle, so it no longer delays the first paint on phones.

On a visitor's first visit, SP Page Builder runs a tiny script that reads the visitor's time zone and saves it in a cookie for the server to use on the next page. To read the time zone, the browser first loads its time zone data. On a phone that holds up the first paint by about as much as starting jQuery.

Nothing on the current page needs that cookie. With this on, the script waits until the browser is idle, or at most about three seconds, and then sets the cookie exactly as before.

EasySpeed recognises the script by what it does, so it still finds it when a newer SP Page Builder version words it differently. A script that does anything more than set this cookie is left alone.

**When to change it:** Leave it on.
- Tip: On a site without SP Page Builder this option does nothing, so you can leave it on.
- Tip: If your site's Content Security Policy would refuse a changed inline script, the script is left as it is.

#### Load Google reCAPTCHA when a visitor reaches its form

*Default: Yes* · **Only for Joomla's reCAPTCHA plugin**

Holds back Google's reCAPTCHA script until a visitor actually reaches a form that needs it.

Joomla's reCAPTCHA plugin loads Google's script on every page with a captcha form. That script then fetches and runs about a megabyte more while your page is still loading, even when the form sits in a closed pop-up nobody has opened. On one front page this took 2.2 seconds of a test phone's processor, and PageSpeed Insights (Google's free speed test) scored the page 55.

With this on, the script starts only when a captcha comes near the screen (within about 300 pixels) or when the visitor starts using its form by clicking, tapping or typing in it. The captcha then appears as it always did. Its box keeps its height while it waits, so nothing on the page moves.

Only the familiar "I'm not a robot" checkbox is handled. Pages with an invisible or score-based captcha, or where another script uses the captcha before the visitor does anything, are left exactly as they are.

**When to change it:** Leave it on. Switch it off only if a form's captcha does not appear when a visitor reaches it, and tell JoomlaMax support which form.
- Tip: A captcha far down the page or in a closed pop-up is no longer loaded during a speed test, because a test never scrolls or types.
- Tip: If the Status tab lists Google reCAPTCHA under **Left alone on purpose**, a script on that page uses the captcha by itself, so EasySpeed kept the original setup.
- Tip: On a slow connection the checkbox can take a moment to appear after the visitor reaches the form. Its space is already reserved, so nothing moves when it arrives.

#### Load statistics tags after the page has loaded

*Default: No*

Holds back analytics and tracking tags until the visitor first scrolls, taps or types, or until a few seconds after the page has loaded.

Statistics and tracking tags do nothing your visitor can see. Examples are Google Analytics, Google Tag Manager, StatCounter, the Meta pixel, Hotjar and Microsoft Clarity. On a phone they are some of the heaviest code a page runs: on one site, Google's gtag.js and StatCounter took half a second of a test phone's processor while the page was being put together.

With this on, these tags wait. They start the first time the visitor scrolls, taps or types. If the visitor does none of these, they start by themselves about three seconds after the page has finished loading, once the browser is idle. Their settings stay where they are, so what they measure does not change.

EasySpeed recognises Google's tag (gtag.js), Google Tag Manager, the older Google Analytics, StatCounter, the Meta pixel, Hotjar, Microsoft Clarity, the LinkedIn Insight Tag, TikTok, X (Twitter), Plausible, Fathom and Yandex Metrica. It only moves tags that your page loads as a script file with `async` or `defer`. A tag loaded any other way may write into the page as it loads, so it is left alone.

**When to change it:** Switch it on if your speed report shows analytics or tracking scripts among the heaviest work on your pages, and you accept that the very shortest visits may go uncounted.
- Tip: This is off by default because it is your decision. It changes when your statistics start, not only how fast the page is.
- Tip: Many tracking services give you a copy-and-paste snippet that builds the tag while the page runs, as the standard snippets for Google Tag Manager and the Meta pixel do. A tag added that way is not in the page as a file, so it starts as before. The Status tab names every tag that was moved.
- Tip: Tags that your cookie consent tool holds back until the visitor agrees stay under that tool's control.
- Tip: After you switch it on, compare a week of visits with the week before.
- **Watch out:** A visit that ends within those first few seconds, without the visitor scrolling, tapping or typing, may not be counted. If you rely on exact visit numbers, for example in reports to clients or advertisers, keep that in mind before you switch this on.

#### Faster J-BusinessDirectory search filter

*Default: Yes* · **Only for J-BusinessDirectory**

Removes a long task that J-BusinessDirectory's search filter runs after the page loads, during which a phone cannot respond.

J-BusinessDirectory draws its search filter after the page has loaded. To do this it passes every city, region and category name through the browser's HTML reader, over 3,500 times on one directory site. PageSpeed Insights showed that as a single 600 ms task. During that time a phone cannot respond to a tap.

With this on, plain names, with no markup or special characters in them, are used as they are, which is exactly what the HTML reader would have returned. Any other name still goes through the component's own code. The filter looks and works as before.

It only applies where the component's script, loaded from your own site, is found on the page.

**When to change it:** Leave it on.
- Tip: On a site without J-BusinessDirectory this option does nothing, so you can leave it on.

#### Run the page's start-up code in small pieces

*Default: No*

Runs the small start-up functions that extensions write into the page one at a time, so a phone can respond to taps in between.

Extensions write their start-up code into the page as small 'when the page has loaded' functions, for a map, star ratings, a contact form or a search box. A browser runs all of them as one block of work, and a phone cannot respond to a tap until the last one has finished.

With this on, each function the page writes into itself runs as a separate task, in the same order. Functions added by script files are not changed, and they now run just before the page's own ones.

To stay safe, EasySpeed leaves a page exactly as it is if that page also starts code when it loads in some other way: the body's `onload` attribute, `window.onload`, jQuery's load event or a function added by name. Splitting would change the order between them.

Why it is off: on a directory listing, the largest block went from 230 ms to 120 ms, and the blocking time (how long the phone is too busy to respond) fell from 276 to 173 ms on a throttled phone. But PageSpeed Insights' simulation then judged the page to be drawn later (Speed Index, a measure of how quickly the page looks complete, rose from 3.6 to 4.4 seconds) and scored it one point lower.

**When to change it:** Switch it on if visitors on phones find your pages slow to respond to the first tap, and that matters more to you than a lab score.
- Tip: It helps most on busy pages where many extensions each set something up after loading, such as listings, directories and shops.
- Tip: The Status tab tells you how many functions were split on the last page, or why the page was left as it was.
- Tip: After switching it on, try the features that start after loading, such as maps, sliders and forms.
- **Watch out:** Your PageSpeed Insights score may drop by a point, even though the page responds sooner on a real phone.
- **Watch out:** The page's own start-up functions now run after those added by script files. If one of them depended on running first, that feature could misbehave. If it does, switch this off again.

#### Fetch module scripts at low priority

*Default: Yes*

Downloads module scripts, such as Joomla's own, at low priority, so they stop competing with your stylesheet and main picture.

Joomla 4 and 5 load Bootstrap's components, the menu, the messages and the session keep-alive as module scripts. A module script (a modern kind of script file, nothing to do with Joomla's modules) waits until the page has been read before it runs, just like a deferred script. But the browser fetches it at high priority, alongside the stylesheet and the first picture, and PageSpeed Insights counts it as holding up the first paint.

With this on, module scripts are fetched at low priority, as deferred scripts are. Any module script on the page is treated the same way, not only Joomla's. They still run at exactly the same moment, so your site behaves the same.

On one front page with sixteen of them, the first paint came half a second sooner in the test.

**When to change it:** Leave it on.
- Tip: A module script that your template already gives its own priority, or preloads, is left as it is.
- Tip: To leave one module script untouched, add `data-easyspeed-skip` to its tag.

#### Never defer these scripts

*Default: Empty* · *Appears when Defer blocking scripts is Yes*

A list of scripts that must keep loading exactly where they are, without being deferred.

Write one entry per line. A plain entry matches any script address that contains that text, in upper or lower case. An entry that starts and ends with a forward slash is a regular expression (a pattern for matching text), for advanced users.

You can also exclude a single script in your template by adding `data-easyspeed-skip` to its script tag.

Most sites never need this list. A script that writes into the page as it loads (`document.write`), as many advertising tags do, is never deferred when it is a file on your own site or the tag of a known ad server. If an advert from any other server stays empty, add it here.

**When to change it:** Add a line when an advert or widget from another server stays empty, or when a feature works with `?easyspeed=off` but not without it.

**Example:** `adserver.example.net` keeps every script from that ad server where it is. `booking-widget.js` keeps that one file in place, wherever it is loaded from.
- Tip: Use the shortest text that only that script has, such as its file name or its server's name. The Status tab lists deferred scripts by file name, which is usually all you need.
- Tip: A line that starts with `#` is ignored, so you can leave yourself a note about why a script is listed.
- Tip: Scripts that match an entry appear under **Left alone on purpose** on the Status tab, marked as listed in the exclusions.
- Tip: A regular expression must start and end with a slash, with nothing after the last slash.
- **Watch out:** An entry that is too short, such as `js`, matches almost every script and stops all of them from being deferred.

#### Remove redundant assets

*Default: Yes*

Master switch for the three removal rules below. Nothing is removed unless the finished page proves it is unused.

Some files arrive twice, or arrive on pages that never use them. This switch turns on the three rules below. Before removing anything, each rule looks for proof in the finished page that the file is not needed. Without that proof, the file stays.

Switch this off and all three rules stop at once.

**When to change it:** Leave it on.
- Tip: Everything removed is listed on the Status tab, with the size saved.
- Tip: To protect one stylesheet, style block or script from removal, add `data-easyspeed-skip` to its tag.

#### Remove repeated style blocks

*Default: Yes* · *Appears when Remove redundant assets is Yes*

Removes style blocks that appear on the page more than once, word for word.

A module shown in two positions is built twice. A page builder also gives each of its blocks its own style element. As a result, the same CSS rules (the instructions that style your page) can arrive several times on one page.

Only exact copies are removed, and the last copy is always the one kept. That leaves the cascade, the order that decides which rule wins, exactly as it was, so the page looks the same.

Two blocks with the same rules but meant for different media, for example screen and print, count as different blocks and are both kept.

**When to change it:** Leave it on.
- Tip: Each removed block is listed on the Status tab with its size.

#### Remove the duplicate icon font

*Default: Yes* · *Appears when Remove redundant assets is Yes*

Drops Joomla's own Font Awesome stylesheet when a second complete copy is already on the page and nothing needs Joomla's.

Font Awesome is the icon font most Joomla templates use. When a page builder ships its own copy alongside Joomla's, the page loads two complete icon stylesheets, and one of them is roughly 100 KB of duplication.

Joomla's copy is dropped only when a second complete copy is present and the page shows no class that starts with `icon-`, since those are the only classes Joomla's copy adds. On a site with a single icon font, nothing is removed.

**When to change it:** Leave it on unless an icon goes missing on your site.
- Tip: If the Status tab says Joomla's copy was kept, either it is the only icon font on the page or the page uses Joomla's `icon-` classes. Both are expected.
- **Watch out:** EasySpeed only sees the page as Joomla built it. If a script adds an icon with an `icon-` class later, that icon could go missing. If you notice a missing icon that comes back with `?easyspeed=off`, switch this off.

#### Remove unused front end widgets

*Default: Yes* · *Appears when Remove redundant assets is Yes* · **Only for Helix Ultimate**

Stops Helix Ultimate loading its drop-down list widget on pages that have nothing for it to do.

On Joomla 6, Helix Ultimate loads the Chosen widget, a script and stylesheet that restyle drop-down lists, on every front end page, whether or not anything uses it.

EasySpeed removes the widget only when the page contains no markup that needs it. Sites that do not use Helix Ultimate are unaffected.

**When to change it:** Leave it on.
- Tip: Removed files are listed on the Status tab, with the size saved.
- **Watch out:** If a custom script on your site turns plain drop-down lists into Chosen boxes, with no Chosen markup in the page, the widget will be missing there. Switch this off if you see that.

#### Optimise images

*Default: Yes*

Master switch for the image rules below: missing width and height, loading order and the choice of main picture.

Images cause two of the most common speed problems. The page jumps as pictures arrive, and the main picture shows up late. This switch turns on the rules below, which fix both.

Some lazy-loading scripts fill in an image's real address later, from an attribute such as `data-src`. EasySpeed does not add dimensions to those images, mark them lazy or choose them as the main picture, so it never works against such a script.

**When to change it:** Leave it on.
- Tip: To keep one image out of every rule, add `data-easyspeed-skip` to its tag.
- Tip: This tab decides how images load. Making smaller, lighter copies of your pictures in WebP or AVIF is set on the [Images tab](https://joomlamax.com/documents/easyspeed/#settings-images).

#### Add missing dimensions

*Default: Yes* · *Appears when Optimise images is Yes*

Writes each local image's real width and height into its tag, so the browser can keep space for it and nothing jumps.

When an image tag has no width and height, the browser cannot know the picture's size until it arrives. It lays out the text first, then pushes everything down when the picture lands. Google measures this jumping as Cumulative Layout Shift (CLS).

EasySpeed reads the real size of each image stored on your server and fills in what is missing. If your template already set one of the two, for example only the height, that value is kept. Only the other one is worked out from the picture's shape, so nothing changes size.

Images that your stylesheet already sizes are left as they are, because adding dimensions to them could stretch them. Images on other servers cannot be read from disk and are skipped, unless you switch on **Measure images on other domains**.

**When to change it:** Leave it on.
- Tip: The Status tab shows how many images were given dimensions, and how many were left as they were because their stylesheet already sizes them.

#### Fix image loading priority

*Default: Yes* · *Appears when Optimise images is Yes*

Makes the pictures at the top of the page load first, and the rest load only when the visitor scrolls near them.

Many templates and page builders, SP Page Builder among them, mark every image as lazy, which means 'load it later, when it is needed'. That includes the picture at the top of the page, which is usually the Largest Contentful Paint (LCP) element. LCP is the moment the biggest thing on the first screen, usually the main picture, appears, and Google times it.

With this on, the first few images on the page load straight away (see **Images treated as above the fold**). The first content image among them becomes the main image and gets high priority. Every image further down loads lazily.

Images whose class marks them as a logo, icon, avatar or banner never use up one of those early places, and are never chosen as the main image. Neither are adverts, such as Joomla's Banners module, or pictures inside pop-ups. In a slider, the first four slides load straight away, so the visitor never sees an empty slide.

Further down the page, an image whose tag already says `loading="eager"` keeps that choice. An empty `loading` attribute, as SP Page Builder writes it, counts as no choice.

**When to change it:** Leave it on.
- Tip: The Status tab names the main image next to 'Prioritised the largest image'. It is also the picture that **Preload the largest image** fetches early.
- Tip: A wide, low strip, at least four times wider than it is tall and no more than 250 pixels high, such as a masthead or a divider, is never chosen as the main image.
- Tip: If the wrong picture is chosen, add `data-easyspeed-skip` to it. EasySpeed then leaves that image alone completely: it neither uses up a place nor gets chosen.

#### Choose the main image separately for phones and desktops

*Default: Yes* · *Appears when Optimise images and Fix image loading priority are both Yes*

Picks one main picture for phones and another for desktops when your page shows different pictures on each.

Page builders often build a section twice: one copy shown only on desktops and one shown only on phones. EasySpeed reads which sections your stylesheet hides at which screen widths. Each range of widths then gets its own main picture, fetched early only on the screens that show it. A phone never downloads the desktop's picture first.

Other images in a section that some screens hide load only when needed. This matters because a browser downloads an image even where it is hidden.

Switched off, the first large image on the page is chosen for every screen.

**When to change it:** Leave it on.
- Tip: It reads the show and hide classes your own stylesheet defines, such as SP Page Builder's per-device visibility, Bootstrap's display classes or YOOtheme Pro's UIkit classes such as `uk-hidden@m`. The screen widths also come from your stylesheet, not from a guess.
- Tip: On a page that shows the same content on every screen, nothing changes.

#### Images treated as above the fold

*Default: 2* · *Appears when Fix image loading priority is Yes*

How many images from the top of the page load straight away. Every image after them loads lazily.

'Above the fold' is the part of the page a visitor sees before scrolling. The images counted here load immediately. The ones after them wait until the visitor scrolls near them. You can enter a number from 0 to 20.

Two suits most templates, where the first image is the logo. An image whose class marks it as a logo, icon, avatar or banner does not use up a place, and neither does an advert or a pop-up picture. A logo without such a class counts like any other image. When **Choose the main image separately for phones and desktops** is on, phones and desktops each keep their own count.

An image with an empty `loading` attribute, as SP Page Builder writes it, counts as one that has not been told either way, so it follows this count.

**When to change it:** Raise it if your header or first screen holds several pictures that appear late.

**Example:** 3: right when the first screen of your pages shows a large picture with two smaller pictures beside it.
- Tip: Count the content pictures a visitor sees on the first screen of a typical page on a phone, without the logo. Use that number, or one more.
- **Watch out:** Set it too high, and pictures far down the page load straight away and compete with the main picture.
- **Watch out:** Set it to 0, and even the main picture waits, which delays LCP and leaves nothing to preload.

#### Reserve space for sliders

*Default: Yes*

Keeps a slider at its final size from the first moment, so the content below it does not jump when the slider starts.

A slider arrives as a plain stack of slides with no height. Its script then measures the space, sets a height and lines the slides up side by side, and everything below jumps up the page. Google counts that jump against Cumulative Layout Shift.

With this on, only the first slide shows until the slider's script takes over, which is how the slider ends up looking anyway. For SP Page Builder's carousel, the height the builder already writes into the page for its own script is reserved in advance. EasySpeed also recognises Swiper and Owl Carousel sliders.

As soon as the slider's script starts, EasySpeed's rules stop applying by themselves, and the slider behaves exactly as before. On pages without such a slider, nothing happens.

**When to change it:** Leave it on.
- Tip: Bootstrap's own carousel already shows one slide at a time, so it needs no help.
- Tip: Showing the first slide from the first paint can also bring LCP forward, because the browser can count the slide's content straight away.
- Tip: To leave one slider alone, add `data-easyspeed-skip` to its outer element.

#### Tell the browser how much room an image has

*Default: Yes* · *Appears when Offer smaller renditions on the Images tab is Yes*

Tells the browser the widest an image can be shown, so it downloads a smaller copy for a small space.

When EasySpeed offers smaller copies of an image (set on the [Images tab](https://joomlamax.com/documents/easyspeed/#settings-images)), the browser has to know how wide the image will be shown to pick the right copy. Without a `sizes` attribute it assumes the picture fills the whole screen, and fetches the copy made for a full-width banner, even for a thumbnail.

Your stylesheet may put a fixed maximum width in pixels on the box around an image. When no other rule can raise that limit, EasySpeed passes it on, so the browser can choose a smaller copy. A grid class such as a column width is never used on its own, because later rules often overrule it.

Where no safe limit is found, the image keeps the general **Sizes hint** from the Images tab.

**When to change it:** Switch it off if pictures look slightly blurry with EasySpeed on, and sharp with `?easyspeed=off`.
- **Watch out:** If your theme lets images grow past the box that holds them, the browser may pick a copy that is too small, and the picture can look soft. Switch this off in that case.

#### Measure images on other domains

*Default: No* · *Appears when Add missing dimensions is Yes*

Lets EasySpeed find the width and height of images hosted on other websites, so they also get their missing dimensions.

Images hosted elsewhere, for example on a CDN or another site, cannot be measured from your server's disk. With this on, EasySpeed reads only the start of each such image, where its size is stored. It does this once and remembers the result.

Images that could not be measured are remembered too, so they are not requested again. Each request waits at most about two seconds.

Because this makes a network request while a page is being built, it is off by default.

**When to change it:** Switch it on only if your pages show images from another domain and you see layout shift from them.
- Tip: A page settles after a few views. Once its images are measured, it does not fetch them again.
- **Watch out:** While images are still unmeasured, each one can add up to about two seconds to building that page. Keep **Images to measure per page load** low.

#### Images to measure per page load

*Default: 3* · *Appears when Measure images on other domains is Yes*

The most unmeasured remote images EasySpeed may fetch while it builds one page.

This is a ceiling on how many not-yet-measured images may be fetched while one page is built. The rest wait for the next time that page is built.

Results are kept, so a page settles after a few views and stops fetching. You can enter a number from 1 to 20.

**When to change it:** Leave it at 3 unless you want a page with many remote images to settle faster.
- Tip: If a page has many remote images, the default of 3 simply takes a few more views to measure them all.
- **Watch out:** A higher number makes building a page slower, for whoever happens to trigger the build, until its images are measured.

#### Add resource hints

*Default: Yes*

Master switch for the two hints below: connecting early to other servers, and preloading the main picture.

Resource hints are short notes in the page's head that tell the browser what it will need soon, so it can start early. This switch turns on the two hints below.

**When to change it:** Leave it on.
- Tip: If your template already adds an early connection to a server, EasySpeed does not add a second one.

#### Connect early to other domains

*Default: Yes* · *Appears when Add resource hints is Yes*

Opens connections to the other servers your page uses ahead of time, so their files start downloading sooner.

Before a browser can download a file from another server, such as fonts or a chat widget, it has to find the server and set up a secure connection. That takes several trips across the internet. A preconnect hint asks the browser to do this early, while it is still reading the page. A dns-prefetch hint does the first part, finding the server, for browsers that do not understand preconnect.

EasySpeed gives hints first to the servers the browser would discover last on its own. Those are servers named only inside scripts or stylesheets, such as the server behind Google Fonts' font files, followed by servers named lower down the page. Servers named in the head, which the browser finds at once anyway, come last. Within each group, a server that only delivers pictures comes after the others, because nothing waits on a picture and the main picture is preloaded anyway.

Some servers get no early connection because nothing will contact them yet. These include servers whose scripts EasySpeed holds back (a captcha waiting for its form, statistics tags waiting for the visitor), scripts parked by a cookie consent tool, and fallbacks inside `noscript` that only browsers without JavaScript use.

**When to change it:** Leave it on.
- Tip: The Status tab lists each early connection and why that server was chosen.

#### Maximum early connections

*Default: 3* · *Appears when Connect early to other domains is Yes*

The most servers EasySpeed opens an early connection to on one page.

Each early connection keeps a connection open in the browser, so more is not better. Three is a sensible ceiling.

The number counts servers, not tags. Each server gets two hints (preconnect and dns-prefetch), and together they count as one. You can enter a number from 0 to 8, and 0 adds no early connections.

**When to change it:** Leave it at 3. Raise it by one if the Status tab shows that an important server, such as your font host, was left out because the limit was reached.
- Tip: Servers left out because the limit was reached are listed under **Left alone on purpose** on the Status tab.
- **Watch out:** Set it much higher, and the extra connections compete with the files the page needs first.

#### Preload the largest image

*Default: Yes* · *Appears when Add resource hints is Yes*

Asks the browser to start downloading the main picture as soon as it reads the page's head.

A browser normally discovers an image only when it reaches the image's tag, which can be far down the page's code. A preload hint in the head lets it start straight away, so the main picture (your LCP element) appears sooner.

The picture preloaded is the one **Fix image loading priority** chose as the main image. If EasySpeed offers smaller copies of it, the hint names the same copies, so the browser downloads one file, not two. When phones and desktops have different main pictures, each hint applies only to the screen widths that show its picture.

A video's poster (the still picture shown before a video plays) counts as a picture here, so a page that opens with a video preloads its poster.

**When to change it:** Leave it on.
- Tip: If **Optimise images** or **Fix image loading priority** is off, no main picture is chosen and nothing is preloaded.
- Tip: The Status tab shows 'Preloaded the largest image' with the file name.

#### Collapse markup whitespace

*Default: Yes*

Makes the page's code smaller by removing indentation and HTML comments, without changing how the page normally looks.

Templates and page builders indent their code heavily so that people can read it. Browsers do not need that. This option collapses each run of spaces and line breaks in the page's text into a single space, and removes HTML comments.

Whitespace is never changed inside a tag, and never inside `pre`, `textarea`, `script` or `style` elements. A browser already shows a run of spaces as one, so the page looks the same.

**When to change it:** Leave it on, unless text that should keep its line breaks runs together with EasySpeed on.
- Tip: EasySpeed's own summary comment, set by **Append summary comment** on the [Advanced tab](https://joomlamax.com/documents/easyspeed/#settings-advanced), is added after this step, so it stays either way.
- **Watch out:** If your stylesheet tells an ordinary element to keep its line breaks (`white-space: pre` or `pre-line`), for example a box that shows an address exactly as typed, those line breaks are collapsed too. If you see that, switch this off.

#### Keep HTML comments

*Default: No* · *Appears when Collapse markup whitespace is Yes*

Leaves HTML comments in the page, while whitespace is still collapsed.

By default, **Collapse markup whitespace** also removes HTML comments, the notes in a page's code that visitors never see. Set this to Yes to keep them.

Conditional comments, which give instructions to old versions of Internet Explorer, are always kept, whatever this setting says.

**When to change it:** Set it to Yes if a tool or script you use looks for a comment in your page's code, or if you want to read your template's comments in the page source.

### Stylesheets tab

Stylesheets are the CSS files that hold your site's colours, fonts, spacing and layout. They are also the first thing a browser waits for: it will not draw a single pixel until it has every stylesheet in the page's head. Templates, page builders and extensions ship stylesheets written for every component they offer, while any one page uses only a handful, so most of what a visitor downloads is never used.

This tab is where EasySpeed cuts that down. It keeps only the rules your pages can use, merges them into one file, decides how that file reaches someone who has just arrived, and makes fonts and icon fonts lighter and steadier. Every switch here is on by default, and on most sites it should stay that way. Nothing on this tab works until **Mode** on the [Plugin tab](https://joomlamax.com/documents/easyspeed/#settings-plugin) is set to **Optimise**. A new install starts in **Diagnostics (measure only)**.

You will mostly come here for the two lists at the bottom, **Never remove these classes** and **Never touch these stylesheets**, if part of a page ever looks unstyled. If you store pages with **Cache pages**, saving a change here does not empty the store: visitors keep getting the stored copy while each page is rebuilt in the background. That holds while **Refresh stored pages in the background** on the [Cache tab](https://joomlamax.com/documents/easyspeed/#settings-cache) is on, as it is by default. With it off, a change that alters how pages are built empties the store.

#### The largest single saving on most pages

*Default: Not a setting (information note)*

An information box at the top of the tab that explains why stylesheets matter. There is nothing to switch.

Templates and page builders write their stylesheets to cover every component they offer, while any one page uses only a few of them. On a typical SP Page Builder page, for example, more than ninety per cent of the CSS a visitor downloads is never used. Yet all of it has to arrive and be read before anything appears on screen.

That is why the options below usually make the biggest single difference to how soon your pages appear.

#### Build a stylesheet per page

*Default: Yes*

Replaces all the stylesheets a page loads with one smaller file that holds only the rules the page can use. This removes the unused CSS that speed tests report.

EasySpeed reads every stylesheet from your own site that the page loads and works out which rules could style something on that page. It then merges what is left into one compact file, in the original order. Order matters: when two rules disagree, the later one usually wins, so keeping the order keeps your page looking exactly as before.

It is careful by design. A rule is one instruction, such as *make this button blue*, and it is removed only when the page clearly lacks what the rule needs. Anything EasySpeed is unsure about stays. A rule is kept whenever the element it styles is on the page, even if the classes around it are not, because scripts often add those after the page loads. Common state classes such as `active`, `open`, `show` and `collapse` are always kept, and so are Joomla's message classes and anything starting with `js-`, `is-` or `has-`. EasySpeed also remembers, from one visit to the next, the names a page hands to its scripts in its markup, so a popup that shows only on some visits keeps its styling on every visit.

Animations are kept while something still uses them, and your page's own style blocks count too. Font declarations are always kept: a browser only downloads a font when some text uses it, so an unused declaration costs only a few bytes. Addresses inside the CSS are rewritten so fonts and background pictures keep loading. If **Use WebP where accepted** on the [Images tab](https://joomlamax.com/documents/easyspeed/#settings-images) is on, JPEG and PNG background pictures named in the stylesheet are also sent as lighter WebP copies, at the same size, to browsers that accept WebP.

Some stylesheets are left exactly as they are: those on other domains (unless **Bundle stylesheets from other domains** on the [Diagnostics tab](https://joomlamax.com/documents/easyspeed/#settings-diagnostics) is on), those meant only for print or another medium, alternate and disabled ones, ones inside a noscript block, ones a script produces (an address such as `style.php`), and anything you list in **Never touch these stylesheets**.

**When to change it:** Leave it on. If a page looks wrong, use the two lists at the bottom of this tab instead of switching the whole feature off.
- Tip: To compare with the original, add `?easyspeed=off` to a page address, or `&easyspeed=off` if the address already has a `?`. That one request is served without EasySpeed.
- Tip: Check your pages while logged out, or in a private window. **Apply to** on the [Plugin tab](https://joomlamax.com/documents/easyspeed/#settings-plugin) is set to **Guests only** by default, so a logged-in visitor, administrators included, sees the original page.
- Tip: The [Status tab](https://joomlamax.com/documents/easyspeed/#settings-status) shows what EasySpeed did to the most recent page it built, including how many rules were kept. Under **Left alone on purpose** it lists every stylesheet it did not touch, with the reason.
- Tip: You never need to clear anything after editing a template stylesheet. The merged file is named after its content, so EasySpeed notices the change, builds a fresh file by itself, and no visitor gets an outdated copy.
- Tip: Most other options on this tab only appear while this one is **Yes**.
- **Watch out:** If part of the page looks unstyled only after a visitor uses it (a menu that opens, a popup, a slide that changes), a script added a class EasySpeed could not see. Add that class to **Never remove these classes**. If a whole extension looks wrong, add its stylesheet to **Never touch these stylesheets**.
- **Watch out:** Do not delete EasySpeed's cache folders by hand. Stored pages point at the stylesheet files inside them, and would show without styles until they are rebuilt. **Remove stylesheets no page uses** on the [Cache tab](https://joomlamax.com/documents/easyspeed/#settings-cache) removes old files safely for you.

#### Read class names from scripts

*Default: Yes* · *Appears when Build a stylesheet per page is Yes*

Reads the JavaScript your pages load to find the class names scripts add later, and keeps the rules that style them.

Many parts of a page change their look through classes that a script adds while the visitor uses them. A slider marks the current slide `active`, an off-canvas menu adds `open`, and a popup adds a class to become visible. None of these classes are in the page when it leaves your server. A tool that only read the page would throw their rules away, and the component would break as soon as someone used it.

EasySpeed reads every script file the page loads from your own site, and every script written into the page, following JavaScript's own rules so that nothing is misread. It collects each class name a script adds, removes, toggles, looks for or writes into markup. Other words found in scripts keep a rule only when everything else the rule asks for is known to exist. That way the ordinary words every script contains do not keep the whole stylesheet alive.

Each script file is read once and read again only when it changes, so this costs almost nothing.

**When to change it:** Leave it on. Each script is read once and remembered, so there is nothing to gain by turning it off.
- Tip: Scripts loaded from another domain, such as a CDN (a network that serves files for many sites), are not read. Neither are script files larger than 3 MB. If such a script adds classes, list them in **Never remove these classes**.
- **Watch out:** If you turn this off, sliders, off-canvas menus, popups, tabs and accordions can lose their styling as soon as a visitor uses them.

#### Bundle a stylesheet linked twice only once

*Default: Yes* · *Appears when Build a stylesheet per page is Yes*

When a page links the same stylesheet twice under slightly different addresses, its rules go into the merged file once instead of twice.

An extension's component and its module can each link the same file, each with its own version tag on the end, for example `common.css?v=6.2.6` and `common.css?6.2.6`. The browser then loads the same rules twice, and a merged stylesheet would carry them twice as well.

EasySpeed recognises a repeat by what the file contains and the folder it sits in, not by the text of its address, and bundles only the last copy. Keeping the last copy, not the first, leaves the cascade exactly as it was. (The cascade is the order that decides which rule wins.) On a directory site's front page this took the stylesheet from 761 KB to 637 KB, and the rules written into the page for its first screen from 411 KB to 331 KB.

A file whose meaning depends on where it stands, one that uses `@layer`, `@import` or `@namespace`, is always bundled as often as it is linked. Every copy left out is noted on the [Status tab](https://joomlamax.com/documents/easyspeed/#settings-status).

**When to change it:** Leave it on.
- Tip: This option handles stylesheet files. Style blocks repeated inside the page itself are handled by **Remove repeated style blocks** on the [Optimisation tab](https://joomlamax.com/documents/easyspeed/#settings-optimisation).

#### Give new visitors a page that needs no other file to appear

*Default: Yes*

For a visitor who has just arrived, writes the stylesheet and the head's blocking scripts into the page itself, so the page can appear as soon as it arrives.

A page cannot appear until its stylesheet and the scripts in its head have downloaded, and it waits for the slowest of them. On shared hosting one of them is often slow. Some visitors have just arrived: from a search engine, another site, a bookmark, a typed address, or a speed test such as PageSpeed Insights (Google's free speed test). For them, EasySpeed writes those files into the page, so there is nothing else to wait for.

Visitors clicking from page to page within your site still get the files, which their browser has already cached. Once the arriving page has finished loading and the browser is idle, it quietly fetches those files at the lowest priority, so the next page finds them ready. Stored pages keep the ordinary files and the change is made as each page is sent, so your page store does not grow.

Anything that could behave differently inside the page stays a file: a script that looks for its own address, a script with an integrity check, or a stylesheet with relative addresses inside it. A single file over 400 KB stays a file, and if everything together would come to more than 600 KB, nothing is written in. If your site sends a Content Security Policy (a security rule some sites use to block code written into the page), EasySpeed writes in only what that policy allows.

The scripts are written in even when **Build a stylesheet per page** is off. The stylesheet part needs that option, because only EasySpeed's own merged stylesheet is written in.

**When to change it:** Leave it on. It is what lets a first visit, and a PageSpeed Insights test, show your page without waiting for other files.
- Tip: To see what a new visitor gets, open a new browser tab and type the page's address. A click on a link within your own site gets the ordinary version.
- Tip: Your browser's developer tools show a response header named `X-EasySpeed-First-Visit`. It says what was done for that visit, such as how many files were written in.
- Tip: EasySpeed uses the standard `Vary` header to tell any cache in front of your site, such as a CDN, that arrivals and clicks within the site get different versions.
- Tip: Changing this setting does not rebuild your stored pages. It applies to the very next visitor.

#### Let the browser start drawing sooner

*Default: Yes* · *Appears when Give new visitors a page that needs no other file to appear is Yes*

For a visitor who has just arrived, moves the page's styles and blocking scripts from the head to the very start of the body, so the browser can start drawing sooner.

Chrome draws nothing until it has read the whole head of a page. With the stylesheet and scripts written into the page, that head is large. While Chrome waits, it sometimes starts a scrollbar animation of its own and then asks for no new frame until that animation ends a second later. The page appears after about two seconds instead of a third of a second, and PageSpeed Insights scores it in the fifties.

With this on, the styles and blocking scripts move to the start of the body, in the same order, so the head is only a few kilobytes. The page looks exactly the same, because the content still comes after its styles. Chrome is simply no longer stuck waiting when the animation starts.

Everything that search engines and link previews read stays in the head: metadata, the title, structured data and links that are not stylesheets. Scripts marked async, defer or module stay too, such as a Google Tag Manager snippet. The page's background colour is copied into the head as well, so the first frame of a dark site is not white.

The page is left as it is when one of its scripts writes into the page while it loads, or when a stylesheet in its head still has to be downloaded.

**When to change it:** Leave it on.
- Tip: It only acts when no stylesheet in the head is still a separate file. A stylesheet you listed in **Never touch these stylesheets**, or one from another site linked in the usual way, leaves the head as it is, so no browser shows content before its styles.
- Tip: Changing this setting does not rebuild your stored pages. It applies to the very next visitor.

#### On phones, show the page before its text fonts

*Default: Yes* · *Appears when Give new visitors a page that needs no other file to appear is Yes*

On a phone, for a visitor who has just arrived, applies the text fonts just after the page first appears instead of making the page wait for them.

PageSpeed Insights counts every font that finished downloading before a page first appeared as something the page waited for. On its test machines Google Fonts always finish first, so they count against your score.

With this on, text fonts wait on screens narrower than 768 pixels. That covers stylesheets from web font services (Google Fonts, Bunny Fonts, Adobe Fonts, Fontshare and CDNFonts) and web fonts declared in styles written into the page, which on a first visit includes EasySpeed's own stylesheet. They are switched on as soon as the page has first been drawn, or after three seconds at the latest. Text appears at once in a stand-in font, then changes to the real font a moment later. Measured side by side on PageSpeed Insights, one home page went from 80 to 94 on a phone.

Icon fonts, wider screens, browsers without JavaScript and visitors moving within your site get their fonts exactly as before. Nothing changes on a site whose security policy would block the small script that switches the fonts on.

**When to change it:** Turn it off only if your brand font must be the very first thing a phone shows, and you accept a lower PageSpeed Insights score for it.
- Tip: Leave **Keep text still when fonts arrive** on as well. It gives the stand-in the same width as your font, so nothing moves when the real font arrives.
- Tip: Changing this setting does not rebuild your stored pages. It applies to the very next visitor.
- **Watch out:** If **Keep text still when fonts arrive** is off, lines can wrap differently when the real font arrives, and the page may jump a little on phones.

#### On phones, show the page before icon fonts that cannot be cut down

*Default: Yes* · *Appears when Give new visitors a page that needs no other file to appear and On phones, show the page before its text fonts are both Yes*

Takes an icon font that is too big to cut down out of the stylesheet, so that on a phone it loads just after the page first appears.

Icon fonts are normally cut down to the icons a page uses (see **Send icon fonts with only the icons the page uses**). A font that only exists as WOFF2 cannot be cut down, and Font Awesome 7 ships nothing else. It therefore arrives whole: hundreds of kilobytes that a phone fetches before it can draw anything.

With this on, such a font (an icon font, recognised by a name such as Font Awesome, whose file on your server is 40 KB or more) is written beside the stylesheet instead of inside it. On a phone, for a visitor who has just arrived, it is applied once the page has first been drawn, just like text fonts, so the icons appear a moment after the page. On a directory page using Font Awesome 7 Pro, the simulated first paint (the moment anything first appears) went from 6.8 to 3.4 seconds.

On wider screens, and for visitors moving within your site, the icons load exactly as before.

**When to change it:** Turn it off if your phone layout relies on icon-only buttons and a moment without them bothers you more than the faster first paint.
- Tip: It works on EasySpeed's merged stylesheet, so **Build a stylesheet per page** must be on as well.
- **Watch out:** If buttons in your phone layout show only an icon, such as a menu or search button with no text, they will look empty for a moment after the page appears.

#### Let text show before fonts arrive

*Default: Yes* · *Appears when Build a stylesheet per page is Yes*

Shows text straight away in a stand-in font while a web font downloads, instead of hiding it.

A font declared with `font-display: block` hides the text that uses it for up to three seconds while the font downloads, and icon fonts in particular ship that way. EasySpeed rewrites it to `font-display: swap`. The text then shows at once in a stand-in font, and the real font takes over the moment it arrives.

The same applies to a font set to `auto`, which browsers treat much like block, and to one that sets nothing at all. A choice the author made on purpose (`swap`, `fallback` or `optional`) is left alone. This applies to the fonts declared in the stylesheets EasySpeed merges.

**When to change it:** Leave it on.
- Tip: With **Keep text still when fonts arrive** on as well, the stand-in takes up exactly the same room as the real font, so the swap only changes the letter shapes.

#### Keep text still when fonts arrive

*Default: Yes*

Gives the stand-in font shown before your web font arrives the same width as the web font, so lines do not re-wrap and the page does not jump.

Until a web font downloads, text is drawn in a font already on the visitor's device, such as Arial, which is usually a different width. When the real font lands, lines wrap again and everything below them moves. That movement is called layout shift, and it is measured by CLS (Cumulative Layout Shift), one of Google's Core Web Vitals. It costs you score and it annoys readers.

EasySpeed creates a stand-in that draws with a local font but is scaled to your web font's width and line height, so both lay out exactly the same lines. Italic text gets a stand-in of its own. Several local fonts are named, so a match is found on Windows, Mac, Android and Linux alike. What visitors finally see does not change.

For Google Fonts families, the measurements come from a table built into the plugin, and that includes a Google font your template keeps in its own folder. Any other font is measured from its file on your server. Nothing is fetched from anywhere, and visitors download nothing extra. It works in the merged stylesheet and in the style blocks inside the page, where Helix Ultimate and SP Page Builder write their typography, even when **Build a stylesheet per page** is off.

**When to change it:** Leave it on.
- Tip: A stand-in is added for text fonts that fall back to a sans-serif or serif font, which covers nearly every site. Fonts that fall back to a monospace, handwriting or decorative family are left alone, and so are icon fonts.

#### Lay text out at the fonts' true widths

*Default: Yes* · *Appears when Keep text still when fonts arrive is Yes*

Asks browsers to lay text out at each font's real width, so the stand-in and the web font match everywhere, including where PageSpeed Insights runs its tests.

Some systems round every letter to the pixel grid when they lay out text. This is called hinting, and it makes a font a few per cent wider than its real width. PageSpeed Insights runs on one of these systems. There the web font no longer matches its stand-in, lines wrap differently when it arrives, and the page jumps in the test while it stays still for your visitors.

This option adds one small rule to pages that use a matched stand-in, asking the browser to use each font's true width. The test then measures what your visitors actually see. Letters may look very slightly softer on Windows and on Linux set to full hinting. On Mac, iPhone and Android nothing changes.

**When to change it:** Leave it on, unless text on Windows looks too soft to you and you do not mind the test reporting a shift that real visitors never get.
- **Watch out:** If you turn this off, PageSpeed Insights may report a layout shift from your fonts that your visitors never see.

#### Send icon fonts with only the icons the page uses

*Default: Yes* · *Appears when Build a stylesheet per page is Yes*

Makes a small copy of each icon font holding just the icons your page's stylesheet names, typically 2 KB instead of 200 KB.

An icon font such as Font Awesome holds a thousand or more icons, while a page usually shows a dozen. Yet the whole font is downloaded, at the highest priority, before the page appears.

Once the unused rules are gone, EasySpeed knows exactly which icons the remaining rules draw. It writes a small font with just those icons, on your own server, and the browser uses it for those icons. The full font stays declared for every other icon, so an icon that a script adds later still appears; the browser fetches the full font only when that happens. No icon can go missing.

This works with icon fonts that ship a TrueType (.ttf) or WOFF file, as Font Awesome in Joomla and SP Page Builder both do. A font that only exists as WOFF2 cannot be cut down. **On phones, show the page before icon fonts that cannot be cut down** takes care of those.

**When to change it:** Leave it on.
- Tip: The [Status tab](https://joomlamax.com/documents/easyspeed/#settings-status) shows a line such as *Cut icon fonts down to the icons the page uses*, with the size before and after.
- Tip: If two complete copies of Font Awesome load on the same page, **Remove the duplicate icon font** on the [Optimisation tab](https://joomlamax.com/documents/easyspeed/#settings-optimisation) can drop Joomla's extra copy.

#### One stylesheet for all pages

*Default: Yes* · *Appears when Build a stylesheet per page is Yes*

Cuts the stylesheet down to what your site's pages use together, so pages share one file instead of each getting its own.

When the stylesheet is cut one page at a time, every page gets a stylesheet of its own. A visitor then downloads a new stylesheet on every click, and the disk holds one file per page. One site had 7,000 of them.

With this on, each page EasySpeed builds adds what it uses to a shared list, and the stylesheet is cut to that list. Pages share one file, which a visitor's browser keeps from one page to the next. On one site the shared stylesheet was about a fifth larger than a single page's, and it scored the same on PageSpeed Insights.

When a page uses something no earlier page did, EasySpeed makes a new edition, which every page built afterwards shares. Pages built earlier keep their edition until they are next rebuilt, and each edition holds everything its own pages need. Only names that a stylesheet actually uses are remembered, so text pasted into an article does not start new editions.

**When to change it:** Leave it on. Turn it off only if you want the smallest possible stylesheet for each page and do not mind a new download on every click and many more files on disk.
- Tip: Changing this setting does not empty or rebuild your stored pages. They are correct either way, and each one switches over when it is next rebuilt.
- Tip: Old stylesheet files are removed automatically by **Remove stylesheets no page uses** on the [Cache tab](https://joomlamax.com/documents/easyspeed/#settings-cache).

#### Share it among pages of the same kind

*Default: Yes* · *Appears when Build a stylesheet per page and One stylesheet for all pages are both Yes*

Pages that load the same set of stylesheets share one file cut to what pages of that kind use, instead of one list for the whole site.

A kind of page is simply a group of pages that load the same stylesheets, such as your front page, your articles, or your product or business pages. The order of the stylesheets and the version numbers on their addresses do not count, so an extension update keeps what EasySpeed has learned.

Pages that load different stylesheets never shared a file anyway, because the file is made from those stylesheets. So nothing is downloaded more often, and each file is simply smaller. On a directory site the front page's stylesheet was 23% smaller this way (804 KB instead of 1,046 KB). Something new on one kind of page also no longer makes every other kind write its stylesheet again.

**When to change it:** Leave it on. Switch it off to go back to one list for the whole site.
- Tip: Changing this setting does not empty or rebuild your stored pages.

#### Draw a first visit before a large stylesheet arrives

*Default: Yes* · *Appears when Build a stylesheet per page is Yes*

For a first visit to a page whose stylesheet is too big to write into the page, sends the rules for the top of the page straight away and the rest of the stylesheet at the end. Speed tools call these rules critical CSS.

A browser draws nothing until it has every stylesheet in the head. A stylesheet up to 400 KB is written into the page for a first visit anyway. With a larger one, a first visit gets the rules the top of the page needs (often called critical CSS) written into the page, and the rest of the stylesheet comes at the end of the body. The page is drawn while the rest is still on its way.

EasySpeed takes the top of the page generously. It reads from the start of the page until it has passed a good screenful of content and your main picture, then carries on to the end of that section, so a row of columns is never cut in two. Scripts still wait for the whole stylesheet, so sliders and menus measure the finished page, and the page's own style blocks still come after it. The next pages are sent as before and find the stylesheet already in the browser's cache.

On a directory site with a 760 KB stylesheet, over a slow phone connection, the page appeared after 1.2 seconds instead of 3.1. Its largest picture appeared after 1.6 seconds instead of 3.1, and nothing on the screen jumped. PageSpeed Insights, which simulates the whole page downloading first, scored it one point higher, so most of the gain goes to real visitors.

A page is sent as it is when a script near the top measures the layout while the page loads, when the first screen needs most of the stylesheet anyway (over 70%), when the stylesheet imports another file, or when the site's security policy accepts only signed style blocks. It is also left alone in a few rarer cases where the result could look different.

**When to change it:** Leave it on. While **Give new visitors a page that needs no other file to appear** is on, it has nothing to do on a site whose stylesheets stay under 400 KB.
- Tip: If you switch **Give new visitors a page that needs no other file to appear** off, this option works on stylesheets of every size.
- Tip: The [Status tab](https://joomlamax.com/documents/easyspeed/#settings-status) says whether the first screen's rules were prepared for a page, or why the page was left as it is.
- Tip: If something at the top of a first visit looks different for a moment and then settles, add the class it needs to **Never remove these classes**. That list is honoured here too.

#### Only the rules the first screen draws with

*Default: Yes* · *Appears when Build a stylesheet per page and Draw a first visit before a large stylesheet arrives are both Yes*

Reads the first screen's rules strictly, so much less CSS is written into a first visit.

For the whole stylesheet, EasySpeed is generous: it keeps a rule whenever the element it styles is on the page. For the first screen that keeps far too much, such as a rule for every button inside a wrapper the page does not even have.

In the exact reading, a rule is kept only when every part of its selector is in the top of the page, not just the element it styles. (The selector is the part of a rule that says which elements it applies to.) Rules that need a pointer or focus, such as hover effects, are left for the rest of the stylesheet. Some scripts run before the page is drawn and give it classes of their own, for example a script that marks the page as having JavaScript. Those classes are read from the scripts and kept.

On a directory site, twenty sampled pages needed a median of 85 KB of rules instead of 362 KB. The front page reached the phone 51 KB lighter, and a throttled phone drew it 0.36 seconds sooner. Before the rest of the stylesheet arrived it looked the same to the pixel at four screen widths, both there and on five other sites tested.

Two kinds of page keep the earlier, generous reading. One is a page whose head runs a script file from another site, which cannot be read. The other is a page with a script that builds the page's classes as it runs, such as Modernizr. Nothing is ever lost: every other rule arrives with the rest of the stylesheet a moment later.

**When to change it:** Leave it on. Turn it off if the top of a first visit looks different for a split second before settling, such as a menu that shows open and then closes, and tell JoomlaMax support about the page.
- Tip: Classes in **Never remove these classes** are honoured in both readings.

#### Hold transitions while the rest of the stylesheet is applied

*Default: Yes* · *Appears when Build a stylesheet per page and Draw a first visit before a large stylesheet arrives are both Yes*

When the rest of a first visit's stylesheet arrives, stops dozens of elements from starting an animation at the same moment.

A transition is a short animation from one look to another, used for hover effects, menus and fades. When the rest of the stylesheet arrives at the end of a first visit, everything the first screen was drawn with takes on its final look at once, and every element with a transition animates the change. On a directory listing that meant over a hundred transitions starting together: about 300 ms of work on a throttled phone, during which the page could not respond.

With this on, a small script holds back new transitions while the stylesheet is applied and releases them straight after, before the page's own scripts run. No transitions start, and the page's blocking time on a throttled phone (how long it was too busy to respond) fell from 454 to 276 ms. Hover effects, menus and sliders animate as before.

A transition that is already running, or one a slider sets on its own track, is left to finish. Visitors without JavaScript are not affected, and the hold ends by itself after 15 seconds if the stylesheet takes that long. PageSpeed Insights' simulation does not count this work, so its score does not change. The gain is for real visitors.

**When to change it:** Leave it on.
- Tip: It only acts on first visits that get the first screen's rules from **Draw a first visit before a large stylesheet arrives**, and only where the site's security policy allows small scripts written into the page.
- Tip: Changing this setting does not rebuild your stored pages. It applies to the very next visitor.

#### Never remove these classes

*Default: Empty* · *Appears when Build a stylesheet per page is Yes*

Class names whose rules EasySpeed must always keep, even when it cannot see them on the page.

Write one class name per line. End a line with an asterisk to protect a whole family of classes that start the same way: `swiper-*` keeps every class beginning with `swiper-`.

Use it when a component adds classes in a way EasySpeed cannot see, for example from a script on another site, and part of the page looks unstyled only after a visitor uses it. The list is honoured everywhere: in each page's stylesheet, in the shared stylesheet and in the first screen's rules.

Many classes are already kept for you. These include common states such as `active`, `open`, `show`, `fade`, `collapse`, `disabled`, `selected` and `sticky`, Joomla's message classes, and anything starting with `js-`, `is-` or `has-`. **Read class names from scripts** finds the classes that scripts on your own site add.

**When to change it:** Add a class when a part of the page loses its styling only after a visitor interacts with it. Otherwise leave it empty.

**Example:** `menu-open` on one line keeps the rules for that one class. `swiper-*` on the next line keeps every class that starts with swiper-.
- Tip: Write the class name without the dot in front: `menu-open`, not `.menu-open`. Names must match exactly, including capitals.
- Tip: To find the class, make the problem happen on the page (open the menu, for example), then right-click the element, choose *Inspect*, and look for the class that appears when it opens.
- Tip: Lines starting with `#` are ignored, so you can leave yourself a note about which extension needs a line.
- Tip: This list protects class names only. To keep a whole stylesheet exactly as it is, use **Never touch these stylesheets**.
- Tip: If you store pages, they are rebuilt in the background with the new list after you save.
- **Watch out:** A very short prefix, such as `s*`, keeps every rule whose class starts with that letter and can make the stylesheet much larger.

#### Never touch these stylesheets

*Default: Empty* · *Appears when Build a stylesheet per page is Yes*

Stylesheets listed here are left exactly as they are: not cut down, not merged and not moved.

Write one entry per line. A plain entry matches any stylesheet address that contains that text, whatever the capitals. An entry that starts and ends with a forward slash is read as a regular expression, a pattern for matching text, for those who know how to write them.

Use it as a last resort, when an extension still looks wrong after you have tried **Never remove these classes**. An excluded stylesheet is listed on the [Status tab](https://joomlamax.com/documents/easyspeed/#settings-status) under **Left alone on purpose**, with the reason *listed in the exclusions*.

**When to change it:** Only when an extension still looks wrong after you have tried Never remove these classes. Otherwise leave it empty.

**Example:** `media/com_example/` leaves every stylesheet in that extension's media folder alone. `/custom-[0-9]+\.css/` is a regular expression that matches custom-1.css, custom-2.css and so on.
- Tip: Use part of the address without your domain, such as `media/com_example/css/`. To find the address, add `?easyspeed=off` to the page address, open the page and look at its source.
- Tip: Lines starting with `#` are ignored.
- Tip: Extension developers can leave a single stylesheet alone without this list, by giving its link the attribute `data-easyspeed-skip`.
- **Watch out:** Do not start and end a plain entry with a slash. `/media/com_example/` is read as a regular expression, and as one it matches nothing. Write `media/com_example/` instead.
- **Watch out:** Every excluded stylesheet stays a separate file that the browser must download before it can draw the page. On first visits it also stops **Let the browser start drawing sooner** from working.
- **Watch out:** The merged stylesheet takes the place of the first stylesheet it replaces, while an excluded one stays where it was. If the excluded file sat between others, rules that used to come after it now come before it, and a few styles may change. If that happens, exclude the stylesheets that follow it as well.

### Images tab

The Images tab makes your pictures lighter without touching the originals. EasySpeed makes smaller copies of each large photo (called *renditions*), writes them in modern formats such as WebP and, where your server can, AVIF, and lets each visitor's browser pick the copy that fits its screen. It also looks after self-playing background videos, so the page shows a still picture first instead of waiting for the film.

At the top of the tab sits the image panel, with the **Prepare all images** and **Make posters** buttons. Below it, a note headed *Usually the largest saving on a content site* explains why this matters. A photo straight from a camera or a stock library is often two or three thousand pixels wide, and is then shown in a column a few hundred pixels across. The visitor downloads all of it, and the browser throws most of it away. Image work needs PHP's GD extension. The **Image toolchain** line on the [Status tab](https://joomlamax.com/documents/easyspeed/#settings-status) shows whether your server has it.

Come here once after installing, to press **Prepare all images**. Come back whenever you add or replace a background video, to press **Make posters**, and if you want to try AVIF. Everything else works well on its defaults.

The image panel sits at the top of the Images tab while **Offer smaller renditions** is Yes. It has three parts: **Prepare every image now**, **Controls** and **Background videos**.

**Prepare every image now** explains why the button exists. During normal browsing EasySpeed makes only a couple of copies per page view. For a while, a page is only partly optimised, and a speed test that arrives then measures whatever it finds. Running the work here removes that period. A small line underneath lists the output formats your server can write (for example webp, jpeg, png), how many images EasySpeed has seen on your pages so far, and which media folders it searches. If your server lacks the GD extension, the box says *Image processing is unavailable* instead.

The progress bar shows how far a run has got and which file it is working on. Four tiles keep count. **Processed** is the pictures done, out of the total. **Renditions written** is the new files made. **Skipped** is files that had gone or could not be read as a picture. **Failed** is pictures no copy could be made of, for example because a picture is too large to open in the memory PHP is allowed; each is tried again after a week. A line under the tiles says where the queued pictures came from: seen on your pages, found in the media folders, or found in the folders you named.

**Prepare all images** finds every picture worth preparing: those seen on your pages, those in Joomla's media folders and those in the folders you added. It makes every width in every format visitors may need. That means WebP, the original format for older browsers, and AVIF when it is switched on and your server passed the test. The heaviest pictures go first, up to 4,000 per run. The work runs in short batches and saves its position after each one. Keep the tab open while it runs. If you close it, the run pauses and carries on by itself the next time you open the Images tab.

When a run has made new files, stored pages are rebuilt in the background to use them, and visitors get the earlier copy until then. If **Refresh stored pages in the background** or **Cache pages** is off, stored pages are cleared instead. A line in the panel says which happened.

**Stop** pauses the run and keeps everything made so far. Press **Prepare all images** again to carry on. Pictures that are already done are passed over quickly.

**Delete and rebuild** asks you to confirm. It then removes every file EasySpeed has made in its image folder, including every video poster, empties the page store, and starts preparing again from scratch. Reach for it after changing **Encoder quality** or **Widths to offer** if you want the old files gone. Afterwards, press **Make posters** again. Expect the first visitors to each page to wait while the page store fills itself again.

**Background videos** lists the self-playing background videos seen on the pages built so far: how many still lack a poster, and how many posters have been made. **Make posters** plays each video that lacks one in your browser. It looks through the first three seconds for the clearest frame with a picture on it (many clips open on black) and sends that frame to your site, which saves it as WebP and JPEG. The pages that play the video are then rebuilt with their poster. The status line reports each video in turn, then says how many posters were made and names any that could not be, for example when this browser cannot play the file. The button is greyed out when every video has a poster. If the box says some posters were made by an older version, press the button again so those videos start from the frame their poster shows.

#### Offer smaller renditions

*Default: Yes*

Makes smaller copies of each large picture on your pages and lets the browser pick the size that suits its screen.

With this on, EasySpeed makes copies of each JPEG, PNG or WebP picture on your pages at the widths listed under **Widths to offer**. It adds that list of copies to the picture's tag (the `srcset` attribute). A phone then downloads a copy that fits its screen instead of the full-size original.

Your page keeps its structure. EasySpeed never wraps a picture in a new element, because that would change which element holds it and could break your template's styling. Your original files are never changed: the copies live in EasySpeed's own folder, are made once and are kept.

The work is spread out so that nobody waits for it: a couple of copies per page view, heaviest pictures first. A page is complete after a handful of views. To do it all in one go, press **Prepare all images** in the panel at the top of this tab.

A copy is never wider than the original, and it is only offered when it weighs less. When the largest copy is lighter than the original, the picture's main address points to it too, so browsers that ignore the list of copies still save.

**When to change it:** Leave it on. Switch it off only for a moment, to rule it out while you look into a picture that displays wrongly.
- Tip: Leave this on. On a site with photos it is usually the biggest single saving.
- Tip: Some pictures are left alone on purpose: pictures on another domain (a CDN address counts), SVG and GIF files, small files (under about 12 KB), pictures that already come with their own list of sizes, and pictures whose address a script fills in later.
- Tip: To keep one picture exactly as it is, add the attribute `data-easyspeed-skip` to its image tag.
- Tip: If you replace a picture with a new file, EasySpeed notices by itself and makes new copies from the new file.
- Tip: If a picture has neither a width nor a height, EasySpeed adds the original's size so it stays drawn as it was, unless your stylesheet already sizes it. A width or height you set yourself is never changed.
- Tip: The image panel at the top of this tab, with **Prepare all images** and **Make posters**, only shows while this is Yes.
- **Watch out:** This needs PHP's GD extension. Without it nothing is resized, and the panel at the top of this tab says *Image processing is unavailable*. Ask your host to enable GD. Everything else EasySpeed does keeps working.

#### Use WebP where accepted

*Default: Yes* · *Appears when Offer smaller renditions is Yes.*

Writes the smaller copies as WebP, a modern picture format, for every browser that can show it.

A WebP picture is typically a third of the size of the same picture as a JPEG, and a fraction of it as a PNG. EasySpeed decides for each visitor. Browsers that show WebP get WebP, and older ones get the original format, so nobody receives a picture they cannot display.

The choice is made from what the browser says it accepts. EasySpeed also recognises the versions of Firefox and Safari that show WebP without saying so. Because the page now depends on the browser, the response says so (the `Vary` header). The page store keeps one copy of a page for WebP browsers and one for the rest, which is why one address can appear twice on the [Cache tab](https://joomlamax.com/documents/easyspeed/#settings-cache).

JPEG and PNG background pictures named in your stylesheets, such as section backgrounds, are converted to WebP too. They keep their original size. This happens while **Build a stylesheet per page** is on ([Stylesheets tab](https://joomlamax.com/documents/easyspeed/#settings-stylesheets)).

With this off, the smaller copies are still made, each in its picture's own format, and the AVIF switch is hidden.

**When to change it:** Leave it on. Switch it off only if you must serve every picture in its original format.
- Tip: Leave it on. Every current browser shows WebP.
- Tip: WebP keeps transparency exactly, so logos on a transparent background stay crisp.

#### Use AVIF where accepted

*Default: No* · *Appears when Offer smaller renditions and Use WebP where accepted are both Yes.*

Also makes AVIF copies, an even newer format, and gives browsers that show AVIF whichever file is smaller.

AVIF often packs a photograph smaller than WebP. With this on, EasySpeed makes AVIF copies as well. At each width it offers whichever of the AVIF and WebP files is smaller, so a page is never heavier than with WebP alone. Measured on three sites, photographs came out 10 to 25% smaller.

AVIF goes to browsers that show it: Chrome, Edge from version 121, Firefox from 113, Safari from 16.4 and iPhones from iOS 16. Every other browser gets WebP as before. Until a page's AVIF copy is ready, its WebP copy is served, so nobody waits.

Pictures with transparency stay WebP, which keeps their edges exact. So does any copy over 2 million pixels, such as the full-size copy of a large photo, because writing it would take too much memory.

Writing AVIF takes the server about four times the work of WebP. It is done a few pictures at a time, in the background and by **Prepare all images**. It needs PHP 8.1 or newer, with GD built with AVIF support, and a web server that sends `.avif` files as `image/avif`.

**When to change it:** Try it if your server passes the test and your site is heavy on photographs. Leave it off on a busy shared host where server time is tight.
- Tip: Your server is tested each time you open these settings. A green line under the switch starting with *Available* says what was found. A red line starting with *Not available on this server* says why not, and the switch stays off.
- Tip: Common reasons, with the fix: PHP older than 8.1 (ask your host for a newer PHP); GD built without AVIF support (your host can add it); the web server blocks `.avif` files or sends them with the wrong type (ask your host to add the `image/avif` type; nginx has it from version 1.21.4).
- Tip: EasySpeed tells Apache and IIS the right file type for its own image folder by itself, so on many hosts nothing needs doing.
- Tip: Expect little change in PageSpeed Insights scores. The gain is lighter pictures, and less data, for your visitors.
- Tip: While **Refresh stored pages in the background** is on (the default, [Cache tab](https://joomlamax.com/documents/easyspeed/#settings-cache)), switching AVIF on or off does not empty the page store. Stored pages are rebuilt in the background with the new format.
- **Watch out:** If Joomla's *System - Page Cache* plugin is on, a warning appears under the switch. That plugin gives every browser the copy of a page it stored first, so a browser without AVIF could get pictures it cannot show. Switch that plugin off: EasySpeed stores pages itself, one copy per picture format.
- **Watch out:** With AVIF on, the store can hold a third copy of each page (one for AVIF browsers), and the image folder holds AVIF files as well, so disk use grows.

#### Give background videos a poster

*Default: Yes*

Gives each self-playing background video a still picture (a poster) to show first, so the page paints before the video arrives.

A background video plays by itself, without sound, behind a section, the way templates and page builders write them. On a phone it is often the first thing painted. Without a poster, PageSpeed Insights counts the whole video file before the page is painted. A 2.9 MB clip made one home page's LCP (Largest Contentful Paint, the moment the biggest thing on the screen appears) 13 to 15 seconds, and a poster brought it to 6.

Your server cannot read a frame out of a video, but your browser can. So posters are made once, in your browser, with the **Make posters** button in the panel at the top of this tab. EasySpeed then rebuilds the pages that play each video with its poster, and fetches the poster first when the video opens the page. The video itself plays exactly as before.

Videos that already have a poster are left as they are. A page builder such as SP Page Builder may hold a poster back for lazy loading. When it does, the poster of the page's first background video is put in place straight away, so the first screen is never empty.

**When to change it:** Leave it on. It costs nothing on pages without a background video.
- Tip: Press **Make posters** once after installing, and again whenever you add or replace a background video. A replaced file counts as a new video.
- Tip: A video joins the list in the panel once a page that plays it has been built. If the panel says no background video has been seen yet, open the page with the video and come back.
- Tip: Posters are saved as both WebP and JPEG, so every browser gets one it can show.
- Tip: Only video files on your own site get a poster. Videos on another domain, and YouTube or Vimeo embeds, are left alone.
- **Watch out:** The **Make posters** button sits in the image panel, which disappears when **Offer smaller renditions** is No. Switch that back on to make posters.
- **Watch out:** **Delete and rebuild** in the image panel removes posters too. Press **Make posters** again afterwards.

#### Start background videos after their poster

*Default: Yes*

Holds a background video back until its poster is on screen and the page has loaded, so the video does not compete with the page for the connection.

A self-playing video is normally fetched as soon as the page is read, together with the stylesheets, scripts and the poster. On one site, visitors' phones took 0.7 to 0.8 seconds longer to show the first section after a 2.9 MB video was added to it. PageSpeed Insights does not show this, because it leaves video files out.

With this on, the poster is painted first. The video starts once the page has loaded, or three seconds after the poster appears if loading takes longer, and only when the video is on or near the screen. On a slow connection it waits longer, so the film does not hold back the rest of the page. A video further down the page is not fetched until the visitor scrolls towards it.

Where EasySpeed made the poster, the video starts at the frame the poster shows, so the change from picture to film cannot be seen. Visitors without JavaScript see the poster.

**When to change it:** Leave it on. Switch it off only if a video must start the very instant the page opens.
- Tip: Only videos with a poster are held, so make posters first.
- Tip: Videos with player controls are left alone, and so are videos run by a player library such as Video.js, Plyr, MediaElement, JW Player or UIkit's video component.
- Tip: When a slider makes copies of a held video, the copies are held and started the same way.
- Tip: If a browser refuses to play a video, the poster simply stays.
- Tip: If your site sends a strict security policy (a Content Security Policy) that blocks inline scripts, EasySpeed leaves the videos to play as before, because the small script that starts them could not run.
- Tip: Videos with their own player are left to it: videos with controls, and the ones YOOtheme Pro's UIkit plays itself (`uk-video`), which already wait until they are in view.

#### Poster only for visitors who ask for less

*Default: Yes* · *Appears when Start background videos after their poster is Yes.*

Visitors who have asked their device for less motion or less data see the poster and no video.

This respects three wishes a visitor can set: reduced motion (an accessibility setting on phones and computers), Data Saver, and a 2G connection. These visitors see the poster, and the video file is never downloaded for them.

Switch this off to play the video for them as well.

**When to change it:** Switch it off only if the video carries information every visitor must see.
- Tip: Leave it on. It is kind to visitors with motion sensitivity and to those on expensive or slow data.

#### Poster only on phones

*Default: No* · *Appears when Start background videos after their poster is Yes.*

Screens narrower than 768 pixels show the poster and never download the video.

With this on, each phone visitor is spared the whole video file. Wider screens play the video as usual.

It stays off until you switch it on, because it changes what phone visitors see.

**When to change it:** Switch it on if your background video is purely decorative and you want phone visitors to get the page faster and use less data.
- Tip: A good choice when the video is decoration and most of your visitors are on phones.
- Tip: Only videos with a poster are affected, so make posters first.

#### Widths to offer

*Default: 400,800,1200,1600* · *Appears when Offer smaller renditions is Yes.*

The list of widths, in pixels, at which smaller copies of each picture are made.

Write the widths in pixels, separated by commas. A copy is never made wider than the original, and a width within a fifth of the one before it is skipped. The full size is always offered as well.

The browser picks from this list using the **Sizes hint** and the sharpness of its screen. A phone with a sharp screen needs a copy wider than the screen itself, which is why the list goes well beyond phone widths.

Widths from 64 to 5000 are used, and anything else is ignored. An empty or unusable list falls back to the default.

**When to change it:** Leave the default unless you know your layout well. Add a step if many of your pictures sit in slots that fall between two existing widths.

**Example:** `400,640,800,1200,1600` - adds a 640 step, so a screen that needs a little over 600 pixels gets a closer copy instead of the 800 one.
- Tip: More steps give each screen a closer fit, but they mean more files and more work for your server.
- Tip: After changing the list, press **Prepare all images** to make the new widths at once. Stored pages are rebuilt in the background to use them.
- **Watch out:** Copies at widths you removed stay on disk. **Delete and rebuild** in the image panel clears them, but it also empties the page store and removes video posters.

#### Sizes hint

*Default: 100vw* · *Appears when Offer smaller renditions is Yes.*

Tells the browser how wide your pictures will be drawn, so it can choose the right copy.

The browser has to choose a copy before it has laid out the page, so it relies on this hint. EasySpeed cannot know your layout, so the default of 100vw (the full width of the browser window) errs towards a larger copy. The browser may fetch more than it strictly needs, but the picture is never blurry.

The value uses the standard format: a condition in brackets followed by a width, then a final width for everything else. 50vw means half the window.

For some pictures, EasySpeed knows better and uses that instead. When your stylesheet puts a fixed pixel limit on the box around a picture, that width is passed on for that picture (see **Tell the browser how much room an image has** on the [Optimisation tab](https://joomlamax.com/documents/easyspeed/#settings-optimisation)).

**When to change it:** Change it if most of your pictures sit in a column narrower than the screen and you know how wide that column is.

**Example:** `(max-width: 767px) 100vw, 50vw` - full width on phones, half the window on larger screens. Suits a site whose content column takes half the screen.
- Tip: When in doubt, keep 100vw.
- **Watch out:** A hint smaller than your real layout makes the browser fetch a copy that is too small, and pictures look blurry. The value applies to every picture EasySpeed handles, so check pages with full-width banners as well as your articles.

#### Encoder quality

*Default: 82* · *Appears when Offer smaller renditions is Yes.*

How much detail the smaller copies keep: higher is sharper and heavier.

Higher keeps more detail and costs more bytes. 82 is a good balance for photographs.

Values from 40 to 100 are accepted. AVIF copies are written at a matching quality automatically, so one number serves every format.

Changing this makes every copy again. New copies are made as pages are viewed, or all at once with **Prepare all images**, and stored pages are rebuilt in the background to use them.

**When to change it:** Leave 82 unless you see blotches in your photos (raise it) or want lighter pictures and can accept a little softness (lower it).
- Tip: If you lower it, look closely at a few large photos before you settle on the new value.
- **Watch out:** Copies made at the earlier quality stay on disk. **Delete and rebuild** in the image panel clears them, but it also empties the page store and removes video posters.

#### Also look in these folders

*Default: Empty* · *Appears when Offer smaller renditions is Yes.*

Extra folders for Prepare all images to search, for pictures kept outside Joomla's media folders.

Write one folder per line, starting from your site's root. Joomla's own media folders are always included: the images folder and any folder set in the Media Manager's options. So is every picture EasySpeed has already seen on a page. You only need this list for pictures kept somewhere unusual.

Only **Prepare all images** uses this list. During normal page views, EasySpeed handles whatever pictures a page shows, wherever they are on your site.

Folders outside your site are ignored. Subfolders named cache, tmp, thumbs or thumbnails are skipped, and so are hidden folders. Lines starting with # are ignored.

**When to change it:** Fill it in if a gallery, shop or other extension keeps pictures in its own folder and you want them prepared before visitors arrive.

**Example:** `files/gallery` - a folder named gallery inside a folder named files at the top of your site.
- Tip: Most sites leave this empty.

#### Images to produce per page load

*Default: 2* · *Appears when Offer smaller renditions is Yes.*

A limit on how many picture copies one page view may make, so no visitor waits long for image work.

This keeps image work from ever making a page slow to answer. A page is complete after a handful of views, and after that it costs nothing.

Values from 0 to 20 are accepted. With 0, ordinary page views make no copies at all. **Prepare all images** still makes them, and so do the pages EasySpeed builds for its own page store. Those may make more copies at once, so stored pages come out complete.

**When to change it:** Leave 2. Set 0 on a very busy or slow server if you prefer to prepare every picture from the back end.
- Tip: Rather than raising this, press **Prepare all images** once. It does the same work in the back end, where nobody is waiting.
- **Watch out:** A higher number makes a visitor wait longer when they arrive while copies for their page are still being made.

### Cache tab

The Cache tab switches on EasySpeed's page cache, called the page store on this page. Each finished, optimised page is kept, and the next visitor gets the stored copy straight away instead of waiting for Joomla to build the page again. For most sites it cuts the time your server takes to answer more than anything else EasySpeed does.

The store looks after itself. It fills itself from your sitemap, a page at a time, carried on visitors' requests after their own page has been sent. It clears exactly the pages an edit affects and rebuilds them. After an update or most settings changes, it rebuilds stored pages in the background while visitors keep getting the stored copy. This automatic work needs a server that can keep working after it has answered; the **Refresh behind the visitor** line on the [Status tab](https://joomlamax.com/documents/easyspeed/#settings-status) tells you whether yours can.

Page caching works only while **Mode** is *Optimise* ([Plugin tab](https://joomlamax.com/documents/easyspeed/#settings-plugin)), and only for guests. Logged-in visitors, including you, always get a page built for them. Come here to switch caching on, to name your sitemap if the panel says none was found, to keep particular addresses out of the store, and to see how full the store is.

The panel appears at the bottom of the Cache tab while **Cache pages** is Yes. It has two boxes: **Cached pages**, and a red **Remove everything** box. Nothing in it needs pressing for the store to work. It shows you what is stored and lets you deal with a single page.

Four tiles sum up the store. **Pages stored** counts the addresses served without building; an address stored in two picture formats counts once. **Cleared by an edit** counts pages waiting to be built again after an edit or a Rebuild you pressed; they go before everything else. **Disk used** is the space taken by stored pages and their stylesheets, with each shown separately underneath once the next tidy-up has measured the stylesheets. **Still to store** counts sitemap pages that are not stored yet, or were cleared by an edit.

The bar under the tiles counts towards your own sitemap: how many of its pages are ready, plus any other pages visitors opened. Without a sitemap, it shows how many pages are stored and how many are still to visit. The line below names the source: the sitemap you named or the one your site publishes, and how many pages it lists. If nothing could be read, it says so and explains that EasySpeed is following your site's own links instead.

An update or a settings change can leave stored pages built the earlier way. Another line then says how many are being rebuilt in the background and how many are done. Visitors get the stored copy until each is replaced. If some could not be rebuilt, the line gives the reason. When the reason mentions Cloudflare, allow your server's IP address in Cloudflare (Security, WAF, Tools, IP Access Rules). Until then those pages stay as the earlier version built them.

A short note explains that all this happens on its own, a page at a time, carried on visitors' requests after their page has been sent, and that clearing Joomla's cache does not touch it. It also explains why an address can appear twice: the page built for a browser that shows modern image formats is not the same page as the one built for a browser that does not.

Below is a table of every stored copy. To filter it, type part of an address, or paste a full one, into the *Find a page* box; the closest matches come first. Choose 25, 50 or 100 rows per page. Click a column heading to sort by it, and click again to reverse the order. The columns are **Address**, **Stored** (how long ago), **Current until** (when it expires), **Size** and **State** (fresh or expired). Small labels beside an address say which copy it is: *modern images* (for browsers that show WebP), *avif images*, or *plain images* (for browsers that show neither). An *older build* label shows while a copy waits for the background refresh. **Previous** and **Next** move between pages of the table.

Each row has two buttons. **Rebuild** removes every copy of that address and queues it to be built again, ahead of other waiting work. It reappears in the list once it is stored. **Remove** deletes just that copy, and the page is stored again the next time someone opens it.

The **Refresh** button at the top right reads the figures again. It changes nothing.

**Remove every stored page**, in the red box, throws the whole store away. Click it, then click again within a few seconds while it reads *Click again to confirm*. Nothing else on the site changes, and the store starts filling itself again from the front page outwards. Until then, the first visitor to each page waits for Joomla. On a site of a few thousand pages, that is felt for hours. You do not need this after editing an article, because an edit clears the pages that showed the article by itself.

#### Cache pages

*Default: No*

Keeps each finished page and hands it straight to the next visitor, without Joomla building it again.

Building a page in Joomla takes time: the database, modules, the template and EasySpeed's own work all run on every visit. With this on, the finished, optimised page is stored, and the next guest gets the stored copy at once.

The store keeps itself filled from your sitemap. When you edit, publish, unpublish or delete an article, the pages that showed it are cleared: its own page and every list it appears in, such as a blog, a category or the front page. Where your server allows background work, they are rebuilt within seconds. The same goes for a page saved in SP Page Builder. A change to a module, menu, template, plugin, language or another extension's settings can show on any page, so it clears the whole store, which then fills itself again. Saving Joomla's Global Configuration does not clear it, so press **Remove every stored page** after changing something every page shows.

Stored pages are only for guests. Logged-in visitors always get a page built for them, and their pages are never stored. Forms keep working, because each visitor gets their own security token in a stored page.

The store lives in EasySpeed's own folder, so clearing Joomla's cache does not touch it. Switching this off removes every stored page, and you are asked to confirm first.

**When to change it:** Switch it on once your site looks right in Optimise mode.
- Tip: To check that a page came from the store, open it twice in a private window and look at the response headers in your browser's developer tools. `X-EasySpeed: hit` means it came from the store. `stale` means an older copy was served while a fresh one is built behind it.
- Tip: Do not run Joomla's own *System - Page Cache* plugin as well. EasySpeed stores pages itself, one copy per picture format.
- Tip: Some pages are never stored: pages showing a Joomla message (for example right after a form is sent), list pages after the first, Joomla's own search results, and print and feed views.
- Tip: The automatic work (filling the store, quick rebuilds after edits, refreshing expired pages behind the visitor) needs a server that can finish a response early and keep working, such as PHP-FPM/FastCGI or LiteSpeed. The **Refresh behind the visitor** line on the [Status tab](https://joomlamax.com/documents/easyspeed/#settings-status) tells you. On other servers, pages are stored as visitors open them, and an expired page is rebuilt while its visitor waits.
- **Watch out:** If a page shows guests something personal or different on every visit, such as a basket, a random quote or a countdown, a stored copy shows the same thing to everyone until it is rebuilt. Put such addresses in **Never store these addresses**.
- **Watch out:** Switching caching off removes every stored page. On a large site, the first visitor to each page then waits for Joomla until the store has filled again.

#### How long a page stays current

*Default: A month* · *Appears when Cache pages is Yes.*

How long an untouched stored page may be served before it is built again.

After this time, the page is built again. Anything that changes a page, such as editing the article it shows or any article it lists, clears it straight away, whatever this says. So this only decides how long an untouched page may go without being rebuilt.

The choice applies to every stored page at once, including pages stored before you changed it. The options run from 12 hours to a year, plus *A number of seconds I will give* for any other period.

When a page reaches the end of its time, it is not thrown away on the spot. On servers that can keep working after a response, the next visitor still gets it instantly, and a fresh copy is built behind them.

**When to change it:** Shorten it if parts of your pages change without an edit in Joomla. Lengthen it for a site that rarely changes.
- Tip: A month suits most sites, because edits clear their own pages immediately.
- **Watch out:** Content that changes without anyone saving in Joomla only refreshes when the stored page expires. Examples are a feed from another site, upcoming events that pass, or a random module. Choose a shorter time if that matters on your site.

#### Seconds

*Default: 2592000 (30 days)* · *Appears when Cache pages is Yes and How long a page stays current is set to A number of seconds I will give.*

Your own lifetime for stored pages, in seconds.

Used when **How long a page stays current** is set to *A number of seconds I will give*. Values from 60 (one minute) to 31536000 (a year) are accepted. A value outside that range is brought into it.

**When to change it:** Fill it in only when none of the ready-made periods suits you.

**Example:** `259200` - three days (3 x 86400).
- Tip: An hour is 3600 seconds, a day 86400 and a week 604800.

#### Sitemap address

*Default: Empty* · *Appears when Cache pages is Yes.*

Where EasySpeed finds the list of your pages, so it can store them before visitors ask.

Leave this empty and EasySpeed uses the sitemap your site declares in its robots.txt file, or /sitemap.xml if it declares none. Fill it in when your site has a sitemap it does not declare, which is common.

Write one address per line. A full address works, and so does just the part after your domain. It must belong to this site, with or without www. Up to five sitemaps are read.

The panel below says whether it worked. If it did, it reads *Filling itself from the sitemap you named*, followed by how many pages the sitemap lists. If nothing could be read, it says so, and EasySpeed follows your site's own links from the front page instead. The panel's count is renewed at most every six hours, and straight away when you change this field.

The automatic filling covers up to 5,000 addresses. On a larger site, the rest are stored the first time a visitor opens them.

**When to change it:** Fill it in when the panel says no sitemap was found, or names one that is not your real sitemap.

**Example:** `/index.php?option=com_jmap&view=sitemap&format=xml` - the kind of address a sitemap extension publishes (this one is JSitemap's). Copy the exact address your own sitemap extension shows.
- Tip: Open the address in your browser first. If it shows a list of your pages, it will work here.
- Tip: If your sitemap is an index that only lists other sitemap files, name those files themselves, one per line.
- Tip: Changing the address does not empty the store.
- Tip: The store reads the sitemap when it starts filling itself. If it has already finished, pages added later are stored the first time a visitor opens them. A full clear, such as **Remove every stored page**, makes it read the sitemap again.
- **Watch out:** Addresses on other domains are ignored, for safety.

#### Never store these addresses

*Default: Empty* · *Appears when Cache pages is Yes.*

Pages listed here are still optimised, but built fresh for every visitor instead of being stored.

Use it for pages that change with every visit or are rarely asked for twice, such as search results. Write one entry per line, the same way as in **Excluded URLs**.

Plain text matches any address that contains it, ignoring capitals. A full address copied from your browser works too. A line wrapped in slashes is a regular expression (a pattern for matching text). A line that is only `/` means the front page alone. Lines starting with # are notes and are ignored.

This is not the same as **Excluded URLs** on the [Exclusions tab](https://joomlamax.com/documents/easyspeed/#settings-exclusions). Excluded URLs switches EasySpeed off for a page altogether: nothing on it is optimised and nothing is stored. Use this list when you want a page fast but never stored.

**When to change it:** Add a line when a page shows each visitor something different, or when the table fills with addresses nobody opens twice.

**Example:** `searchkeyword=` - keeps search result pages whose addresses contain searchkeyword= out of the store, while still optimising them.
- Tip: Saving removes the stored copies of the addresses you add, and only those. Every other stored page stays in use.
- Tip: Good candidates: search results, a basket or checkout, pages that greet a visitor by location, anything rarely asked for twice.
- **Watch out:** Text matches anywhere in an address, so `/news` also matches `/newsletter`. To match one page only, use a regular expression that fixes both ends, such as `/^\/news$/`, written with the address exactly as the table on this tab shows it.
- **Watch out:** A line that starts and ends with a slash, such as `/news/`, is read as a regular expression, not as plain text. It then matches any address containing *news*.

#### Refresh stored pages in the background

*Default: Yes* · *Appears when Cache pages is Yes.*

After an update or a settings change, rebuilds stored pages one by one while visitors keep getting the stored copy.

An update, or a change on the Optimisation, Stylesheets or Images tab, can change how pages are built. The pages already stored were built the old way. With this on, they are rebuilt in the background, the pages nearest the top of the site first, while visitors go on getting the stored copy. Nobody waits and nothing is emptied. The first few are rebuilt straight after you save.

The same happens when **Prepare all images** finishes and when you switch AVIF on or off. Pages waiting for their rebuild carry an *older build* label in the panel, and a line above the table shows how far the refresh has got. Rebuilds take turns with the other background work, and pages cleared by an edit always go first.

A change to **Mode**, **Apply to**, **Stand down in debug mode**, **Skip component template requests** or **Excluded components** still empties the store at once. The other settings on this Cache tab leave stored pages as they are (switching **Cache pages** off removes them all), and lines added to **Excluded URLs** or **Never store these addresses** remove only the pages they match. With this switch off, any change that affects how pages are built empties the store.

**When to change it:** Leave it on.
- Tip: To apply a change to every page at once instead, use **Remove every stored page** in the panel. Visitors then wait for Joomla until the store has filled again.
- Tip: Like all of EasySpeed's background work, it needs a server that can keep working after a response. See **Refresh behind the visitor** on the [Status tab](https://joomlamax.com/documents/easyspeed/#settings-status).
- **Watch out:** If a CDN or firewall in front of your site challenges your own server's requests, rebuilds fail and the panel says why, for example that Cloudflare answered with a challenge. Allow your server's IP address and the `/media/plg_system_easyspeed/` folder (in Cloudflare: Security, WAF, Tools, IP Access Rules). EasySpeed's own requests use a user agent starting with EasySpeed, so you can spot them in your logs. Until then, those pages stay as the earlier version built them.
- **Watch out:** With this off, every update or settings change of that kind empties the store, and the first visitor to each page waits for Joomla.

#### Remove stylesheets no page uses

*Default: Yes*

Regularly deletes the cut-down stylesheet files that no stored page points at any more, so they do not fill your disk.

Every page gets a stylesheet cut down to what it uses, and each update and each edit makes new ones. Every few hours, this removes the stylesheets that no stored page points at and that nothing has used for an hour. It works a few seconds at a time, after visitors' pages have been sent.

The panel's **Disk used** tile shows pages and stylesheets separately, and how much the last tidy-up removed.

**When to change it:** Leave it on.
- Tip: It works whether or not **Cache pages** is on.
- **Watch out:** Without it the files only pile up: one site had 36 GB of them beside 1.2 GB of pages, until the hosting quota ran out.
- **Watch out:** Do not delete EasySpeed's cache folders by hand. Stored pages point at those files and would lose their styling.
- **Watch out:** The tidy-up is background work, so it only runs on a server that can keep working after a response. See **Refresh behind the visitor** on the [Status tab](https://joomlamax.com/documents/easyspeed/#settings-status). On other servers, keep an eye on **Disk used**.

### Diagnostics tab

The **Diagnostics** tab is a set of measuring tools for the question every site owner asks: why is this page slow? It shows where a page's build time goes, which modules Joomla rebuilds on every visit, and what your statistics and advertising tags cost. It can also copy stylesheets from other domains onto your own server.

Not to be confused with the Diagnostics mode on the [Plugin tab](https://joomlamax.com/documents/easyspeed/#settings-plugin). The tools here work in any mode and run only when you press their buttons (as a Super User). They never change your pages, apart from the stylesheet copies described below.

Why it matters: a stored page is answered in a fraction of the time a fresh one costs. On one measured site, a stored page answered in a third of a second, while the same page built fresh took just under three, with or without EasySpeed. That is simply what it costs Joomla to build the page. These tools help you find which part costs the most.

**Why a page can be slow the first time** explains the idea behind EasySpeed's store. A stored copy helps only the visitors who come after the first one. On a site with more pages than visitors per hour, almost everybody would be the first. That is why the store fills itself ahead of visitors, and why a long lifetime on the [Cache tab](https://joomlamax.com/documents/easyspeed/#settings-cache) pays off.

**Where the time goes** measures how long your server takes to build one page, and splits that time into four layers: *The server, before PHP starts* (the hosting floor), *Joomla starting up*, *The page content itself* (the article or list without the template) and *The template and its modules*. Type the page's address in the box, `/` for your front page or the part after your domain for any other page, such as `/about-us`, and press **Measure this page**. It takes a few seconds and deliberately avoids every cache, including EasySpeed's own, so you see the true cost of a fresh build.

The result shows the seconds and the share of each layer, the total, and a sentence naming the layer to look at first. If the template and its modules dominate, check the modules with the next tool. If Joomla starting up dominates, the usual causes are a long list of plugins, a slow database, or a server without an opcode cache (PHP's memory for compiled code). If the server layer dominates, the delay is in the hosting or the network, not in Joomla. A page that is already quick to build is reported as such.

Tip: run **Where the time goes** two or three times, a minute apart, especially on shared hosting. Each layer is measured three times and the quickest is kept, because a busy moment on the server can only add time, never remove it. If Joomla is installed in a folder, leave the folder out of the address you type. If the answer is that the site could not be measured from inside itself, your server cannot make requests to its own site; your host can tell you why.

**Which modules are rebuilt every time**: press **List the modules** to see your site's published modules, worst first (up to 25), each with its position, whether it shows on every page or only some, and whether Joomla may cache it. Modules of a kind that does real work, such as article lists, page builder modules, search or banners, are marked *(does real work)*. A sentence above the table tells you what to do next, starting with the module to change first.

Module caching is decided in two places. Each module has a Caching setting in its own Advanced tab (Use Global or No caching), but Use Global only works when Joomla's own cache is on, under System, Global Configuration, System tab, Cache. If Joomla's cache is off, the tool says so first, because changing single modules makes no difference until it is on. It suggests Conservative caching. A module that shows something personal, such as a basket or a greeting, is best left on No caching.

**Measurement and advertising tags**: press **List the tags** to see which statistics and advertising tags the page in the address box above loads, such as Google Analytics, Google Tag Manager, the Meta pixel, the X (Twitter) pixel, Google AdSense, Hotjar, Microsoft Clarity, Matomo, Plausible, LinkedIn, TikTok, Pinterest, Snapchat and Yandex Metrica. Each comes with its kind and its compressed download weight, heaviest first. Notes under the table point out a retired Google Universal Analytics tag that is still loading, two or more statistics systems doing the same job, and how many advertising tags are present. EasySpeed never removes a tag on its own: which ones earn their place is your decision.

Tip: **List the tags** reads the page's HTML. Tags that Google Tag Manager adds later, while the page runs, are not in the HTML and are not listed. Check your Tag Manager container for those.

**Stylesheets from other domains** shows where copying stands. A red box reminds you while **Bundle stylesheets from other domains** is still off (as saved). Below it you see *Addresses known*, *Copies held here* and *Still to copy*. **Copy them here** first looks for such stylesheets on your front page and a few pages EasySpeed has already visited, then copies them. If there are many, it copies what it can in a few seconds and asks you to press again. If it finds none, it says there is nothing to copy. **Forget the copies** deletes every copy and the list of addresses.

**Filling the store** is a pointer: the progress of the walk through your site, and the button that starts it, are on the [Cache tab](https://joomlamax.com/documents/easyspeed/#settings-cache), next to the stored pages it produces.

#### Bundle stylesheets from other domains

*Default: No*

Keeps a copy of stylesheets that load from other domains on your own server, so EasySpeed can fold them into the page's own stylesheet.

A stylesheet on another domain, such as a font service or a cookie banner loaded from a CDN, is the most expensive file a page can wait for. Before the browser can even ask for it, it has to look up the other server, open a connection and finish a security handshake. It draws nothing until the file has arrived. Three of them on one measured page held up drawing for 1.7 seconds.

With a copy on your own server, the stylesheet is bundled with everything else, so that request disappears instead of merely happening sooner. Anything the stylesheet points at, such as font files, is still fetched from where it was.

Copies are never made while a visitor is waiting. You make them with the **Copy them here** button further down this tab. Until a copy exists, the page keeps loading the original.

It works together with **Build a stylesheet per page** on the [Stylesheets tab](https://joomlamax.com/documents/easyspeed/#settings-stylesheets), and only in Optimise mode.

**When to change it:** Switch it on when a speed test such as PageSpeed Insights shows render-blocking stylesheets from another domain, or when the Status tab's *Left alone on purpose* list says *it is served by another domain*. It is off by default because it changes where a file is served from.
- Tip: Best order: press **Copy them here** first, then set this to Yes and save. Saving refreshes your stored pages, so they are rebuilt with the copies already in place.
- Tip: Pages built after you switch it on note any new addresses they find. Press **Copy them here** again later to copy those too.
- Tip: Only secure (https) stylesheets are copied, and only when what comes back really is a stylesheet. An error page or a login page is never bundled.
- Tip: Stylesheets that do not hold up the page (for example ones meant only for printing, or switched on only after loading), and stylesheets listed in **Never touch these stylesheets** on the Stylesheets tab, are left as they are.
- **Watch out:** A copy is used for a month. After that, pages go back to loading the original from the other domain until you press **Copy them here** again. Nothing renews copies automatically, so revisit this tab now and then.
- **Watch out:** If the other service changes its stylesheet, your copy does not follow. If something from that service starts to look wrong, press **Forget the copies**, then **Copy them here**.

### Server tab

Some of the biggest speed wins are not decided by Joomla at all, but by your web server: whether files are sent compressed, and how long browsers may keep them. The **Server** tab checks these for you and, where something is missing, gives you the exact lines to add.

Running the check changes nothing. EasySpeed asks your own site for a few real files, such as your front page and one stylesheet, script, image and web font it uses, and reads what comes back. So the result describes what your visitors actually get, whatever hosting you use.

Run it once EasySpeed has optimised a page, again after changing hosting or adding a CDN (a content delivery network, such as Cloudflare, that sends your files from servers around the world), and again after adding the suggested lines.

**Check my server** runs every check. It takes a few seconds, then the page reloads with the results. The line under the heading says when the check last ran, or *never run*. Until then the tab shows *Not checked yet*. The result is saved, so opening the settings later costs nothing.

A small red number on the Server tab's own title shows how many items need attention, so you notice it without opening the tab. An orange *!* means the check has never been run.

At the top of the results you see either *Nothing outstanding. Your server is handling static files well.* or how many items need attention. Each result has a badge: **OK** (green, nothing to do), **ACTION** (red, something is missing), **REVIEW** (orange, it works but could be better) or **UNKNOWN** (grey, it could not be tested). Under each one is a plain explanation, why it matters, and the address of the file that was tested.

*Text compression* checks whether stylesheets and scripts are sent compressed, with gzip or brotli (the two common ways of shrinking files on the way to the browser). Compression typically removes three quarters of their bytes. *Pages: compression* checks the same for your front page, because a page is downloaded in full on every visit.

The four *cache lifetime* checks, for JavaScript files, stylesheets, images and web fonts, ask how long a returning visitor's browser may keep each kind of file. No lifetime at all means ACTION: the files are downloaded again on every visit. A lifetime under a day means REVIEW.

*Generated files: cache lifetime* checks that browsers keep the stylesheets EasySpeed creates. EasySpeed writes the rules for this itself, so a REVIEW here usually means the server ignores .htaccess files or lacks the module that sets these headers. It shows UNKNOWN until EasySpeed has generated its first stylesheet. *Private cache is not public* checks that the folder where EasySpeed keeps its working files refuses requests from the web, as it should.

*Content delivery network* checks whether a CDN sits in front of your site and keeps your files. EasySpeed asks for the same file twice and looks at whether the second answer came from the CDN. With Cloudflare, a result saying it keeps none of your files (*DYNAMIC*) comes with directions for the Cloudflare dashboard: usually a Cache Rule that bypasses the cache for everything, a Page Rule with Cache Level: Bypass, or Development Mode left on. No CDN at all is fine and shows OK.

When a compression or cache-lifetime check needs attention, a **What to add** box appears with ready-made lines for the `.htaccess` file in your site's root folder. It covers only those items, so it never repeats what your configuration already does. **Copy** puts the lines on your clipboard. A folded section underneath gives the matching lines for nginx servers, which ignore .htaccess. Those go into the server configuration and usually need your host. After adding the lines, press **Check my server** again and watch the items turn green.

Always keep a copy of your .htaccess file before you edit it. One typing mistake there can take the whole site offline until it is undone.

The suggested lines let browsers keep the files that failed the check (stylesheets, scripts, images or fonts) for a year. That is safe for files whose name or version changes when their content does, as EasySpeed's own generated files do. If you replace a picture with a different one under the same file name, returning visitors may keep seeing the old one from their browser's cache, so upload changed pictures under a new name.

If your host will not switch compression on, Joomla has its own Gzip Page Compression setting (System, Global Configuration, Server tab). It only helps pages Joomla builds: pages served from EasySpeed's store are sent before Joomla's compression runs. Compression on the server is the better fix.

If a result says the site could not be reached from the server itself, a firewall, security extension or CDN bot check is probably blocking requests your server makes to its own site. Allow your server's own IP address. Only files on your own domain are tested, so a kind of file your front page does not load from your own domain shows UNKNOWN.

### Exclusions tab

The **Exclusions** tab is where you tell EasySpeed to keep its hands off certain pages completely. An excluded page is sent exactly as Joomla builds it: nothing on it is measured or optimised, and it is never stored.

Use it sparingly. Most pages that need special care do not need excluding. A page that changes with every visit, such as search results or a shopping basket, belongs in **Never store these addresses** on the [Cache tab](https://joomlamax.com/documents/easyspeed/#settings-cache) instead. There it stays optimised and is simply built fresh for every visitor.

#### Excluded URLs

*Default: Empty*

Switches EasySpeed off for every page whose address matches a line in this list.

Write one entry per line. EasySpeed compares each entry with the part of the address after your domain name, including anything after a question mark. Lines starting with `#` are ignored, so you can leave yourself notes.

A plain entry matches any address that contains it, and capital letters do not matter: `checkout` matches both `/shop/checkout` and `/Checkout?step=2`. A line with only `/` means your front page and nothing else. You can also paste a full address straight from the browser: the `https://` and domain part are ignored.

For exact control, write a regular expression (a pattern for matching text) between forward slashes. For example, `/^\/shop\/checkout/` matches addresses that start with /shop/checkout.

When you save, EasySpeed removes the stored copies of the pages that match the lines you just added, and only those. Every other stored page stays in use.

**When to change it:** When a page looks or works differently with EasySpeed on and you need it working right now while you look for the cause, or for pages that must never be touched, such as a payment step.

**Example:** `# checkout pages` on one line and `/shop/checkout` on the next: every page whose address contains /shop/checkout is sent exactly as Joomla builds it.
- Tip: Not sure EasySpeed is the cause? First open the page with `?easyspeed=off` added to its address. If the problem is still there, EasySpeed is not the cause and nothing needs excluding.
- Tip: Plain entries match anywhere in the address, so be specific: `shop` would also match `/workshops`. A longer piece of the address, or a regular expression, avoids surprises.
- Tip: Unlike plain entries, a regular expression does care about capital letters. It must also end with its closing slash: letters after it, such as `i`, are not supported, and the line is then read as plain text.
- Tip: If Joomla is installed in a folder, such as example.com/site/, the address EasySpeed compares includes that folder. A regular expression that starts with `^` must include it, as in `/^\/site\/shop/`. A line with only `/` then matches nothing; for the front page write `/^\/site\/$/`.
- Tip: Updating from 1.0.0? Full addresses in this list did not match before and now do, so read the list once after updating.
- **Watch out:** An excluded page loses every speed improvement, not just storing. Excluding busy pages makes them noticeably slower. For search results or a basket, use **Never store these addresses** on the Cache tab instead.

#### Excluded components

*Default: com_users and com_finder, one per line*

Switches EasySpeed off for every page that belongs to one of the components listed here.

Every Joomla page is produced by a component: articles by com_content, contact pages by com_contact, and so on. Write one component name per line. Pages produced by a listed component are never processed: not measured, not optimised and never stored.

The defaults are `com_users`, which covers the login, registration, password reset and profile pages, and `com_finder`, Joomla's Smart Search, whose results change with every search.

To find a component's name, open the component in your Joomla administrator and look at the address bar. The part after `option=`, such as `com_contact`, is its name. Capital letters do not matter.

**When to change it:** When a whole component misbehaves with EasySpeed on, for example a booking or shop component that builds its pages in an unusual way.

**Example:** `com_users`, `com_finder` and, on a third line, `com_contact`: contact pages are then sent exactly as Joomla builds them.
- Tip: To leave out just a few pages rather than a whole component, use **Excluded URLs** above.
- **Watch out:** If **Cache pages** is on, saving a change to this list empties the whole page store, unlike Excluded URLs. Visitors then get pages built from scratch until the store has filled again, so make the change at a quiet time.
- **Watch out:** Keep the two defaults unless you have a clear reason. Without `com_finder`, every different search can be stored as a page of its own, filling the store with pages nobody asks for twice.

### Advanced tab

The **Advanced** tab holds a few tools for testing and troubleshooting. Most sites never need to change anything here, except switching off the summary comment once everything runs the way you want.

It also explains the emergency switch: two words you can add to an address to see a page without EasySpeed, or to clear what it has collected.

#### Append summary comment

*Default: Yes*

Adds a short hidden note at the end of each page's source code with what EasySpeed measured and changed.

The note is an HTML comment, so visitors never see it on the page. It sits just before the closing body tag and lists the EasySpeed version and mode, the number and size of stylesheets and scripts, the size of the page itself, the images (how many are lazy, driven by script or missing dimensions), the time EasySpeed took, every change it made and any warnings.

To read it, open a page, right-click, choose View Page Source and scroll to the very bottom.

Stored pages keep the note too, so it describes the moment the page was built, not the moment you look at it.

**When to change it:** Leave it on while you set EasySpeed up and test. Turn it off once your site runs the way you want: the plugin itself recommends switching it off on a live site.
- Tip: Search the page source for `JoomlaMax EasySpeed` to jump straight to the note.
- Tip: The [Status tab](https://joomlamax.com/documents/easyspeed/#settings-status) shows the same information, in more detail and without opening the source.
- **Watch out:** Anyone can read a page's source, so while this is on, the note tells visitors which EasySpeed version you run and the names of the files it changed.
- **Watch out:** The note is saved inside each stored page. So if **Cache pages** is on, changing this setting refreshes your stored pages: in the background when **Refresh stored pages in the background** is on (the default), otherwise by emptying the store.

#### Pages to remember

*Default: 25*

Sets how many different pages the Status tab keeps reports for.

Each time EasySpeed measures a page, it keeps a report. This number sets how many different pages are kept. When a new page arrives beyond that number, the oldest report is discarded.

These are the pages listed under *Observed pages* on the [Status tab](https://joomlamax.com/documents/easyspeed/#settings-status). You can choose any number from 1 to 200.

**When to change it:** Raise it when you want to compare more pages at once, for example while checking every layout of a large site.

**Example:** 50 keeps reports for the fifty most recently measured pages.
- Tip: The same page is measured at most once every five minutes, so your busiest page cannot fill the list with copies of itself.
- Tip: These reports are for you only. Visitors never notice this number.

#### Emergency switch

*Default: Not a setting (information note)*

Two address tricks: see any page without EasySpeed, or clear EasySpeed's collected data from the address bar.

Add `?easyspeed=off` to any front-end address to see that page without EasySpeed. Joomla builds it as if EasySpeed were not installed, and it is not taken from the store. It affects only that one request and changes nothing for anyone else. If the address already contains a question mark, add `&easyspeed=off` instead.

Add `?easyspeed=reset` to an address while you are logged in as a Super User to clear EasySpeed's collected data. It does the same as **Clear collected data** on the Status tab: it removes the measurements, the generated stylesheets and every stored page, keeps the prepared images, and shows a message saying how much was removed.

The easiest place to use the reset is your administrator address, where you are already logged in, for example `https://www.example.com/administrator/index.php?easyspeed=reset`.
- Tip: `?easyspeed=off` is the fastest way to answer the question "is EasySpeed causing this?" If the problem is still there without EasySpeed, look elsewhere.
- Tip: Testing a page in a speed test with and without `?easyspeed=off` shows what EasySpeed gains on that page.
- **Watch out:** `?easyspeed=reset` empties the page store. On a large site, visitors get pages built from scratch until the store has filled again, so do not use it casually.

## Troubleshooting

### A page looks broken, or a menu, slider or popup does not open, after switching to Optimise

1. Open the page in a private window and add `?easyspeed=off` to the address (use `&easyspeed=off` if the address already has a question mark). If the page is also wrong there, the cause is not EasySpeed.
2. To see what EasySpeed did on that page, open it with `?easyspeed=measure` added. Then reload the plugin settings and look under **What the engine did** on the **Status** tab for warnings.
3. Most cases are a style for a class that a script adds later, for example when a menu opens. Right-click the part that misbehaves, choose Inspect, and note the class that appears when it opens. Add that class to [**Never remove these classes**](https://joomlamax.com/documents/easyspeed/#opt-css-safelist) on the **Stylesheets** tab. End a line with an asterisk to protect a whole family, for example `swiper-*`.
4. Check that **Read class names from scripts** is Yes.
5. If one extension's stylesheet is involved, add part of its address to **Never touch these stylesheets**.
6. Still stuck? Switch off one option at a time, for example **Build a stylesheet per page** and then **Defer blocking scripts**, to find the one responsible.
7. Stored pages keep their earlier copy until they are rebuilt in the background. To see your fix at once, find the page on the **Cache** tab, press **Rebuild**, then open it in a new private window.

### Icons are missing, show as squares, or appear a moment after the page

1. Compare with `?easyspeed=off` added to the address.
2. If icons appear a moment late, on phones only and only for visitors who have just arrived, that is **On phones, show the page before icon fonts that cannot be cut down** at work. It lets the page appear before a large icon font arrives. Switch it to No if you would rather wait for the icons.
3. If icons whose class starts with `icon-` are missing, switch **Remove the duplicate icon font** to No.
4. If other icons are missing, switch **Send icon fonts with only the icons the page uses** to No and check again.
5. As a last resort, add the icon font's stylesheet to **Never touch these stylesheets**.
6. Make sure you run the latest version. Earlier 1.0 releases could lose the fonts and icons of stylesheets linked by a full https:// address.

### An advert, map, chat window or other widget stays empty

1. Compare with `?easyspeed=off` added to the address.
2. Many advertising tags write the advert into the page while it is being read, and that cannot work once the script is deferred. EasySpeed already leaves such tags alone for files on your own site and for known ad servers. For an ad from any other server, add part of its script address to [**Never defer these scripts**](https://joomlamax.com/documents/easyspeed/#opt-defer-exclusions) on the **Optimisation** tab.
3. You can also add `data-easyspeed-skip` (or `data-no-optimize`) to the script tag in your template or custom module. EasySpeed then leaves that script alone: it is not deferred or held back.
4. If the widget is a statistics or tracking tag and you switched on **Load statistics tags after the page has loaded**, it starts when the visitor first scrolls, taps or types, or a few seconds later. That is expected.
5. If you switched on **Run the page's start-up code in small pieces**, switch it off and check again.

### Visitors still see an old version of a page

1. Know what is automatic. Saving an article, or a page in SP Page Builder's editor, clears the stored pages that showed it. Saving a module, menu item, template style, plugin, language or a component's Options clears every stored page.
2. Saving Joomla's Global Configuration does not clear stored pages. If you changed something every page shows, such as the site name, press **Remove every stored page** on the **Cache** tab.
3. Some extensions do not tell Joomla when they save. Pages that show their content are refreshed when **How long a page stays current** runs out.
4. To refresh one page now, open the **Cache** tab, type part of the address in the *Find a page* box and press **Rebuild** on its row. The next visit gets a freshly built page.
5. To refresh everything, press **Remove every stored page** (it asks you to click twice). Until the store refills, the first visitor to each page waits for Joomla to build it.
6. If a page changes all the time (search results, live listings, a basket), add its address to [**Never store these addresses**](https://joomlamax.com/documents/easyspeed/#opt-cache-excluded-urls). It stays optimised but is built fresh for every visitor.
7. If the **Status** tab says **Refresh behind the visitor** is not possible on this server, stored pages are not rebuilt in the background after an update or a settings change. Press **Remove every stored page** after such a change.
8. Make sure you are not looking at your own browser's copy (reload with Ctrl+F5 or Cmd+Shift+R) or at a copy kept by a CDN that caches whole pages.
9. To see where a page came from, open your browser's developer tools, then the Network panel, then the page itself. The response header `X-EasySpeed: hit` means a stored copy. `stale` means an older stored copy was served while a new one is built behind it. No such header means the page was built for this request.

### The page store stays empty or fills very slowly

1. **Mode** must be **Optimise** and **Cache pages** must be Yes, and saved. The store does not work in Diagnostics mode.
2. On the **Status** tab, **Refresh behind the visitor** should say yes. If it says not possible on this server, pages are stored only as guests open them. Ask your host to run PHP as PHP-FPM/FastCGI, or use LiteSpeed.
3. The store is filled during real visits, after each visitor already has their page. Visits by a Super User do not carry this work. A site nobody visits, such as a staging copy, fills only while someone browses it as a guest.
4. Read the sentence under the progress bar on the **Cache** tab. If it says nothing could be read from your sitemap, check that the address opens in a browser and belongs to this site. If your sitemap is a sitemap index (a list of other sitemaps), enter the sitemaps it lists in **Sitemap address** instead, one per line. EasySpeed reads up to five sitemaps and stores up to 5,000 of the pages they list in advance. Other pages are stored when visitors open them.
5. On the **Status** tab, **Private cache** and **Public cache** must be writable.
6. If the **Cache** tab says pages could not be rebuilt, a firewall or CDN is probably blocking your own server. See the next problem.
7. Some addresses are never stored, on purpose: anything for logged-in visitors, pages showing a Joomla message, paged lists such as `?start=20`, sorting and filter parameters, search words, print and feed views, and duplicate `/component/` addresses. The same goes for anything in **Excluded URLs** or **Never store these addresses**. These pages are still served, just built fresh.
8. **Clear collected data** on the **Status** tab, and `?easyspeed=reset`, also remove every stored page and generated stylesheet. Use them only when you mean to start again.

### The Cache tab says pages could not be rebuilt (Cloudflare, a firewall, 403 or 503)

1. EasySpeed asks your own site for pages to fill the store, to rebuild after edits and updates, and to test the server. A bot check or firewall can treat those requests as a robot and challenge them.
2. In Cloudflare, allow your server's own IP address under **Security → WAF → Tools → IP Access Rules**. If you do not know the address, your host can tell you the server's outgoing IP.
3. In a firewall extension such as Admin Tools' WAF, or in your host's firewall, allow your server's IP address and the folder `/media/plg_system_easyspeed/`.
4. If the **Server** tab says the site could not be reached from the server itself, ask your host to let the server reach its own website.
5. Then open the **Cache** tab again. As pages are rebuilt, the message goes away.

### Disk use keeps growing

1. On the **Cache** tab, the **Disk used** tile shows the space taken by stored pages and by their stylesheets.
2. Keep **Remove stylesheets no page uses** at Yes. It clears out old stylesheet files a few seconds at a time. It runs after visitors have their page, so it needs background work (see **Refresh behind the visitor** on the **Status** tab).
3. Keep **One stylesheet for all pages** and **Share it among pages of the same kind** at Yes. They mean far fewer stylesheet files than one per page.
4. Add pages with endless variations, such as search results and filters, to **Never store these addresses**.
5. Image copies are kept permanently. After you change **Encoder quality** or **Widths to offer**, new copies are made beside the old ones. Press **Delete and rebuild** on the **Images** tab to clear out the old ones.
6. Do not delete EasySpeed's folders by hand: stored pages point at those files. Use **Remove every stored page** instead.

### The PageSpeed Insights score is lower than expected

1. Test on the Mobile tab, run it three times and use the middle result. Scores vary from run to run, more so on shared hosting.
2. Before testing, make sure the page is stored and its images are prepared. Press **Prepare all images** on the **Images** tab, and open the page once yourself in a private window.
3. Test the same address with `?easyspeed=off` as well, to see what EasySpeed changes on your site.
4. Run **Check my server** on the **Server** tab and fix what it reports. Missing compression, short file lifetimes and a CDN that keeps nothing all cost points.
5. On the **Diagnostics** tab, press **List the tags**. Statistics, advertising and chat tags are often the heaviest code on a page. EasySpeed never removes them, but **Load statistics tags after the page has loaded** can start the statistics ones later.
6. On the same tab, **Measure this page** shows where Joomla's time goes when it builds the page, and **List the modules** shows which modules Joomla rebuilds on every request.
7. If a video plays behind a section, press **Make posters** on the **Images** tab.
8. Read the rest of the PageSpeed report. What is left is often outside the page: server response time, images hosted on other domains, or third-party scripts.

### A form or captcha does not appear, or will not send

1. With **Load Google reCAPTCHA when a visitor reaches its form** on, the captcha loads when its form comes near the screen or someone starts filling it in. If it never appears, set that option to No and check again.
2. Forms on stored pages keep working, because each visitor's own security token is put into the page. If a form still says the token is invalid, or shows another visitor's details, add its page to **Never store these addresses** on the **Cache** tab.
3. If the form's script does not run, add part of its address to **Never defer these scripts**.
4. To leave a form page completely untouched, add its address to [**Excluded URLs**](https://joomlamax.com/documents/easyspeed/#opt-excluded-urls), or its component to **Excluded components**, on the **Exclusions** tab. Login and registration (`com_users`) and Smart Search (`com_finder`) are excluded by default.

### Conflicts with another optimisation plugin or Joomla's System - Page Cache

1. When **Cache pages** is on, disable Joomla's **System - Page Cache** plugin under **System → Manage → Plugins**. EasySpeed's store does that job, and two page caches on one site make it hard to know which copy a visitor got and which one an edit cleared.
2. Use one optimisation plugin at a time. If you keep another one for a feature EasySpeed does not have, switch off its overlapping features: combining or minifying CSS and JavaScript, lazy loading by script, image conversion and page caching.
3. Images that another extension loads by script get no smaller copies from EasySpeed, because it leaves them alone. The **Status** tab counts them as script driven images. Switch that lazy loading off and let EasySpeed handle image loading.
4. After changing other plugins, clear their caches and press **Remove every stored page** on the **Cache** tab, so every page is rebuilt from the new setup.

### Nothing seems to change, or the Status tab says No measurements yet

1. Check that the plugin is enabled under **System → Manage → Plugins** and that **Mode** on the **Plugin** tab is not **Off**.
2. Look at your site in a private window. With **Apply to** set to **Guests only**, logged-in visitors, including you, get the page as Joomla builds it.
3. If Joomla's debug mode is on, EasySpeed stands down on every page. Switch debug off in the Global Configuration, or set **Stand down in debug mode** to No while you test.
4. Pages in **Excluded URLs** or **Excluded components** are skipped, and so are pages opened with `tmpl=component` while **Skip component template requests** is Yes. Forms being sent, edit screens and background requests made by scripts are never changed.
5. Stored pages are not measured again, and each page is measured at most once every five minutes. Add `?easyspeed=measure` to an address to measure it now.
6. Reload the plugin settings after browsing. The report is read when the page opens.

### Images are not made smaller, or are not sent as WebP

1. On the **Status** tab, **Image toolchain** should say GD available and **Image formats** should include webp. If GD is missing, ask your host to enable it.
2. Check that **Offer smaller renditions** and **Use WebP where accepted** are Yes.
3. During normal browsing, copies are made a couple at a time per page view (**Images to produce per page load**), so no page is slow to answer. Press **Prepare all images** to make them all now.
4. Only images stored on your own site can be converted. Images on other domains, and images whose address is filled in by a script, are left as they are.
5. If your images live outside Joomla's usual media folders, add the folder to **Also look in these folders**.
6. If **Use AVIF where accepted** stays off when you switch it on, read the reason shown under it. Your server cannot write AVIF, or does not send it correctly.

### A background video starts late, or shows only a still picture

1. This is usually intended. With **Start background videos after their poster** on, the poster is shown first, and the video starts once the page has loaded and the video is on or near the screen.
2. Visitors who asked their device for reduced motion or less data see only the poster. To play the video for them too, set **Poster only for visitors who ask for less** to No.
3. If **Poster only on phones** is Yes, screens narrower than 768 pixels show the poster and never download the video.
4. A video with no poster is not held back. On the **Images** tab, press **Make posters**. Do it again after you add or replace a background video, and after using **Delete and rebuild**, which removes posters along with the image copies. The button sits in the panel that appears while **Offer smaller renditions** is Yes.

### On phones, the text changes font a moment after the page appears

1. This is **On phones, show the page before its text fonts**. For a visitor who has just arrived on a phone, the page appears straight away in a fallback font sized to match, and the real font follows a moment later.
2. If you would rather the page waited for its fonts, set that option to No. Wider screens are not affected either way.

## Frequently asked questions

### What does JoomlaMax EasySpeed do?

EasySpeed is a speed plugin for Joomla 4.4, 5 and 6 that makes pages load faster by optimising each page as Joomla builds it. Your stylesheets are merged into one trimmed file, scripts no longer hold up the page, images come at the right size in WebP or AVIF, and web fonts no longer make text jump. Its built-in page cache also serves guests finished pages without Joomla building them again.

### Does EasySpeed improve Core Web Vitals (LCP, CLS and INP)?

Yes, it works on all three. For Largest Contentful Paint (LCP), the main image is fetched first and preloaded, a visitor who has just arrived gets the stylesheet inside the page, and stored pages are sent without Joomla building them first. For Cumulative Layout Shift (CLS), images get their missing width and height, sliders keep their final size from the start, and web fonts get fallbacks sized to match. For responsiveness (INP, and Total Blocking Time in lab tests), Google reCAPTCHA loads only when a visitor reaches its form, and you can switch on **Load statistics tags after the page has loaded** and **Run the page's start-up code in small pieces**. The real-visitor figures in PageSpeed Insights cover the last 28 days, so they catch up a few weeks after the lab score.

### Does EasySpeed work with any Joomla template and extension?

Yes. It works with any Joomla template and extension, because it reads the finished page instead of relying on a list of supported products. SP Page Builder, Helix Ultimate and YOOtheme Pro get extra built-in adaptations. A few options serve a single extension, such as Joomla's reCAPTCHA plugin or J-BusinessDirectory, and their descriptions say so.

### Which Joomla and PHP versions does EasySpeed support?

Joomla 4.4, 5 and 6, on PHP 7.4 or newer. Smaller image copies need PHP's GD extension. AVIF images need PHP 8.1 or newer with GD built with AVIF support. The installer stops with a clear message if your site is too old.

### Will EasySpeed change how my site looks?

It is built not to. It changes how pages are delivered, not what they show, and your original images and files are never overwritten. Every optimised page goes through structural checks before it is sent, and if one fails the original page goes out instead. A few options change what a visitor sees for a moment, such as a fallback font on phones until the web font arrives, and each can be switched off. If something looks different, add `?easyspeed=off` to the address to compare, then switch off the option responsible.

### Is EasySpeed working if I see no difference while logged in?

Most likely, yes. By default EasySpeed only works for guests, so logged-in visitors, including you, get the page as Joomla builds it. Look at your site in a private window. **Apply to** on the **Plugin** tab changes this. Stored pages are only ever given to guests, whatever it is set to.

### Do I still need Joomla's System - Page Cache plugin?

No. When **Cache pages** is on, disable Joomla's System - Page Cache plugin, because two page caches on one site make it hard to know which copy a visitor got. EasySpeed's store does the job and is made for EasySpeed's pages: it keeps a separate copy for each picture format and language, puts each visitor's own form token into the page, fills itself from your sitemap and clears only the pages an edit changed.

### Can I use EasySpeed together with another optimisation plugin?

It is best to use one. If you keep another plugin for something else, switch off the features that overlap: combining or minifying CSS and JavaScript, lazy loading by script, image conversion and page caching. EasySpeed needs to see the original files to read them, and it leaves alone any image that another plugin loads by script.

### Does EasySpeed work with Cloudflare or another CDN?

Yes. It works behind Cloudflare and other CDNs, and the **Server** tab checks whether your CDN actually keeps your files. Let the CDN keep stylesheets, scripts, images and fonts, and leave whole pages to EasySpeed's store: EasySpeed's pages differ with the visitor's browser and with whether they have just arrived. EasySpeed does not rewrite file addresses to a separate CDN domain. If a bot check challenges your own server, allow its IP address in the CDN.

### Is EasySpeed safe for forms, shops and member areas?

Yes, with one thing to watch. Logged-in visitors never get stored pages, each visitor's form security token is put into the page for them, and pages showing a Joomla message are never stored. Login, registration and Smart Search are excluded by default. If a guest's page shows something personal that the server writes into the page, such as a basket total, add those pages to **Never store these addresses**. If that appears on every page, keep **Cache pages** off; every other optimisation still works.

### What happens to stored pages when I edit an article?

Only the stored pages that showed the article are cleared: its own page and every page that listed it, such as a blog, a category or the front page. Adding, publishing or unpublishing an article clears the pages that show articles, so lists pick up the change. On servers that run PHP-FPM/FastCGI or LiteSpeed, cleared pages are rebuilt in the background within seconds of saving; elsewhere, the next visitor gets a freshly built page. Saves in SP Page Builder's editor are recognised too. Saving a module, menu item, template style, plugin, language or a component's Options clears every stored page, because any page may show it. Saving Joomla's Global Configuration does not, so press **Remove every stored page** if you changed something every page shows.

### Does EasySpeed delay JavaScript until the visitor moves the mouse?

No. It defers scripts: they still run by themselves, in their original order, as soon as the page has been read. Menus, sliders and forms work without anyone touching the page, and speed tests see a complete page. Only two things wait for the visitor on purpose. Statistics tags wait if you switch on **Load statistics tags after the page has loaded**, and Google reCAPTCHA waits until a visitor reaches its form.

### Does EasySpeed minify or combine JavaScript?

No. EasySpeed changes when scripts load and whether they hold up the page, not the scripts themselves. It does merge and minify stylesheets into one trimmed file, and it removes needless whitespace and comments from the HTML.

### Does EasySpeed remove unused CSS and generate critical CSS?

Yes, on your own server, with no outside service. Your template's and extensions' stylesheets are merged into one file cut down to the rules your pages use. EasySpeed also reads your scripts to keep the classes they add later, such as a menu's open state, so you rarely need to list any by hand. A visitor who has just arrived gets that stylesheet inside the page. When it is larger than 400 KB, they get the rules for the first screen (the critical CSS) at once and the rest straight after.

### Does EasySpeed convert images to WebP and AVIF?

Yes. EasySpeed makes smaller copies of the large images stored on your site, at several widths (400, 800, 1200 and 1600 pixels by default), and writes them as WebP. Switch on **Use AVIF where accepted** and, if your server can make AVIF, browsers that show it get whichever file is smaller. Each browser picks the size that fits its screen, browsers that cannot show WebP get your original, and your original files are never changed. Press **Prepare all images** on the **Images** tab to make every copy at once.

### Does EasySpeed send my data to anyone?

No. Everything happens on your own server. EasySpeed contacts another server only when you ask it to: **Measure images on other domains** (off by default), copying stylesheets from other domains with **Copy them here**, and **List the tags**, which downloads your page's tracking tags to weigh them. Joomla's own update check contacts joomlamax.com.

### Will EasySpeed get my site a score of 100 in PageSpeed Insights?

No plugin can promise a score. EasySpeed deals with what your Joomla site controls: stylesheets, scripts, images, fonts, and how fast pages are answered. What is left is usually outside the page: the server's response time, a CDN that keeps nothing, and third-party tags such as analytics, adverts and chat. The **Server** and **Diagnostics** tabs show you each of these.

### Why does PageSpeed Insights see my site differently from my own browser?

PageSpeed Insights is a first visit on a simulated, slowed-down phone. EasySpeed treats everyone who arrives from outside the same way, whether they come from Google, another site, a bookmark or a speed test: the files the page needs first are written into the page itself. You, clicking between your own pages, get those files from your browser's cache instead. The content is the same either way. The real-visitor data at the top of PageSpeed Insights is gathered over several weeks, so it catches up gradually.

### How do I switch EasySpeed off quickly?

For one page, add `?easyspeed=off` to its address (or `&easyspeed=off` if it already has a question mark). That request gets the page exactly as Joomla builds it. For the whole site, set **Mode** on the **Plugin** tab to **Off** and save, which also removes the stored pages. Use Mode rather than disabling the plugin: a disabled plugin cannot clear stored pages when you edit content, so they would be out of date when you enable it again. If you did disable it, press **Remove every stored page** on the **Cache** tab after enabling it again.

### How do I get help if something does not work?

Press **Copy report** on the **Status** tab and send it to JoomlaMax support at support@joomlamax.com. Include the address of the page and what you see. The report holds your Joomla and PHP versions, what EasySpeed did on the latest page and any warnings, which is usually enough to find the cause.

### What happens if I uninstall EasySpeed?

Everything EasySpeed created is removed: stored pages, generated stylesheets, image copies, video posters and its reports. Your content, original images, template and other extensions are untouched, and Joomla builds pages exactly as it did before.

## Glossary

- **Above the fold:** The part of a page you see before you scroll. Images there should load at once; images further down can wait.
- **Async:** A script that downloads alongside the page and runs as soon as it arrives, in no particular order. Statistics tags usually load this way.
- **CDN:** A content delivery network such as Cloudflare: servers in front of your site that can keep copies of your files closer to visitors.
- **CLS (Cumulative Layout Shift):** How much the page jumps around while it loads, for example when an image without a reserved size pushes the text down.
- **Core Web Vitals:** Google's three measures of how a page feels to real visitors: how fast the main content appears (LCP), how quickly the page reacts (INP) and how much it jumps around (CLS).
- **Critical CSS:** The rules needed to draw the first screen. When a site's stylesheet is very large, EasySpeed sends these first, inside the page, to a visitor who has just arrived, and the rest of the stylesheet just after.
- **Defer:** A way of loading a script so it downloads alongside the page and runs once the page has been read, in its original order, instead of stopping the page while it loads.
- **Download ID:** Your personal key from your joomlamax.com account. You enter it under Update Sites so Joomla can download EasySpeed updates for you.
- **Fallback font:** The font already on the visitor's device, such as Arial, that is shown until a web font arrives. EasySpeed sizes it to match the web font, so lines do not wrap again when the real font lands.
- **FCP (First Contentful Paint):** The moment the first text or image appears on screen.
- **First visit:** A visit by someone who has just arrived, from a search engine, another site, a bookmark or a speed test, rather than someone moving between your pages. EasySpeed writes the files the page needs first into the page for these visitors.
- **font-display: swap:** A font setting that shows text straight away in a fallback font and switches to the web font when it arrives, instead of hiding the text while it downloads.
- **Guest:** A visitor who is not logged in. By default EasySpeed only works for guests, and stored pages are only ever given to guests.
- **Icon font:** A font whose characters are icons, such as Font Awesome. A full icon font holds hundreds of icons. EasySpeed can send a small copy with just the ones your page uses.
- **INP (Interaction to Next Paint):** How quickly a page reacts when a real visitor taps, clicks or types, measured over the whole visit.
- **Lazy loading:** Waiting to download an image until the visitor scrolls near it. Good for images further down. Bad for the main image at the top, which must load at once.
- **LCP (Largest Contentful Paint):** The moment the biggest thing in the first screen appears. That is usually the main picture, sometimes a large heading or a background video.
- **Minify:** Removing spaces, line breaks and comments that a browser does not need. EasySpeed does this for stylesheets and for the HTML of the page.
- **PageSpeed Insights and Lighthouse:** Google's free speed test (pagespeed.web.dev) and the testing engine behind it. The lab score is measured on a simulated, slowed-down phone. The section at the top shows real Chrome visitors when Google has enough of them.
- **Poster:** The still picture a video shows before it plays. For a video playing behind a section, the poster lets the page appear before the video file arrives.
- **Preconnect:** A hint that tells the browser to open a connection to another server early, so a file from there arrives sooner when it is needed.
- **Preload:** A hint that tells the browser to start downloading an important file, such as the main image, as soon as it starts reading the page.
- **Render-blocking:** A file the browser must download before it can draw anything, usually a stylesheet or a script in the page's head.
- **Rendition:** A smaller copy of one of your images at one of the widths EasySpeed offers. Your original file is never changed.
- **Sitemap:** An XML file listing your site's pages, usually made by a sitemap extension. EasySpeed reads it to know which pages to store in advance.
- **Speed Index:** How quickly the visible part of the page fills in during a lab test. Lower is better.
- **srcset and sizes:** Two parts of an image tag. srcset lists the available renditions, and sizes tells the browser how wide the image will be shown, so it can pick the smallest copy that still looks sharp.
- **Stored page (page store, page cache):** A finished, optimised copy of a page that EasySpeed keeps on disk and sends to guests without Joomla building it again. Switched on with **Cache pages**.
- **TBT (Total Blocking Time):** In a lab test, how long the page's code kept the browser too busy to react to a tap while the page was loading.
- **TTFB (Time to First Byte):** How long the server takes to start answering. A stored page cuts this, because Joomla does not have to build the page first.
- **Unused CSS:** Stylesheet rules that nothing on the page uses. Template and page builder stylesheets cover every component they offer, so most of their rules are unused on any one page.
- **WebP and AVIF:** Modern image formats that look the same as JPEG or PNG at a fraction of the size. Browsers that cannot show AVIF get WebP, and browsers that cannot show WebP get copies in your image's original format.

## Changelog

### Version 1.0.0

Released 28 September 2026. The first public release.

#### Highlights

EasySpeed makes Joomla 4.4, 5 and 6 sites load faster without changing how they look. It starts in Diagnostics mode, which only measures and reports, so you can see what it would do before you let it change anything. Every feature has its own switch.

#### New

- **Three modes**: Off, Diagnostics (measure only) and Optimise, with a Status report of what was measured and changed on each page.
- **A stylesheet per page**: your template's and extensions' stylesheets are merged and cut down to the rules the page uses. Class names that scripts add later are read from the scripts.
- **One stylesheet for all pages**, so visitors download it once and reuse it on every page.
- **First visits that need no other file to appear**: the stylesheet and the scripts the head needs are written into the page for a first-time visitor.
- **Fonts without delays or jumps**: text shows before web fonts arrive, size-matched fallback fonts keep text still, and icon fonts are cut down to the icons the page uses.
- **Defer blocking scripts**, safely: files that inline code needs at once stay where they are, and you can list scripts never to defer.
- **Remove redundant assets**: repeated style blocks, a second full copy of Font Awesome, and Helix Ultimate's unused Chosen widget.
- **Image fixes**: missing width and height added, the main image loaded first and the rest lazily, the main image chosen separately for phones and desktops, and space reserved for sliders.
- **Smaller images**: WebP copies in several widths, made on your own server, with **Prepare all images** to make them all at once. Your originals are never changed.
- **Resource hints**: early connections to other domains and a preload for the largest image.
- **Collapse markup whitespace** in the HTML.
- **Cache pages**: finished pages are stored and served without Joomla building them again, filled from your sitemap and refreshed in the background after an update.
- **Tools for the owner**: the Server tab checks your hosting and CDN, the Diagnostics tab measures what slows a page down, and Exclusions let you leave pages or components alone.
- **Emergency switch**: add `?easyspeed=off` to any address to see the page without EasySpeed.
- **Built-in adaptations** for SP Page Builder and Helix Ultimate, and for the responsive visibility classes of YOOtheme Pro's UIkit.

#### Requirements

- Joomla 4.4, 5 or 6, and PHP 7.4 or newer.
- Updates through Joomla's own updater with your Download ID.

### Version 1.1.0

Released 1 October 2026. This release contains every change made since 1.0.0.

#### Highlights

When a site's stylesheet is large, first visits now appear sooner, because only the rules the first screen needs are sent at once. Background videos, Google reCAPTCHA and Joomla's module scripts no longer hold up loading. Saving settings or running "Prepare all images" no longer empties the page store: stored pages are refreshed in the background. A minifier bug that broke CSS `calc()` values on every site is fixed.

#### New

Every new feature has its own switch. Each entry gives the settings tab and the default.

- **Built-in adaptations for YOOtheme Pro**: UIkit dropdown menus stay closed and the active menu item is drawn right on a first visit, and videos that UIkit plays itself (`uk-video`) are left to UIkit. The Status tab now also shows whether YOOtheme Pro is installed.
- **Draw a first visit before a large stylesheet arrives** (Stylesheets, On): with a stylesheet over 400 KB, first visits get the first screen's rules at once and the rest later.
- **Only the rules the first screen draws with** (Stylesheets, On): keeps first-screen rules only when the whole selector is on the first screen, which makes that CSS much smaller.
- **Give background videos a poster** (Images, On): the **Make posters** button makes a still picture for each self-playing background video, so the page paints before the video arrives.
- **Start background videos after their poster** (Images, On): the poster paints first. The video starts once the page has loaded and is near the screen, at the poster's frame.
- **Poster only for visitors who ask for less** (Images, On): visitors who ask for reduced motion, use Data Saver or are on 2G see the poster and get no video.
- **Poster only on phones** (Images, Off): screens narrower than 768 px show the poster and never download the video.
- **Load Google reCAPTCHA when a visitor reaches its form** (Optimisation, On): only for Joomla's reCAPTCHA plugin. The checkbox captcha loads when its form nears the screen or is touched.
- **Fetch module scripts at low priority** (Optimisation, On): Joomla's module scripts (Bootstrap, menu, messages) no longer compete with the stylesheet and main image. They still run at the same moment.
- **Share it among pages of the same kind** (Stylesheets, On): pages that load the same stylesheets share one smaller file instead of one file for the whole site.
- **Bundle a stylesheet linked twice only once** (Stylesheets, On): a file linked twice under different queries is bundled once. The last copy is kept, so the cascade stays the same.
- **Hold transitions while the rest of the stylesheet is applied** (Stylesheets, On): stops dozens of CSS transitions from starting at once when the rest of a first visit's stylesheet arrives.
- **On phones, show the page before icon fonts that cannot be cut down** (Stylesheets, On): WOFF2-only icon fonts, such as Font Awesome 7, are applied on phones after the first paint.
- **Use AVIF where accepted** (Images, Off): adds AVIF images wherever they are smaller than WebP. The server is tested first, and the reason is shown if it cannot write AVIF.
- **Never store these addresses** (Cache, empty): the pages listed here are still optimised but built fresh for every visit. Use it for search results or a basket.
- **Load statistics tags after the page has loaded** (Optimisation, Off): async Analytics, Tag Manager, Meta pixel and similar tags start on first interaction or a few seconds after load.
- **Faster J-BusinessDirectory search filter** (Optimisation, On): only for J-BusinessDirectory. Removes a long browser task when the search filter draws city, region and category names.
- **Run the page's start-up code in small pieces** (Optimisation, Off): runs each inline "on load" function as its own task for faster taps. Off because speed-test simulations may score it lower.

#### Improved

- Saving settings no longer empties the page store. Stored pages are refreshed in the background, and the first few are rebuilt right after you save.
- Saving **Excluded URLs** or **Never store these addresses** now removes only the stored pages that match the lines you added.
- When **Prepare all images** finishes, it no longer empties the store. Stored pages are refreshed in the background with the new images.
- After you save an article or an SP Page Builder page, the affected stored pages are rebuilt within seconds. This needs a server that can finish a response early.
- Pages build about two to three times faster with identical output, so refreshes and first builds finish sooner.
- **Defer blocking scripts** now reads each script file to learn what it defines. More files are deferred safely, and the files a page needs stay in place.
- Shared stylesheets write far fewer files. After heavy writing, old files are cleaned up early, which keeps disk use in check.
- Background work takes turns: edits come first, then the refresh, the sitemap walk and the AVIF/WebP page copies, so none of them starves the others. When many AVIF copies are waiting, they get a larger share.
- The progress of the background refresh, **Prepare all images** and the sitemap walk now survives clearing Joomla's cache and Joomla updates.
- The background refresh skips pages that are already up to date. The sitemap walk restarts after a large clear.
- The sitemap is read at most every six hours, instead of on every refresh of the Cache tab.
- More tracking and cache-buster parameters no longer create extra stored copies of a page, among them gad_source, gbraid, wbraid, _gl, _hsenc, ttclid, rnd and nocache.
- Junk addresses are never stored: paths containing "//", and links where "&amp;" was escaped twice.
- On slow phones, background videos wait longer before downloading, so the page finishes loading first.
- Options that serve only one extension now say "Only for ..." in their description. "Refresh stored pages after an update" is now called "Refresh stored pages in the background".
- Stored pages are now sent with an `X-EasySpeed-Copy` header that names the picture format and the build, which helps when checking a page.

#### Fixed

- The CSS minifier removed the spaces around "+" inside `calc()` and before ":" in some selectors. This broke sizes and positions on every site.
- Stylesheets linked by a full https:// address lost their fonts and icons, because the address was rewritten wrongly.
- Saving a page in SP Page Builder's editor did not refresh its stored copy, so visitors kept seeing the old page.
- Advertising tags that write into the page (document.write) were deferred and the ads stayed empty. Such local files and the tags of known ad servers are no longer deferred.
- Scripts that inline code needs straight away could be deferred, which broke features such as social login. UMD libraries such as React were affected too.
- On stores with more than 5,000 pages, clearing all pages, or clearing after a module or component change, missed the older pages.
- Styles for elements that scripts build at runtime, such as React widgets, could be removed and cause layout shifts. Scripts are now read with a real JavaScript reader.
- Popups and newsletter dialogs could be picked as the page's main image and preloaded.
- A background video was ignored when picking the main image, so a picture further down the page was preloaded instead.
- An empty picture field written as `url("/")`, as SP Page Builder does, made every visit download the front page as an image.
- Shared stylesheets could start a new edition on almost every page, which filled the disk with gigabytes within hours.
- When a tag repeated an attribute, EasySpeed read the last value, but browsers use the first. Styles the page needed were removed.
- Alternate, disabled, noscript and LESS stylesheets were bundled, and a stylesheet served by PHP was bundled as PHP source code.
- Joomla's noscript copy of Font Awesome was bundled a second time.
- The first-screen CSS was skipped on pages with an ad tag near the top. It also loosened when a library comment mentioned Modernizr.
- In **Excluded URLs**, a full address copied from the browser never matched. It now matches.
- Background rebuilds counted a CDN or firewall challenge, or a 403/503 answer, as a rebuilt page. These now count as failures, and the Cache tab says why.
- Early connections were opened to servers whose scripts EasySpeed had removed or holds back.
- Addresses on the never-store list were still built if they were already queued.
- When a font family was declared more than once, its text fallback could be measured from the wrong file.

#### After updating: what to know or do

- **Stored pages are rebuilt in the background.** The pages nearest the top of the site go first, and visitors get the existing stored copy in the meantime. You do not need to press anything. This needs "Refresh stored pages in the background" (Cache tab, On by default).
- **Old stylesheet files are removed by themselves** by "Remove stylesheets no page uses" (On by default), once the pages that use them have been rebuilt. Do not delete EasySpeed's cache folders by hand: stored pages point at those files.
- **What saving settings does now:**
  - Changes on the Optimisation, Stylesheets or Images tab refresh stored pages in the background.
  - Changes to Mode, Apply to, Stand down in debug mode, Skip component template requests or Excluded components still empty the store at once.
  - Changes to Excluded URLs or Never store these addresses remove only the matching pages.
- **Excluded URLs switches EasySpeed off for a page.** To keep a page optimised but not stored, such as search results or a basket, move its line to **Never store these addresses** on the Cache tab. Full addresses in Excluded URLs now take effect, so review that list.
- **Background videos need posters.** Open the Images tab and press **Make posters** once, and again whenever you add or replace a background video. Posters are made in your browser.
- **"Prepare all images"** now refreshes stored pages in the background when it finishes. **Delete and rebuild** still empties the store, because it deletes the images, and the walk then starts again.
- **These stay off until you switch them on:** Use AVIF where accepted, Load statistics tags after the page has loaded, Run the page's start-up code in small pieces, and Poster only on phones.
  - AVIF needs PHP 8.1 or newer with GD built with AVIF support, and a web server that sends .avif files as image/avif. If the server cannot, the switch shows the reason.
- **If an advert from another server stays empty,** add its address to **Never defer these scripts** on the Optimisation tab.
- **If a firewall or CDN challenges bots** (for example Cloudflare's bot check or Admin Tools' WAF), allow your server's own IP address and `/media/plg_system_easyspeed/`. EasySpeed asks your site for its own pages, and a challenge stops the background refresh. The Cache tab now tells you when this happens.
- **Instant rebuild after a save** needs a server that can finish a response early (PHP-FPM/FastCGI or LiteSpeed). On other servers, edited pages are rebuilt by the background work as before.
- **Requirements are unchanged:** PHP 7.4 or newer, and Joomla 4.4 or newer.

---
© 2026 JoomlaMax. EasySpeed is released under the GNU General Public License, version 2 or later.
