Earth Notes: On Website Technicals (2021-08)

Updated 2024-03-03.
Tech updates: improved cwebp, liter, lingering, Ko-fi, AVIF, boldness, JXL from JPEG, 304s?, rebuild speedup, AMP 0, keen img inline, repo move.
This month has involved playing with WebP, AVIF and JXL alternate image formats. Also allowing auto-generation of WebP for all hero images to save bandwidth for browsers that can use them. Also use of manually-generated instances of all three formats for hero images used as-is. Typical savings for WebP lossy and lossless seem to be around 25%. The other formats in due course may save ~50%. This is significantly lowering the weight of the desktop home page, amongst many others.

2021-08-31: Page Experience Madness

GSC is still over the place with no URLs with a good page experience, but the CWV and HTTPS flags randomly green / red / no data. Mobile Usability remains good, enumerating www pages rather than m-dot, and a http/https mix.

2021-08-30: SVN Repo Move

Very very tardily I finally moved an SVN repository (well, a cluster of them) from the old RPi server to the new. That needed a little bit of svn switch --relocate TLC at the client, having carefully copied the repos over, eg:

% rsync -av --rsh ssh oldhost:/rw/SVN-repositories/general /rw/SVN-repositories/
% svn switch --relocate svn+ssh://dhd@oldhost.exnet.com/rw/SVN-repositories/general/www.hd.org svn+ssh://dhd@newhost.exnet.com/rw/SVN-repositories/general/www.hd.org

2021-08-22: Download Weight Measured

Taking byte weight of objects successfully downloaded from the EOU site variants (ie with 200 or 206 status codes), eliminating one-offs and video/audio files, and taking the biggest 20, a snapshot of object weight count today is:

% sh script/countWeight.sh | egrep -v '[.]((mp[34])|(flac))' | egrep -v ' 1$' | tail -20
/img/fridge-freezer-interior-Siemens-KG34NA10GB.jpg 7394585 33
/img/thermal-images-tiled-2x1-1208w.jpg 7452898 33
/towards-a-LZC-home.html 7875926 259
/img/bat/20200917-SN358279.zca 7882443 5
/data/k8055-summary-200710-to-201407.br 8575556 3
/img/16WW/cemetery-closed-yellow-sign-20200408-Kingston.jpg 8857183 11
/img/wordcloud/podcast-1.png 9445862 52
/img/solar-PV-panels-on-roof.jpg 10899499 59
/img/tools-1280w.png 11063472 31
/img/ssheet/JPearson-Solar-Efficiency-Pitch-of-Panel-V7.xls 11288023 3
/img/teaching/2017/Y4-Solar-Power-lesson-slides.pptx 11309620 3
/img/3G/condensation-on-window-double-glazing-inside-pane-and-within-sealed-unit-1-DHD.jpg 11703756 22
/img/meet/CleanWeb-20150622/StreetlightComeback-JLewis-Telensa-20150622.pdf 11762615 3
/data/PV-3rd-party/SEEngland1/system2-20200817-to-20210817.csv 13369027 6
/_gridCarbonIntensityGB.html 18288844 2031
/OpenTRV/talks/FOSDEM2014/opentrv-FOSDEM.odp 21978812 5
/ 36353682 3578
/img/front-entrance-after.jpg 40620825 32
/img/meet/CleanWeb-20150622/1506_Cleanweb_announcement_taxonomy.pdf 48788257 3
/rss/podcast.rss 86150795 10010

That suggests some potential quick wins manually generating at least WebP alternates for images such as front-entrance-after.jpg, now done.

Potentially replacing some of the other files with more compact forms may also be helpful, eg the .csvs with zopflied versions, done.

The most fetched (ie by count) are:

% sh script/countWeight.sh | sort -k3n | tail
/img/s42/3/icons.png 1687187 795
/img/s42/3/min.js 1082348 819
/out/hourly/button/intico1-64.png 2175119 835
/out/hourly/button/intico1-32.png 1051840 855
/sitemap.atom 2850595 961
/favicon.ico 792662 1013
/_gridCarbonIntensityGB.html 20952812 2336
/robots.txt 8894285 2562
/ 41666188 4089
/rss/podcast.rss 99632424 11552

Avoid Heavy Unseen

I also made some tweaks to avoid generating huge images with schema.org metadata purely for search engines to index. Now if they are larger than the largest allowed body image (~99kB) then I no longer generate/retain them.

2021-08-21: WebP Near Lossless

I was just sending a note to Jyrki Alakuijala to thank him for his work on WebP:

I know I am only 10Y late to the table, but I am using it to knock ~25% weight off my static site largely invisibly to the users.

He responded by asking what flavour(s) of WebP I use (lossy, lossless, near lossless) suggesting that the last is "technically strongest".

So I think --near_lossless 60 is in my near future to try out!

He said that near lossless is similar to the posterising/reducing colour depth that I already do to reduce PNG weight, but will not help when I am already on an 8-bit palette image.

So maybe I should do the initial PNG colour/weight reduction with pngquant. Then maybe still a final pass with zopflipng of course! (Or do it all in one step with WebP 'near lossless'.)

Getting pngquant is as simple as brew install pngquant on Mac, and apt-get install pngquant on RPi! Both V2.x, but about 6 years' development time between them!

The intent so far is that all lossless images (PNG source) will be completely pixel-for-pixel identical to the reference weight- and size- reduced PNG, but maybe that could change. I already allow the WebP versions of JPEGs to achieve weight savings in different ways: the same level of information should be present but they will not render identically.

2021-08-19: Shrink the Front Page!

I am keen to reduce the weight of all pages, particularly the lite pages, and the home pages of lite and desktop. Even more so for first / cold visits.

Looking at the lite (m-dot) home page there are only two images left on it. The 16WW carbon footprint by year, and the social media buttons.

16WWYearlyEnergyCarbonFootprint
16WW carbon footprint chart from the front page.
icons
Social media button sprite composite image from the front page.

Both are PNG and already compressed until pips have squeaked.

The carbon chart is dynamically generated and the social media buttons loaded by JavaScript. So in neither case is there a good hero-like solution using a picture element.

I also do not want to add much more complexity to the handling of body images.

The sneaky solution that I am hatching is to make a .png.webp from and alongside the .png and if the browser explicitly says that it will Accept a image/webp, ship the .png.webp instead of the .png (and set the right MIME type too).

There are significant page-weight savings (~1kB) to be had:

3267 out/yearly/16WWYearlyEnergyCarbonFootprint.png
2514 out/yearly/16WWYearlyEnergyCarbonFootprint.png.webp
2073 img/s42/3/icons.png
1694 img/s42/3/icons.png.webp

The new icons WebP has been checked in. The new footprint WebP is now generated with a single extra makefile line.

That does not require any change to the HTML generation (unlike for the hero images) nor extra traffic. This is potentially extensible to all body images so long as I generate alternates alongside responsive body images and out/ output images. The Apache server then just has to pick what to serve at run-time.

It can even help with serving the PNG carbon intensity buttons, though I may want to turn down the cwebp effort or stop creating them from the PNGs when battery is low.

This is starting to get a bit complex if it is to play nicely with the Save-Data lo-fi L versions, but should work silently for most modern browsers, and not break older ones that will just see plain PNGs and JPEGs as before.

Nominally I could slightly trim the hero picture HTML where these two mechanisms overlap in functionality.

Apache Code

The Apache server code to handle Save-Data currently is:

# Serve smaller images/audio for Save-Data clients if possible.
# Ensure caches handle Save-Data correctly.
<FilesMatch "\.(jpg|png|webp|mp3|mp4)$">
  Header append Vary "Save-Data"
</FilesMatch>
# If client has Save-Data header set (to "on", case-insensitive).
RewriteCond %{HTTP:Save-Data} on [NC]
# ... and if the lo-fi image/audio exists...
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME}L -s
# ... then send .xxxL content instead of .xxx hi-fi original.
RewriteRule ^/(.+)\.(jpg|png|webp|mp3|mp4)$ /$1.$2L [L]

That probably needs to split into separate parts for audio and images, so that the images part can get more complicated for the WebP stuff.

Given that very very few requests are coming in with Save-Data for now, maybe to keep things simple I can just deal with the WebP stuff for images initially, and fold the complexity back in later...

# Serve smaller audio and secondary images for Save-Data clients if possible.
# Ensure caches handle Save-Data correctly.
<FilesMatch "\.(mp3|mp4|webp|avif|jxl)$">
  Header append Vary "Save-Data"
</FilesMatch>
# If client has Save-Data header set (to "on", case-insensitive).
RewriteCond %{HTTP:Save-Data} on [NC]
# ... and if the lo-fi image/audio exists...
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME}L -s
# ... then send .xxxL content instead of .xxx hi-fi original.
RewriteRule ^/(.+)\.(mp3|mp4|webp|avif|jxl)$ /$1.$2L [L]

# Serve alternate compact WEBP images if possible.
# Ensure caches handle Accept and Save-Data correctly.
<FilesMatch "\.(jpg|png)$">
  Header append Vary "Accept"
  Header append Vary "Save-Data"
</FilesMatch>
# If client can Accept WEBP as more-compact alternate/secondary image format.
RewriteCond %{HTTP:Accept} image/webp
# ... and if the alternate image exists...
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME}.webp -s
# ... then send .xxx.webp content instead of .xxx primary original.
RewriteRule ^/(.+)\.(jpg|png)$ /$1.$2.webp [L]

That indeed seems to work, and the previously PNG images are now being transferred as WebP and displaying correctly. WebPageTest reports the entire weight of http://m.earth.org.uk/ at 11kB, including all images and JavaScript, with the HTML being 6kB of that. WebPageTest is showing the weight of the HTTPS version at 10kB, the HTML ~5kB of that. Using the dynamic WebP response saved ~10% of the whole page weight.

Yes, the .png responses have type image/webp, but also the correct Vary: Accept,Save-Data.

The handful of previously-unused WebP versions of body images, at various sizes for progressive support, should now be being served too!

Apache Redux

I had another slightly more comprehensive handling of the two headers and file existence for inbound PNG and JPEG requests... There is probably a much more elegant way to handle this!

# Serve alternate compact WEBP images if possible.
# Ensure caches handle Accept and Save-Data correctly.
<FilesMatch "\.(jpg|png)$">
  Header append Vary "Accept"
  Header append Vary "Save-Data"
</FilesMatch>
# Four cases for primary images (.png, .jpg):
#     Save-Data   image/webp  Serve
#  1  -           -           .xxx (no rewrite)
#  2  on          -           .xxxL if extant, else no rewrite
#  3  -           yes         .xxx.webp if extant, else no rewrite
#  4  on          yes         .xxx.webpL if extant, else .xxxL else no rewrite
#
# 1 - by default do not rewrite.
# 2 - cannot accept WEBP, has Save-Data, has L file: serve it!
RewriteCond %{HTTP:Accept} !image/webp
RewriteCond %{HTTP:Save-Data} on [NC]
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME}L -s
RewriteRule ^/(.+)\.(jpg|png)$ /$1.$2L [L]
# 3 - can accept WEBP, no Save-Data, has .webp file: serve it!
RewriteCond %{HTTP:Accept} image/webp
RewriteCond %{HTTP:Save-Data} !on [NC]
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME}.webp -s
RewriteRule ^/(.+)\.(jpg|png)$ /$1.$2.webp [L]
# 4a - can accept WEBP, has Save-Data, has .webpL file: serve it!
RewriteCond %{HTTP:Accept} image/webp
RewriteCond %{HTTP:Save-Data} on [NC]
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME}.webpL -s
RewriteRule ^/(.+)\.(jpg|png)$ /$1.$2.webpL [L]
# 4b - can accept WEBP, has Save-Data, has no .webpL but has L file: serve it!
RewriteCond %{HTTP:Accept} image/webp
RewriteCond %{HTTP:Save-Data} on [NC]
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME}.webpL !-s
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME}L -s
RewriteRule ^/(.+)\.(jpg|png)$ /$1.$2L [L]

Enabling this feature, and forcing the alternates to be built for autogenerated images in https://m.earth.org.uk/note-on-best-time-to-fix-your-heating.html, reduced page weight from 28kB to 21kB according to WebPageTest! Cloudinary's integrated image analysis gives the page an A rating for image efficiency: a further ~20% could be saved by AVIF over WebP for the original JPEG it seems. (I manually generated a WebP and JXL alternate for the body image used as-is for desktop too.)

Hurrah!

I created specific tools to eagerly force-rebuild (almost) all hero and body images without having to rebuild pages that depend on them. The body image script was slow on the Mac and had to be paused overnight. It was left running overnight on the RPi and may take days to complete. By early morning it had generated more than 800 new images on the RPi and the image autogen body directory has nearly 10,000 entries excluding the new ones! Site visitors will asynchronously get value from the new images as they appear...

I have randomised the rebuild order for both of these so that in theory an extra instance can be run in parallel for decent speed-up.

These secondary images makes first page build with a new image slow. A disadvantage of the server-side trickery is that I do not see the benefit of it when looking at pages in the filesystem on my Mac while writing them. But the implied graceful degradation is as intended.

Hangover

Early afternoon the next day the Mac rebuild finished and the RPI continues. Even running the rebuild on the Mac when there is nothing to do is slow:

% time make allbodyimgs
Eagerly building body image caches...
168.292u 238.298s 7:58.31 85.0%	0+0k 0+0io 1600pf+0w

There are 648 distinct body image/class combinations emitted by script/image_list_body as used by make allbodyimgs.

% script/image_list_body | head
img/16WW/20210429ImpulseHeatingTest/20210429-16WWmultisensortempL-part.png respfloatr
img/16WW/20210615-wren-perched-on-vertical-solar-panel-in-garden.jpg respfloatr
img/16WW/GLS/20210516-screenshot-IFTTT-Green-Light-Signal-activity.png respfloatrsml
...
img/wind/wind20120913-peak.png resp90
img/wordcloud/CHARM.png respfloatr
img/wordcloud/TEDDINET.png respfloatr
img/zero-carbon-house-solar-heating.png resp90

On the Mac (which may well have redundant images for historical reasons) here is a count of derived JPEG and JPEG-to-WebP body images:

% ls img/a/b/*.jpg | wc -l
    3659
% ls img/a/b/*.jpg.webp | wc -l
     952
% ls img/a/b/*.jpgL | wc -l
    3574
% ls img/a/b/*.jpg.webpL | wc -l
     908

Hangover Continues

RPi still going the !

Rebuilding the PNGs seems to be taking all the time, in particular likely the zopflipng -m final step.

Maybe there's a argument for slackening that off a little where most browsers will get the smaller .png.webp instead?

On the RPi the cache stats to match those for the Mac above are:

% ls img/a/b/*.jpg | wc -l
2868
% ls img/a/b/*.jpg.webp | wc -l
732
% ls img/a/b/*.jpgL | wc -l
2804
% ls img/a/b/*.jpg.webpL | wc -l
701

Maybe it's a bit over 70% done?

By :

% ls img/a/b/*.jpg.webp | wc -l
946

... And it's done?

% ls img/a/b/*.jpg.webp | wc -l
959

And even when there are no body images to rebuild, testing the waters is slow on the RPi, though curiously a little faster than on the Mac!

% time make allbodyimgs
Eagerly building body image caches...
279.367u 122.809s 6:26.72 103.9%	0+0k 77256+2536io 16pf+0w

Large

I was avoiding making lo-fi versions of images wider than the viewport on the grounds that they may have been for high-pixel-density devices unlikely to be using Save-Data. But I was also avoiding making alternate versions of such images, which happens also to exclude building alternates of full width (up to twice nominal viewport width) images/diagrams.

Removing the flags for such images to allow a rebuild is (note that no HTML needs to change):

% rm `ls -1 img/a/b/.flags/*.DONE | egrep 'l[0-9]*[.](([0-9][0-9][0-9][0-9])|([8-9][0-9][0-9]))x'`

The (re)build took a little over an hour on the Mac.

2021-08-18: More Alternates

I have just added code to be able to auto-generate alternate compact formats for hero images used as-is, alongside any manually-provided alternates.

The trick here is to have the code that looks for alternates, where the image that alternates are being looked for is not autogenerated, look in the autogenerated images area also, as if it were there. And to make alternates there if not yet present, and possible.

This will allow me to refactor out some current alternates handling code.

2021-08-17: Keen Image Inlining

I have just amended page generation to be very keen to inline very very small images for desktop pages, even below the fold.

Looking at the image size population, a useful threshold of 320 bytes was found:

% find img -name '*.png' -size -700c | wc -l
     197
% find img -name '*.png' -size -400c | wc -l
     141
% find img -name '*.png' -size -350c | wc -l
     137
% find img -name '*.png' -size -320c | wc -l
     137
% find img -name '*.png' -size -300c | wc -l
     134
% find img -name '*.png' -size -200c | wc -l
      50

Before, for a page with lots of tiny thumbnails:

% ls -alS statscast-202005.html{,gz,br}
 88023 statscast-202005.html
 18144 statscast-202005.htmlgz
 14802 statscast-202005.htmlbr
% ls -alS m/statscast-202005.html{,gz,br}
 85759 m/statscast-202005.html
 16293 m/statscast-202005.htmlgz
 13265 m/statscast-202005.htmlbr

After:

% ls -alS statscast-202005.html{,gz,br}
115759 statscast-202005.html
 27179 statscast-202005.htmlgz
 23158 statscast-202005.htmlbr
% ls -alS m/statscast-202005.html{,gz,br}
 86016 m/statscast-202005.html
 16495 m/statscast-202005.htmlgz
 13454 m/statscast-202005.htmlbr

2021-08-16: AMP Zero

As of this afternoon, GSC's AMP page count is 0 in the dedicated section, but still 1 in the Overview...

Screenshot 20210816 GSC AMP chart pages impressions zero
GSC AMP page count (and impression) zero in the afternoon of 2021-08-16.
Screenshot 20210816 GSC Overview Enhancements
GSC Overview Enhancements panel showing AMP page count at 1.
Screenshot 20210816 GSC Page experience
Your site has 1.2% URLs with a good page experience.

I had hoped that the 'SEO' rubble would have stopped bouncing by now from this AMP excision (AMP-ectomy?), but it seems not!

2021-08-15: Page Rebuild Speedup

Yesterday I improved my debug timestamps: precision to milliseconds, and more code/operation granularity especially for image handling. Today I am starting to use that information to speed up page (re)builds, primarily by cacheing results of recursive image builds. Where a header hero is built from a full and a lite image (and variants) the script now does not need to actually check the underlying two or more images, nor regenerate the HTML based on them each time.

AMP One

GSC's AMP page count is back up to one, as of this afternoon...

2021-08-14: Googlebot Dodging 304s?

An extract from my logs of Googlebot fetches of a sample EOU URL. The EOU site is static and most pages change infrequently, and in any case more than once per day is rare. Looking at the response-length field (initially 14408 bytes) gives an idea of when the underlying page has actually changed. Googlebot does not seem to be making much use of 304s, even when it could.

www.earth.org.uk:443 66.249.64.135 - - [10/Aug/2021:01:06:12 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 200 14408 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
www.earth.org.uk:443 66.249.64.128 - - [10/Aug/2021:01:58:56 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 200 14408 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
www.earth.org.uk:443 66.249.64.135 - - [10/Aug/2021:02:53:33 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 200 9595 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
www.earth.org.uk:443 66.249.64.156 - - [10/Aug/2021:03:58:33 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 200 14408 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
www.earth.org.uk:443 66.249.64.135 - - [10/Aug/2021:04:50:41 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 200 14408 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
www.earth.org.uk:443 66.249.64.156 - - [10/Aug/2021:05:32:22 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 200 14408 "-" "Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5X Build/MMB29P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.119 Mobile Safari/537.36 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
www.earth.org.uk:443 66.249.64.135 - - [10/Aug/2021:05:57:00 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 200 14408 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
m.earth.org.uk:443 66.249.64.114 - - [10/Aug/2021:06:56:32 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 200 12666 "-" "Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5X Build/MMB29P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.119 Mobile Safari/537.36 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
www.earth.org.uk:443 66.249.64.128 - - [10/Aug/2021:06:58:06 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 200 9595 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
www.earth.org.uk:443 66.249.64.156 - - [10/Aug/2021:07:16:33 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 200 14408 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
www.earth.org.uk:443 66.249.64.128 - - [10/Aug/2021:07:52:50 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 200 14408 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
www.earth.org.uk:443 66.249.64.128 - - [10/Aug/2021:08:56:15 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 200 14408 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
www.earth.org.uk:443 66.249.64.128 - - [10/Aug/2021:09:56:45 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 200 14408 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
www.earth.org.uk:443 66.249.64.156 - - [10/Aug/2021:10:26:55 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 200 14408 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
www.earth.org.uk:443 66.249.64.135 - - [10/Aug/2021:10:59:01 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 200 14408 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
www.earth.org.uk:443 66.249.64.135 - - [10/Aug/2021:12:03:40 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 200 14436 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
www.earth.org.uk:443 66.249.64.135 - - [10/Aug/2021:13:11:17 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 200 14436 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
www.earth.org.uk:443 66.249.64.135 - - [10/Aug/2021:14:07:09 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 200 14436 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
www.earth.org.uk:443 66.249.64.135 - - [10/Aug/2021:14:59:27 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 200 14436 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
www.earth.org.uk:443 66.249.64.135 - - [10/Aug/2021:16:07:41 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 200 14436 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
www.earth.org.uk:443 66.249.64.156 - - [10/Aug/2021:17:01:44 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 200 14436 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
www.earth.org.uk:443 66.249.64.128 - - [10/Aug/2021:18:09:51 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 200 14436 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
www.earth.org.uk:443 66.249.64.128 - - [10/Aug/2021:19:13:43 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 200 14436 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
www.earth.org.uk:443 66.249.64.156 - - [10/Aug/2021:20:07:07 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 200 14436 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
www.earth.org.uk:443 66.249.64.156 - - [10/Aug/2021:20:58:52 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 200 14436 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
www.earth.org.uk:443 66.249.64.135 - - [10/Aug/2021:21:54:47 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 200 14436 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
www.earth.org.uk:443 66.249.64.156 - - [10/Aug/2021:22:53:30 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 200 14436 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
www.earth.org.uk:443 66.249.64.156 - - [10/Aug/2021:23:45:53 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 200 14436 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
www.earth.org.uk:443 66.249.64.135 - - [11/Aug/2021:00:49:12 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 200 14436 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
www.earth.org.uk:443 66.249.64.135 - - [11/Aug/2021:01:53:49 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 200 14436 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
www.earth.org.uk:443 66.249.64.128 - - [11/Aug/2021:02:50:50 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 200 14436 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
www.earth.org.uk:443 66.249.64.128 - - [11/Aug/2021:03:57:21 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 200 14436 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
www.earth.org.uk:443 66.249.64.156 - - [11/Aug/2021:05:03:27 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 200 14436 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
www.earth.org.uk:443 66.249.64.156 - - [11/Aug/2021:06:09:51 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 200 14436 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
www.earth.org.uk:443 66.249.64.128 - - [11/Aug/2021:07:17:38 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 200 14436 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
www.earth.org.uk:443 66.249.64.128 - - [11/Aug/2021:08:17:43 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 200 14436 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
www.earth.org.uk:443 66.249.64.135 - - [11/Aug/2021:09:11:07 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 200 14436 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
www.earth.org.uk:443 66.249.64.156 - - [11/Aug/2021:10:06:05 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 200 14436 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
www.earth.org.uk:443 66.249.64.156 - - [11/Aug/2021:11:09:43 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 200 14436 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
www.earth.org.uk:443 66.249.64.156 - - [11/Aug/2021:12:09:32 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 200 14436 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
www.earth.org.uk:443 66.249.64.156 - - [11/Aug/2021:12:20:15 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 200 14436 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
www.earth.org.uk:443 66.249.64.156 - - [11/Aug/2021:13:14:58 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 200 14436 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
www.earth.org.uk:443 66.249.64.128 - - [11/Aug/2021:13:17:54 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 304 5088 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
m.earth.org.uk:443 66.249.64.118 - - [11/Aug/2021:13:32:19 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 200 12666 "-" "Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5X Build/MMB29P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.119 Mobile Safari/537.36 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
www.earth.org.uk:443 66.249.64.128 - - [11/Aug/2021:14:26:14 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 200 14436 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
www.earth.org.uk:443 66.249.64.156 - - [11/Aug/2021:15:26:49 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 200 14436 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
www.earth.org.uk:443 66.249.64.156 - - [11/Aug/2021:16:19:34 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 200 14405 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
www.earth.org.uk:443 66.249.64.156 - - [11/Aug/2021:16:19:42 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 200 14405 "-" "Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5X Build/MMB29P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.119 Mobile Safari/537.36 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
www.earth.org.uk:443 66.249.64.135 - - [11/Aug/2021:17:25:27 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 200 14405 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
www.earth.org.uk:443 66.249.64.128 - - [11/Aug/2021:18:22:02 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 200 14405 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
www.earth.org.uk:443 66.249.64.156 - - [11/Aug/2021:18:55:38 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 200 14405 "-" "Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5X Build/MMB29P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.119 Mobile Safari/537.36 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
www.earth.org.uk:443 66.249.64.156 - - [11/Aug/2021:19:21:56 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 200 14405 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
www.earth.org.uk:443 66.249.64.128 - - [11/Aug/2021:20:14:43 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 200 14405 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
www.earth.org.uk:443 66.249.64.156 - - [11/Aug/2021:21:15:39 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 200 14405 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
www.earth.org.uk:443 66.249.64.128 - - [11/Aug/2021:21:52:49 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 200 14405 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
www.earth.org.uk:443 66.249.64.135 - - [11/Aug/2021:22:08:38 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 200 14405 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
www.earth.org.uk:80 66.249.64.156 - - [11/Aug/2021:22:42:14 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 200 9535 "-" "Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5X Build/MMB29P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.119 Mobile Safari/537.36 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
www.earth.org.uk:443 66.249.64.128 - - [11/Aug/2021:23:01:29 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 200 14405 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
www.earth.org.uk:443 66.249.64.135 - - [11/Aug/2021:23:53:35 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 200 14405 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
www.earth.org.uk:443 66.249.64.156 - - [12/Aug/2021:00:53:13 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 200 14405 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
www.earth.org.uk:443 66.249.64.156 - - [12/Aug/2021:01:38:59 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 200 14405 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
www.earth.org.uk:443 66.249.64.135 - - [12/Aug/2021:01:49:20 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 200 14405 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
www.earth.org.uk:443 66.249.64.156 - - [12/Aug/2021:02:48:38 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 200 14405 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
www.earth.org.uk:443 66.249.64.135 - - [12/Aug/2021:03:51:41 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 200 14405 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
www.earth.org.uk:443 66.249.64.156 - - [12/Aug/2021:04:52:56 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 200 14405 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
www.earth.org.uk:443 66.249.64.156 - - [12/Aug/2021:05:50:06 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 200 14405 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
www.earth.org.uk:443 66.249.64.156 - - [12/Aug/2021:05:56:53 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 304 5088 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
www.earth.org.uk:443 66.249.64.135 - - [12/Aug/2021:06:58:18 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 200 14405 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
www.earth.org.uk:443 66.249.64.156 - - [12/Aug/2021:07:55:06 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 200 14405 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
www.earth.org.uk:443 66.249.64.128 - - [12/Aug/2021:08:58:06 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 200 14405 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
www.earth.org.uk:443 66.249.64.156 - - [12/Aug/2021:10:01:37 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 200 14405 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
www.earth.org.uk:443 66.249.64.128 - - [12/Aug/2021:11:04:19 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 200 14405 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
www.earth.org.uk:443 66.249.64.156 - - [12/Aug/2021:12:02:58 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 200 14405 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
www.earth.org.uk:443 66.249.64.156 - - [12/Aug/2021:12:55:05 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 200 14449 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
www.earth.org.uk:443 66.249.64.156 - - [12/Aug/2021:13:52:14 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 200 14449 "-" "Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5X Build/MMB29P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.119 Mobile Safari/537.36 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
www.earth.org.uk:443 66.249.64.156 - - [12/Aug/2021:13:59:03 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 200 14449 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
www.earth.org.uk:443 66.249.64.156 - - [12/Aug/2021:15:03:16 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 200 14449 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
www.earth.org.uk:443 66.249.64.156 - - [12/Aug/2021:16:06:08 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 200 14449 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
www.earth.org.uk:443 66.249.64.135 - - [12/Aug/2021:17:10:52 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 200 14449 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
www.earth.org.uk:443 66.249.64.156 - - [12/Aug/2021:18:09:04 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 200 14449 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
www.earth.org.uk:443 66.249.64.156 - - [12/Aug/2021:19:12:10 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 200 14449 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
www.earth.org.uk:443 66.249.64.135 - - [12/Aug/2021:20:07:22 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 200 14449 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
www.earth.org.uk:443 66.249.64.135 - - [12/Aug/2021:21:13:32 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 200 14449 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
www.earth.org.uk:443 66.249.64.156 - - [12/Aug/2021:22:11:29 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 200 14449 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
www.earth.org.uk:443 66.249.64.156 - - [12/Aug/2021:23:15:38 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 200 14449 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
www.earth.org.uk:443 66.249.64.128 - - [12/Aug/2021:23:40:04 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 304 5088 "-" "Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5X Build/MMB29P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.119 Mobile Safari/537.36 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
www.earth.org.uk:443 66.249.64.156 - - [13/Aug/2021:00:08:45 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 200 14449 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
www.earth.org.uk:443 66.249.64.128 - - [13/Aug/2021:00:26:57 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 200 14449 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
www.earth.org.uk:443 66.249.64.156 - - [13/Aug/2021:01:05:00 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 200 14449 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
www.earth.org.uk:443 66.249.64.156 - - [13/Aug/2021:01:56:00 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 200 14449 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
www.earth.org.uk:443 66.249.64.135 - - [13/Aug/2021:03:03:12 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 200 14449 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
www.earth.org.uk:443 66.249.64.128 - - [13/Aug/2021:03:56:53 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 200 14449 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
www.earth.org.uk:443 66.249.64.128 - - [13/Aug/2021:05:02:56 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 200 14449 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
www.earth.org.uk:443 66.249.64.156 - - [13/Aug/2021:06:10:35 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 200 14449 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
www.earth.org.uk:443 66.249.64.128 - - [13/Aug/2021:07:14:52 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 200 14449 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
www.earth.org.uk:443 66.249.64.135 - - [13/Aug/2021:08:06:34 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 200 9636 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
www.earth.org.uk:443 66.249.64.135 - - [13/Aug/2021:09:05:02 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 200 14449 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
www.earth.org.uk:443 66.249.64.128 - - [13/Aug/2021:10:02:38 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 200 14449 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
www.earth.org.uk:443 66.249.64.128 - - [13/Aug/2021:11:03:17 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 200 14449 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
www.earth.org.uk:443 66.249.64.135 - - [13/Aug/2021:11:16:52 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 200 14449 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
www.earth.org.uk:443 66.249.64.135 - - [13/Aug/2021:12:12:04 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 200 14449 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
www.earth.org.uk:443 66.249.64.135 - - [13/Aug/2021:12:16:50 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 304 5088 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
www.earth.org.uk:443 66.249.69.176 - - [13/Aug/2021:13:08:12 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 200 14449 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
www.earth.org.uk:443 66.249.69.176 - - [13/Aug/2021:14:07:06 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 200 14449 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
www.earth.org.uk:443 66.249.69.174 - - [13/Aug/2021:15:10:56 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 200 14449 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
www.earth.org.uk:443 66.249.69.178 - - [13/Aug/2021:16:06:07 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 200 14449 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
www.earth.org.uk:443 66.249.69.174 - - [13/Aug/2021:17:03:51 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 200 14449 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
www.earth.org.uk:443 66.249.69.174 - - [13/Aug/2021:18:08:45 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 200 14449 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
www.earth.org.uk:443 66.249.69.178 - - [13/Aug/2021:19:15:45 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 200 14449 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
www.earth.org.uk:443 66.249.69.178 - - [13/Aug/2021:20:19:06 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 200 14449 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
www.earth.org.uk:443 66.249.69.178 - - [13/Aug/2021:21:15:01 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 200 14449 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
www.earth.org.uk:443 66.249.69.178 - - [13/Aug/2021:22:21:54 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 200 14449 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
m.earth.org.uk:443 66.249.69.146 - - [13/Aug/2021:22:31:11 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 200 12666 "-" "Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5X Build/MMB29P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.119 Mobile Safari/537.36 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
www.earth.org.uk:443 66.249.69.176 - - [13/Aug/2021:23:23:20 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 200 14449 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
www.earth.org.uk:443 66.249.69.174 - - [14/Aug/2021:00:20:26 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 200 14449 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
www.earth.org.uk:443 66.249.69.174 - - [14/Aug/2021:01:21:46 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 200 14449 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
www.earth.org.uk:443 66.249.69.174 - - [14/Aug/2021:02:16:36 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 200 14449 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
www.earth.org.uk:443 66.249.69.174 - - [14/Aug/2021:03:06:43 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 200 14449 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
www.earth.org.uk:443 66.249.69.174 - - [14/Aug/2021:03:25:08 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 200 14449 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
www.earth.org.uk:443 66.249.69.170 - - [14/Aug/2021:04:32:36 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 200 14449 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
www.earth.org.uk:443 66.249.69.174 - - [14/Aug/2021:05:25:37 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 200 14449 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
www.earth.org.uk:443 66.249.69.176 - - [14/Aug/2021:06:18:53 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 200 14449 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
www.earth.org.uk:443 66.249.69.178 - - [14/Aug/2021:07:25:52 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 200 14449 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
www.earth.org.uk:443 66.249.69.170 - - [14/Aug/2021:08:30:50 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 200 14449 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
www.earth.org.uk:443 66.249.69.178 - - [14/Aug/2021:09:31:10 +0000] "GET /MHRV-Vent-Axia-Lo-Carbon-Tempra-P-REVIEW.html HTTP/1.1" 200 14449 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"

2021-08-13: AMP Sneaks Back

Yesterday the count of AMP pages in GSC went up again, to 2! No, the pages really are not there...

By the following afternoon the AMP report is showing a count of 0, though the overview still shows 2.

JXL for JPEG input

In V0.5.0 the -j flag is required to allow a lossy JPEG output at a target size:

% cjxl -v -e 9 -j --target_size=10000 img.jpg out.jxl

Here is a real example, with target size in bytes set to ~50% of the source:

% cjxl -v -j -e 9 --progressive --target_size=15000 img/SIKP2000/SIKP2000-next-to-fixed-hob-800w.jpg img/SIKP2000/SIKP2000-next-to-fixed-hob-800w.jpg.jxl
JPEG XL encoder v0.5.0 [AVX2,SSE4]
Butteraugli distance 2.983 yields  25092 bytes, 0.834 bpp.
Butteraugli distance 4.990 yields  17538 bytes, 0.583 bpp.
Butteraugli distance 5.834 yields  15701 bytes, 0.522 bpp.
Butteraugli distance 6.107 yields  15292 bytes, 0.508 bpp.
Butteraugli distance 6.226 yields  15093 bytes, 0.501 bpp.
Butteraugli distance 6.264 yields  14990 bytes, 0.498 bpp.
Butteraugli distance 6.260 yields  15939 bytes, 0.530 bpp.
Read 800x301 image, 37.6 MP/s
Encoding [VarDCT, d6.264, tortoise], 2 threads.
Compressed to 14990 bytes (0.498 bpp).
800 x 301, 0.07 MP/s [0.07, 0.07], 1 reps, 2 threads.
Average butteraugli iters:       5.00
Total layer bits headers          0.109300%        96
Total layer bits TOC              0.291466%       256
Total layer bits quantizer        0.017078%        15
Total layer bits quant tables     0.002277%         2
Total layer bits order            1.703252%      1496   [c/i:  5.00 | hst:      33 | ex:      37 | h+c+e:     195.132]
Total layer bits DC               0.001139%         1
Total layer bits ControlFields    9.383824%      8242
Total layer bits AC               7.980007%      7009   [c/i: 18.00 | hst:     858 | ex:       0 | h+c+e:    9383.687]
Total layer bits ACTokens        79.098734%     69474
Total layer bits dictionary       0.857319%       753   [c/i:  5.00 | hst:      17 | ex:      10 | h+c+e:      63.142]
Total layer bits modularGlobal    0.441752%       388   [c/i:  6.00 | hst:      48 | ex:       0 | h+c+e:    1010.020]
Total layer bits modularTree      0.113854%       100   [c/i:  1.00 | hst:       1 | ex:       1 | h+c+e:      11.616]
Total image size                87832   [c/i: 35.00 | hst:     959 | ex:     260 | h+c+e:   10874.097]
Allocations: 35223 (max bytes in use: 7.853485E+07)
% ls -al img/SIKP2000/SIKP2000-next-to-fixed-hob-800w.jpg*
34550 img/SIKP2000/SIKP2000-next-to-fixed-hob-800w.jpg
27956 img/SIKP2000/SIKP2000-next-to-fixed-hob-800w.jpg.avif
14990 img/SIKP2000/SIKP2000-next-to-fixed-hob-800w.jpg.jxl

2021-08-12: WebP from JPEG

I am being a bit bold today.

I am trying WebP as an alternate compact format for JPEG hero images. Yes, lossy even though I assumed I'd only use WebP for lossless!

I measure the PSNR of my generated JPEG image vs a lossless equivalent. I them try to match that with the WebP (plus a fudge factor).

The core commands being used are:

TARGETPSNR=`compare -metric PSNR $NOLOSSTMP $imain null: 2>&1 | awk '{print ($1 + 4.5)}'`
cwebp -quiet -mt -psnr $TARGETPSNR -pass 10 -m 6 -af $NOLOSSTMP -o $itmp

The fudge factor is quite large (+4.5dB) and the WebP images amazingly small. They look a little less good than the JPEGs that they replace, but not bad.

To force (re)build of just the relevant images to create WebPs, requires:

% rm img/a/h/.flags/*.jpg*

Size savings of between ~25% and ~75% are being seen so far. The low end of that seems typical, but very much worth having.

fan

See for example various versions of the fan image.

39058 fan-sq.l403381.800x200.jpg
24872 fan-sq.l403381.800x200.jpg.webp
11868 fan-sq.l403381.800x200.jpgL
 8532 fan-sq.l403381.800x200.jpg.webpL

As a CPU-saving measure I have for now turned off generation of lo-fi (L) and alternate-format (eg WebP) images for high-pixel density displays. This on the grounds that users with such devices may be less bandwidth sensitive, and almost no one has Save-Data enabled anyway, and the m-dot lite site is available when needed.

I could also save some effort by turning off alternate formats for body images, where I am not currently making use of them. But I may try doing so soon (I have a cunning plan)!

Success

~90% of desktop pages how have top heroes with a more-compact alternate format:

% egrep -L '<picture>.*((webp)|(avif)|(jxl)).*</picture>' *.html | wc -l
      33
% egrep -l '<picture>.*((webp)|(avif)|(jxl)).*</picture>' *.html | wc -l
     295

Only a few have (hand-crafted or iLIMG) AVIF or JXL alternates:

% egrep -l '<picture>.*((avif)|(jxl)).*</picture>' *.html | wc -l
      28

2021-08-11: AVIF Playtime

I am going to try manually transcoding a couple of JPEGs to AVIF crudely. Firstly the transcode will be from the JPEG, whereas they should both be from a higher-resolution master to avoid AVIF trying to encode JPEG artefacts.

On my Mac:

brew install joedrago/repo/avifenc

First use (trying lossless) is not covering itself with glory! This is not my intended use case, however. I am expecting/hoping to use this as a JPEG improver, ie lossy.

% avifenc --lossless --speed 0 img/travel/train-fast.png img/travel/train-fast.png.avif
Successfully loaded: img/travel/train-fast.png
AVIF to be written: (Lossless)
 * Resolution     : 1280x640
 * Bit Depth      : 8
 * Format         : YUV444
 * Alpha          : Not premultiplied
 * Range          : Full
 * Color Primaries: 1
 * Transfer Char. : 13
 * Matrix Coeffs. : 0
 * ICC Profile    : Absent (0 bytes)
 * XMP Metadata   : Absent (0 bytes)
 * EXIF Metadata  : Absent (0 bytes)
 * Transformations: None
Encoding with AV1 codec 'aom' speed [0], color QP [0 (Lossless) <-> 0 (Lossless)], alpha QP [0 (Lossless) <-> 0 (Lossless)], tileRowsLog2 [0], tileColsLog2 [0], 1 worker thread(s), please wait...
Encoded successfully.
 * Color AV1 total size: 123667 bytes
 * Alpha AV1 total size: 15970 bytes
Wrote AVIF: img/travel/train-fast.png.avif
% ls -alS img/travel/train-fast.png*
140094 img/travel/train-fast.png.avif
 26736 img/travel/train-fast.png
 24802 img/travel/train-fast.png.webp
 17729 img/travel/train-fast.png.jxl

The first couple of hero JPEGs I have tried this on have come down in size ~40%. I cannot see any obvious unpleasant artefacts. I have admitted 'avif' to the set of compact formats supported at page build, though AVIFs cannot yet be automatically generated. The full set of allowed alternates is now jxl avif webp.

% avifenc --speed 0 image.jpg image.jpg.avif
37014 img/OpenTRV/20201112-EcoHome-Lab-talk-banner-hires.jpg
21128 img/OpenTRV/20201112-EcoHome-Lab-talk-banner-hires.jpg.avif
18557 img/wind/Hageman-chord.jpg
10731 img/wind/Hageman-chord.jpg.avif

Possible pages with JPEG heroes used as-is that may be worth of hand-optimised AVIF versions:

% egrep -l '[^0l].jpg></picture>' *.html
catalogue-of-aerodynamic-characteristics-of-airfoils.html
note-on-Better-Futures-meeting-at-London-City-Hall.html
note-on-Method-Laundry-Detergent-REVIEW.html
note-on-Raspberry-Pi-2-setup.html
note-on-Raspberry-Pi-setup.html
note-on-Salford-Energy-House.html
note-on-SilverCrest-Portable-Induction-Hob-SIKP-2000-A1-REVIEW.html
smart-radiator-valves-talk-20201112.html

In total I created .jpg.avif derivatives of eight .jpg images that are used as-is for hero images. All showed decent size reduction with no obvious image degradation.

Being able to fetch or build a avifenc for the RPi server, to allowed automated conversions of the widest possible set of hero JPEGs, is proving difficult at the moment...

npx @squoosh/cli may be a way ahead, as it may portably (if slowly) run the AVIF (and JXL) codecs in WebASM. But I am just getting various errors (eg about import unexpected) for now...

2021-08-09: JXL Edge Case?

See libjxl issue: cjxl lossless encoding of PNG much larger than input #426.

data
PNG that upsets JXL!

Even though cwebp manages to make the above image smaller, cjxl makes it larger, up to 66% larger!

% cwebp -v -lossless -m 6 -q 100 img/data.png -o img/data.png.web
% cjxl -v -s 9 -q 100 -E 3 -I 1 img/data.png img/data.png.jxl

8130 img/data.png
6820 img/data.png.webp
8642 img/data.png.jxl

(cjxl at v0.3.7, cwebp at 1.2.0)

-E 3 -I 1 at suggestion of @jonsneyers

With cjxl v0.5.0:

% cjxl -e 9 -g 3 -I 0 -P 0 --patches 0
JPEG XL encoder v0.5.0 [AVX2,SSE4]
Read 800x153 image, 32.2 MP/s
Encoding [VarDCT, d1.000, tortoise], 2 threads.
Failed to compress to VarDCT.

and:
% cjxl -v -e 9 -q 100 img/data.png
Compressed to 10485 bytes (0.685 bpp).
% cjxl -v -e 9 -q 100 -E 3 -I 1 img/data.png
Compressed to 13508 bytes (0.883 bpp).

Expected behavior
A JXL output file smaller than the input PNG.

Environment
    OS: macOS: Darwin localhost 20.6.0 Darwin Kernel Version 20.6.0: Wed Jun 23 00:26:31 PDT 2021; root:xnu-7195.141.2~5/RELEASE_X86_64 x86_64
    Compiler version: pre-built binaries from Homebrew.
    CPU type: x86_64
    cjxl/djxl version string: v0.3.7 and v0.5.0 [AVX2,SSE4]

I have manually constructed WebP and JXL versions of a few hero images that get used as-is, and have modified the image selection code to offer them smallest first as sources in the picture

2021-08-07: Ko-fi on the House

I have created a house ad featuring Patreon and Ko-fi for those pages from which ads were excluded only because the pages were not popular.

So the house ad will not appear on noindex or error or very short pages.

(I took the opportunity to close my PayPal account after ~19 years!)

2021-08-06: Ko-fi

I have experimentally set up Ko-fi. As my PayPal has been borked for years, I have also experimentally set up Stripe for Ko-fi!

2021-08-05: Lingering

For some reason GSC is continuing to believe that there is AMP for just one page, and that the HTTP version is canonical, it appears.

GSC gives a last crawl date (for the HTTP page) of 10 Jun 2021, 05:11:48.

2021-08-04: Moar Literer

The sheer hedonism!

  1. I have eliminated hero images entirely from lite (m-dot) pages.
  2. I have made the 'mobile' (smaller) hero image the same aspect ratio (4:1) as for desktop pages to eliminate CLS (Cumulative Layout Shift) when narrower devices visit desktop pages.
  3. I made a number of minor adjustments to save weight of some lite pages, eg removing all video-related information from lite page headers.

This really does make the 'lite' pages' HTML significantly lighter than the desktop / full-fat versions, often 10%--20%, with and without compression.

2021-08-03: Improved cwebp

The cwebp PNG-to-WebP conversion on the server (sencha) was giving consistently worse results (0.5.2) than on my laptop (1.2.0). So I manually built a binary from the github 1.2.0 release and installed in the server's /usr/local/bin. I adjusted the the hero-image generation script to use that by preference.

I removed the 'DONE' flags for all hero images with WebP variants, so that and the change in the hero-image generation script, is getting all the appropriate WebP variants regenerated as necessary.

Sing it with me now:

% rm `ls -1 img/a/h/*webp | awk -F. '{print $1"."$2".*"}' | sort -u | sed -e 's|img/a/h/|img/a/h/.flags/|'`

The improvements are significant. Eg for the following PNGs:

2567 img/a/h/tools-1280w.l354283.640x80.l.png
2053 img/a/h/tools-1280w.l354283.640x80.l.pngL
5395 img/a/h/tools-1280w.l354283.800x200.png
4416 img/a/h/tools-1280w.l354283.800x200.pngL

Before:

% ls -al img/a/h/tools-1280w.l354283.*webp*
2080 img/a/h/tools-1280w.l354283.640x80.l.png.webp
1646 img/a/h/tools-1280w.l354283.640x80.l.png.webpL
4646 img/a/h/tools-1280w.l354283.800x200.png.webp
3840 img/a/h/tools-1280w.l354283.800x200.png.webpL

After:

% ls -al img/a/h/tools-1280w.l354283.*webp*
1994 img/a/h/tools-1280w.l354283.640x80.l.png.webp
1604 img/a/h/tools-1280w.l354283.640x80.l.png.webpL
4506 img/a/h/tools-1280w.l354283.800x200.png.webp
3748 img/a/h/tools-1280w.l354283.800x200.png.webpL

I enabled multithreading too, to speed things up a little in many cases.

$CWEBP -quiet -mt -q 100 -lossless -m 6 $imain -o $itmp

The whole of this page so far comes in at ~8kB (WebPageTest London, UK - EC2 - Chrome - Emulated Motorola G (gen 4) - DSL - Mobile). ~600B, so a little under 10%, was saved by the hero being served as WebP.