Makes the site faster. Images, caching, the database, and the one element holding up every page load.
Why this one exists. Slow is the failure nobody reports, because the visitor who left never told anyone why.
16Playbooks
98Steps written out
13That change anything
0Free on every plan
Every playbook it holds
Database Cleanup
careMonthlySept 2026
Clear the accumulated junk and optimise the tables, after a backup and never before one.
1
Measure first
Table sizes, row counts, and where the weight actually is.
Reads only
2
Back up the database
No row is deleted before this succeeds.
Stops the run
3
Clear post revisions
Past the retention you set, keeping the most recent.
Writes
4
Clear expired transients
Only rows already past their own expiry.
Writes
5
Clear spam and trash
Comments already flagged, posts already in the bin past the window.
Writes
6
Drop orphaned rows
Metadata pointing at posts and users that no longer exist.
Writes
7
Optimise and report
Optimise the tables and report the space saved in megabytes, not percentages.
Writes
7 steps · changes the site, behind a restore point
Image Compression
agencyMonthlyOct 2026
Compress the images that are actually slowing pages down, keep every original, and stop before the plugin's free quota runs out.
1
Measure the library
Count the images, their file sizes and which pages use them. If nothing is over the threshold you set, it exits here and compresses nothing.
Stops the run
2
Confirm originals are kept
Read the compression plugin's own settings and confirm it stores an untouched original for every file. If originals are switched off, the run stops here.
Stops the run
3
Compress the heaviest first
Ordered by the traffic the page gets, not by file size alone. One batch at a time, with the quota checked before each batch.
Writes
4
Request the compressed files back
Fetch each one and confirm it still decodes and still has the dimensions the page expects.
Reads only
5
Restore anything that broke
Any file that fails that request is put back from its original in the same run, and the plugin's own bulk restore stays available for every other file.
Reversible write
6
Report the megabytes
What the library weighed before, what it weighs now, and which pages got lighter. In megabytes, not percentages.
Reads only
6 steps · changes the site, behind a restore point
Modern Formats
careOn demandSept 2026
Serve WebP and AVIF to the browsers that read them, and keep the JPEG for the browsers that do not.
1
Read what is already there
Which compression plugin is installed, whether it can write WebP and AVIF, and whether delivery is already on. If it is on and working, it exits here.
Stops the run
2
Write down the current settings
The exact delivery options and any rewrite rule as they stand, so putting them back is precise rather than a guess. Nothing changes until that record exists.
Stops the run
3
Switch delivery on
One format at a time. WebP first, because every current browser reads it, then AVIF behind it.
Writes
4
Ask for the same image three ways
Once with an AVIF accept header, once with a WebP one and once with neither. Three different responses with the right content type is the pass.
Reads only
5
Turn it back off on any mismatch
If any browser gets a broken image or the wrong content type, delivery returns to exactly what step two recorded, inside the same run.
Reversible write
6
Report the bytes saved
Which formats are served to which browsers, and what the homepage hero now weighs against what it weighed.
Reads only
6 steps · changes the site, behind a restore point
Image Dimensions
agencyMonthlyNov 2026
Stop the page jumping while it loads by giving every image a width and a height, and take lazy loading off the image at the top.
1
Find the images with no size
Read the rendered pages for image tags carrying no width or height attribute. If there are none, it exits here and edits no post.
Stops the run
2
Record every post it will touch
The post ID and the current revision for each one, so every edit can be traced back. Nothing is edited until that list exists.
Stops the run
3
Add the missing dimensions
Read the real size from the file itself and write it into the tag. One post at a time, through post revisions.
Writes
4
Take lazy loading off the top image
The image that paints first should never be lazy loaded. It finds that image per template and removes the attribute there only.
Writes
5
Undo through the revision
Every edit is a post revision, so any post goes back to the version it had before this run from the WordPress editor, without us.
Reversible write
6
Re-measure the shift
Load the changed templates again in headless Chrome with mobile processor and network throttling, and report cumulative layout shift before and after. That is a lab figure from our network, not what your visitors recorded.
Reads only
6 steps · changes the site, behind a restore point
Render Blocking CSS
agencyMonthlyNov 2026
Get the stylesheets out of the way of the first paint, one template at a time, without changing how the page looks.
1
Render each template and list what blocks
Headless Chrome loads one page per template and records every stylesheet the browser waits for before it paints anything. If nothing blocks, it exits here.
Stops the run
2
Snapshot the templates
A full page screenshot of every template, plus the current optimisation settings, so the comparison later is against something real. Nothing changes until both exist.
Stops the run
3
Inline what the first screen needs
The rules the visible part of the page uses go into the head. One template at a time, never all of them at once.
Writes
4
Defer the rest
The remaining stylesheets load after the paint instead of holding it up.
Writes
5
Compare against the snapshot
Screenshot each template again. Anything that moved by more than a hair is a failure, not a win.
Reads only
6
Put back any template that moved
The change is removed and the settings recorded in step two are restored, for that template only, immediately.
Reversible write
7
Report the paint time
First contentful paint per template, before and after, measured in headless Chrome with mobile processor and network throttling. A lab figure, and labelled as one.
Reads only
7 steps · changes the site, behind a restore point
Unused CSS
agencyMonthlyDec 2026
Name the stylesheets loading on pages that never use a single rule from them, and say what they cost.
1
Render one page per template
Headless Chrome records which CSS rules the page actually uses while it paints.
Reads only
2
Match every rule to its plugin
A 300KB stylesheet from a slider plugin on a page with no slider is the finding. The total byte count is not.
Reads only
3
Separate the safe from the risky
A rule unused on this page may still be used by a hover state, a form error or a mobile menu. It says which ones it cannot prove.
Reads only
4
Order by bytes per page view
A heavy file on the homepage costs more than a heavier one on a page nobody visits.
Reads only
5
Report with the setting that fixes it
Which plugin to stop loading where, written in the words of the optimisation plugin you already have. It changes nothing on the site.
Reversible write
5 steps · reads only, never writes
Script Deferral
careOn demandOct 2026
Stop the scripts that nothing on the first screen needs from holding up the paint.
1
List what is enqueued
Read the registered scripts through the connector, with their handles, their dependencies and where each loads. If everything is already deferred, it exits here.
Stops the run
2
Record the current lists
The existing defer and delay settings exactly as they are, so putting them back is one action. Nothing changes until that record exists.
Stops the run
3
Defer the ones the paint does not need
Analytics, chat widgets and social embeds first. One handle at a time, never a bulk switch.
Writes
4
Load the critical pages after each change
Homepage, a service page and the contact form, with the browser console read for errors. A deferred script that breaks a form is worse than a slow one.
Reads only
5
Put back anything that errors
That handle returns to what step two recorded, in the same run, without waiting for you.
Reversible write
6
Report what moved
Which handles are deferred now, and time to interactive on the homepage before and after, measured in headless Chrome with mobile throttling.
Reads only
6 steps · changes the site, behind a restore point
Font Loading
careOn demandOct 2026
Stop text being invisible while a font downloads, and preload only the one file the first screen actually needs.
1
Find the fonts the page waits for
Which font files load on the homepage, from where, and whether text is hidden while they arrive. If the display rule is set and the first font is already preloaded, it exits here.
Stops the run
2
Record the current font settings
The theme's font options and any preload tag already in the head, written down before either changes.
Stops the run
3
Set the display rule
Text shows in a fallback face straight away and swaps when the real font arrives, rather than showing nothing for three seconds.
Writes
4
Preload one file, not six
Only the weight the heading uses on the first screen. Preloading everything has the same effect as preloading nothing.
Writes
5
Undo path
Removing the preload tag and restoring the display rule recorded in step two puts the head back exactly as it was. Two settings, and no theme file was edited.
Reversible write
6
Confirm the text appears early
Load the homepage in headless Chrome with slow network throttling, confirm the headline is readable before the font file finishes, and report the difference.
Reads only
6 steps · changes the site, behind a restore point
Page Cache
careOn demandSept 2026
Serve pages from cache to visitors, and never to somebody signed in or halfway through a checkout.
1
Read what is caching now
Which caching plugin or host layer is active, and what the response headers actually say. If pages already come back from cache, it exits here and changes nothing.
Stops the run
2
Record every existing rule
Every exclusion, every expiry and every cookie rule as it stands today. Nothing is switched on until that record exists.
Stops the run
3
Exclude what must never cache
Cart, checkout, account and anything behind a login. This happens before caching is turned on, not after somebody complains.
Writes
4
Switch caching on
One layer at a time, with an expiry the site's publishing rhythm can live with.
Writes
5
Prove a signed in visitor gets a fresh page
Request the same address signed out and signed in, and confirm the two responses differ and carry the right cache headers.
Reads only
6
Roll back to the recorded rules
If a signed in request comes back with somebody else's page, caching goes off and every rule returns to what step two recorded, immediately.
Reversible write
7
Report
Which pages are cached, which are excluded, and the server response time before and after, measured server to server from our network.
Reads only
7 steps · changes the site, behind a restore point
Object Cache
careOn demandNov 2026
Stop the site repeating the same database queries on every page load, when the host already gives you somewhere to keep the answers.
1
Check there is somewhere to cache to
Ask the connector whether Redis or Memcached is reachable and which PHP extension is present. If neither is there, it exits here and installs nothing.
Stops the run
2
Record the current state
Whether a drop-in already exists and what is in it, so it can be put back byte for byte. Nothing is written until that record exists.
Stops the run
3
Install the drop-in
One file, the one the host's own documentation names, and nothing else.
Writes
4
Watch the first few minutes
Load the critical pages and read the error log through the connector. A misconfigured object cache shows up as a white screen, not as a slow page.
Reads only
5
Remove it on any error
Deleting the drop-in returns the site to the database exactly as it was. That happens on its own the moment a page errors.
Reversible write
6
Report the hit rate
How many queries are answered from cache, and the server response time before and after, measured server to server from our network.
Reads only
6 steps · changes the site, behind a restore point
CDN Setup
careOn demandNov 2026
Serve the static files from an edge close to the visitor without breaking the pages that reference them.
1
Read what is served from where
Which host answers for images, stylesheets and scripts today, and whether a CDN already sits in front. If one does, it exits here.
Stops the run
2
Record the current addresses
The site address, the content address and any rewrite rule already in place. Nothing is repointed until that record exists.
Stops the run
3
Point the static files at the edge
Images, stylesheets and scripts. Not the HTML, and never the admin.
Writes
4
Request the same files both ways
Fetch each type from the edge and from the origin and confirm they match byte for byte and carry the same content type.
Reads only
5
Repoint to the origin on any mismatch
One setting goes back to what step two recorded and every file is served from the origin again within minutes.
Reversible write
6
Check the fonts and the mixed content
Cross-origin fonts and any file still requested over plain HTTP, because both fail quietly and only in some browsers.
Reads only
7
Report
What is on the edge, what is not, and the time to first byte for a static file from three regions.
Reads only
7 steps · changes the site, behind a restore point
Table Optimise
careMonthlySept 2026
Find the plugin tables that grow forever and are never trimmed, and give the site back the space they hold.
1
Measure the tables
Every table by size, row count and overhead, with the plugin that owns it named. If nothing is over the threshold, it exits here.
Stops the run
2
Back up the tables it will touch
Only those tables, not the whole database. No row moves before this succeeds.
Stops the run
3
Trim the logs past retention
Scheduled action history, session rows, redirect logs and analytics tables, and only past the age you set.
Writes
4
Rebuild the overhead
Optimise the trimmed tables so the deleted rows give their space back to the disk instead of sitting there as a gap.
Writes
5
Restore path
The backup from step two restores any single table on its own, without touching the rest of the database.
Reversible write
6
Report in megabytes
Which tables shrank, by how much, and which one will need this again next month.
Reads only
6 steps · changes the site, behind a restore point
Autoload Diet
careMonthlyOct 2026
WordPress loads a set of options on every single request. When that set reaches a few megabytes, every page on the site pays for it.
1
Weigh the autoloaded options
The total size, and the twenty heaviest rows with the plugin that wrote each one. Under the threshold, it exits here.
Stops the run
2
Export every row it will change
Option name, current value and current autoload flag, written out before a single flag moves.
Stops the run
3
Stop autoloading the junk
Expired transients and rows left behind by plugins that are no longer installed. The flag changes. The value is never deleted.
Writes
4
Ask before touching a live plugin
A heavy option belonging to an active plugin is not junk. It is listed for you and nothing happens to it without your word.
Stops the run
5
Undo from the export
Every flag returns from the step two export in one action, and no value was ever removed to restore.
Reversible write
6
Confirm the site still works
Load the homepage, the admin dashboard and one form, then report the new autoload weight against the old one.
Reads only
6 steps · changes the site, behind a restore point
Heartbeat Throttle
careOn demandOct 2026
The admin screen calls the server every fifteen seconds. On a small host, a few tabs left open is enough to use every PHP worker the site has.
1
Count the polling
How often admin-ajax is called, from which screen, and by which plugin. If the rate is already low, it exits here.
Stops the run
2
Record the current intervals
The existing heartbeat settings, so every one of them can be put back exactly.
Stops the run
3
Slow the screens that do not need it
The dashboard and the post list. The editor keeps its interval, because that is what holds your post lock and saves your drafts.
Writes
4
Cap the worst caller
A plugin hitting admin-ajax on its own schedule is rate limited rather than blocked, because blocking it breaks its screen.
Writes
5
Undo
One setting returns every interval to what step two recorded. No plugin is deactivated and no plugin file is edited at any point.
Reversible write
6
Verify in the editor
Open a post, save a draft, confirm the lock and the autosave still work, then report the request rate before and after.
Reads only
6 steps · changes the site, behind a restore point
Hosting Limits
careWeeklySept 2026
Read what the host actually gives this site, so a slow page gets blamed on the right thing.
1
Read the PHP configuration
Version, memory limit, maximum execution time, upload limit, and whether opcache is on and how full it is.
Reads only
2
Find the worker ceiling
How many requests the site can serve at once before they queue. Read from the host's own limits where the connector can see them, and reported as unknown where it cannot.
Reads only
3
Watch the queue across a day
Server response time hour by hour, so you can see whether it climbs at the same time every day. This is time to first byte measured server to server from our network, not a page speed figure.
Reads only
4
Name the ceiling that binds
Memory, workers, execution time or the database. One of them is the one that hurts and the rest are noise.
Reads only
5
Report with what fixes it
Which host setting to change or which plan tier to move to, with the number that says why. It changes nothing on the server.
Reversible write
5 steps · reads only, never writes
Vitals Watch
agencyWeeklyDec 2026
Track the three metrics Google actually uses, template by template, and say plainly where each number came from.
1
Pick one page per template
Homepage, a service page, a post, an archive and the checkout. The failure is nearly always in the template rather than the page.
Reads only
2
Pull the field data
The Chrome User Experience Report through the PageSpeed Insights API, which is what real Chrome users on real phones recorded over the last twenty eight days. Where a page has too little traffic to report, it says so instead of filling the gap.
Reads only
3
Run the lab test
The same API's Lighthouse run, on a simulated mobile processor and connection. That is a lab figure and it is labelled as one everywhere it appears.
Reads only
4
Name the element
Which image, font or block of script is holding up the largest paint, and which element is moving the layout. A selector, not a score out of a hundred.
Reads only
5
Compare against last week
A template that got worse is a finding. A template that has always been slow is a project, and the two need different conversations.
Reads only
6
Report per template
Ordered by the traffic the template carries. It changes nothing on the site.