Earth Notes: On Website Technicals (2025-12)

Updated 2026-01-09 21:44 GMT.
By Damon Hart-Davis.
Tech updates: NTP battering, VTT and a/v CORS, SVN repo backup command, podcast:person, more lite, EOM, EOY.
tools 800w JA
Christmas time and maximum ad revenue are upon us...

: EOM, EOY

Today I have been doing some early preparation for data gathering for the End Of Month and End Of Year. That properly starts once the mid-evening supply/generation meters are manually read, and should finish tomorrow afternoon once all the per-month datasets are checked in, and per-year values and calculations are captured too.

Once all that is in place, a snapshot of the site and data can usefully be pushed to off-site storage and or public repositories as appropriate.

There are usually a few straggling minor data captures and corrections over the following few days, but no one other than me will notice...

I am also slightly jumping the gun and bumping the site copyright year. I know how to live...

As done today (first item) and the following day, approximately in order:

  • : Meter reads and saving-electricity capture, and paper dockets.
  • : HDD variants gathered for 2025.
  • data/16WWMonthly* datasets updated.
  • data/16WWYearly* datasets updated.
  • Per-minute Eddi 2025 data captured.
  • Verified that new FUELINST CO2 intensity numbers are being used.
  • Captured Enphase net-energy monthly report.
  • Forced update of annual chart (electricity).
  • Computed yearly 2025 CO2 energy emissions summary.
  • Forced update of annual chart (carbon).
  • Captured monthly data sets, force-updated energy series.
  • Captured and pushed to the public repository a full EOU data archive.
  • initial load profiles (including new iheat).

Ad Threshold

After noon and some dithering, EOU passed an important threshold for AdSense. Thus I have turned off ads for almost all m-dot 'lite' pages as they rebuild, to substantially reduce mean page weight.

: lower load

A couple of days later the ad load for desktop pages has been turned down too...

: half life

As of today's sunshine-fuelled weekly refresh, the number of pages with ads has dropped from ~200 to ~100.

I also brought the Google AdSense code insert up to date (hmm, ).

I trimmed the main page wrapper script a little for AdSense stuff, mainly removing AMP-special-case cruft.

: Podcast 2.0 'Person'

I have added a channel-level podcast:person entry to the podcast (main and 'lite') feeds.

<podcast:person>Damon Hart-Davis</podcast:person>

Before this change, with no new podcast material since , the greedy-feeders stats/defence looked like:

# Greedy podcast feed pullers: keys are MD5 hashed User-Agent.
# A non-empty txt map lookup of the %{md5:%{HTTP:User-Agent}} means bad!
# Built:  (UTC)
# MAXHITSPERUAPERDAY: 10
# MAXUAS: 25
#----------------
# request-count User-Agent
# MD5hash approx-hits-per-day
#----------------
# 474 iTMS
97f76eb7e02c5ff923e1198ff1c288cd 474
# 308 Podbean/FeedUpdat
54e0e9df937b06cc83fab29f44c02b7f 308
# 203 Spotify/1.0
4582d9bdbcef42af27d89da91c6eb804 203
# 138 Google-Podcast
8dea568b39db0451edd6b30f29238eaf 138
# 56 -
d41d8cd98f00b204e9800998ecf8427e 56
# 51 Amazon Music Podc
d69be2563c9f1929edf2906d41809aea 51
# 34 MuckRackFeedParse
62b46fff1cf5f8af7b4b37a2f783b57a 34
# 19 itms
2e7f714a929b3f52f3c094710819a99a 19
# 12 axios/1.6.8
b534882134248c9a5957e0c011a37037 12
# 11 FeedMaster/4.1
dca30fcc6f45af71c2825280bebba04d 11
# 10 Mozilla/5.0 (Wind
6b9a00393fb1607b0ada13520f814ab5 10
# 10 axios/1.11.0
5c8ae194a6f98a725c992886f3da6e04 10

The updated RSS feeds were checked with Cast Feed Validator.

: VTT CORS Problem

I have observed problems with, for example, audio on the m-dot site refusing to fetch the .vtt captions, complaining Not same-origin.

An access-control-allow-origin: * header is sent with VTT responses, but in this case the browser is not even trying to fetch the file.

I have added an crossorigin=anonymous attribute (where there is a VTT file available) to generated audio tags for non-desktop (eg m-dot) pages that will be making a cross-domain request back to the www-dot desktop site.

That allowed the VTT file to be fetched (hurrah), but now all the media (eg Opus, MP3) files are complaining CORS Missing Allow Origin.

I am going to have to set the access-control-allow-origin: * header for any media file that the audio tag (and in due course video) may want to play. That should be safe for all static-served MIME-type audio/* (and in due course video/*) content.

So as a first step to keep things simple, the crossorigin=anonymous attribute should be unconditionally added to all generated non-desktop audio tags.

Adjusting the Apache config for the www. (and static.) sites for involves as a minimum something like:

<IfModule mod_headers.c>
    <Location /img>
        Header set Access-Control-Allow-Origin "*"
    </Location>
</IfModule>

This will burden non audio/video responses with an extra header, so refining it would save bandwidth at a little server CPU cost, eg:

SetEnvIf Content-Type "^((audio)|(video))/.*" TYPE_AV
<IfModule mod_headers.c>
    <Location /img>
        Header set Access-Control-Allow-Origin "*" env=TYPE_AV
    </Location>
</IfModule>

The auto-generated non-desktop video tags are getting the same new crossorigin=anonymous attribute.

Closed captioning for m-dot video is now reported to work by one other person!

It seems that an empty attribute value will do for crossorigin, thus saving a few bytes!

SVN repo backup command

In a few days I want to remember to run (and copy the result off-site):

tar vcfJ SVN-general-www.hd.org.20260102.tar.xz --sort=name general/www.hd.org/

: NTP Battery

About 18 months ago I was getting fed up with the volume of NTP traffic still hitting my no-longer stratum-1 server on my little RPi3.

Getting out of being people's secondary authoritative DNS server is hard in a similar vein...

I had tried many ways to mitigate such traffic, I suspected in part baked into software or even consumer device firmware, so took the drastic step of removing the ntp1.exnet.com DNS entry, though did not otherwise adjust the server.

Did it help? Maybe, maybe not, but there are still ~20 NTP packets per second, including replies to the queries that the server does not now ignore outright.

~995 words.