<?xml version='1.0' encoding='UTF-8'?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
  <id>https://www.yakshaving.co.uk</id>
  <title>Blog In Isolation</title>
  <updated>2026-06-07T10:03:53.072416+00:00</updated>
  <link href="https://www.yakshaving.co.uk/feeds/blogging.atom.xml" rel="self"/>
  <link href="https://www.yakshaving.co.uk" rel="alternate"/>
  <generator uri="https://lkiesow.github.io/python-feedgen" version="1.0.0">python-feedgen</generator>
  <subtitle>Posts in category "blogging" from Blog In Isolation</subtitle>
  <entry>
    <id>https://www.yakshaving.co.uk/posts/blogmore-performance/</id>
    <title>BlogMore performance</title>
    <updated>2026-05-08T18:41:12+01:00</updated>
    <content type="html">&lt;p&gt;&lt;a href="https://blogmore.davep.dev/" rel="noopener noreferrer" target="_blank"&gt;BlogMore&lt;/a&gt; generates my site (1,000 posts) in less than 10 seconds
but I was idly wondering what the incremental cost of the additional
functionality &lt;a href="https://blog.davep.org/" rel="noopener noreferrer" target="_blank"&gt;davep&lt;/a&gt; has been busy &lt;a href="https://github.com/davep/blogmore" rel="noopener noreferrer" target="_blank"&gt;adding&lt;/a&gt; recently.&lt;/p&gt;
&lt;p&gt;The baseline run was with all optional features disabled. The tests
were executed on Linux and the elapsed time was obtained from the
&lt;code&gt;time&lt;/code&gt; command. Each test was executed three times and the average
elapsed time used.&lt;/p&gt;
&lt;div class="highlight" data-lang="YAML"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nt"&gt;with_search&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;false&lt;/span&gt;
&lt;span class="nt"&gt;with_sitemap&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;false&lt;/span&gt;
&lt;span class="nt"&gt;with_stats&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;false&lt;/span&gt;
&lt;span class="nt"&gt;with_read_time&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;false&lt;/span&gt;
&lt;span class="nt"&gt;with_graph&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;false&lt;/span&gt;
&lt;span class="nt"&gt;with_backlinks&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;false&lt;/span&gt;
&lt;span class="nt"&gt;invite_comments&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;false&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="text-align: left;"&gt;Run&lt;/th&gt;
&lt;th style="text-align: left;"&gt;Elapsed (secs)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;Baseline&lt;/td&gt;
&lt;td style="text-align: left;"&gt;8.546&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;Search enabled&lt;/td&gt;
&lt;td style="text-align: left;"&gt;8.749&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;Sitemap enabled&lt;/td&gt;
&lt;td style="text-align: left;"&gt;8.869&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;Stats enabled&lt;/td&gt;
&lt;td style="text-align: left;"&gt;9.140&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;Read time enabled&lt;/td&gt;
&lt;td style="text-align: left;"&gt;9.843&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;Graph enabled&lt;/td&gt;
&lt;td style="text-align: left;"&gt;11.406&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;Backlinks enabled&lt;/td&gt;
&lt;td style="text-align: left;"&gt;12.785&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;Comments enabled&lt;/td&gt;
&lt;td style="text-align: left;"&gt;12.827&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Unsurprisingly perhaps, the generation of backlinks and computing the
graph are the most expensive elements but still perfectly acceptable.&lt;/p&gt;</content>
    <link href="https://www.yakshaving.co.uk/posts/blogmore-performance/"/>
    <category term="blogging"/>
    <category term="BlogMore"/>
    <published>2026-05-08T18:41:12+01:00</published>
  </entry>
  <entry>
    <id>https://www.yakshaving.co.uk/posts/converting-images-to-webp-format/</id>
    <title>converting JPEG and PNG images to WebP format</title>
    <updated>2026-04-15T14:46:24+01:00</updated>
    <content type="html">&lt;p&gt;People tell me the '&lt;a href="https://en.wikipedia.org/wiki/WebP" rel="noopener noreferrer" target="_blank"&gt;WebP&lt;/a&gt;' format is the recommended format for
images displayed on a Web site as WebP files are smaller than PNG and
JPEG formats. My site uses JPEG and PNG image formats. The advent of
WebP is hardly news but I'm always late to the party.&lt;/p&gt;
&lt;p&gt;There is a WebP &lt;a href="https://aur.archlinux.org/packages/webp-converter-git" rel="noopener noreferrer" target="_blank"&gt;converter&lt;/a&gt; available in the Arch Linux AUR
repository.&lt;/p&gt;
&lt;p&gt;This looks promising so I immediately go to install it.&lt;/p&gt;
&lt;div class="highlight" data-lang="bash"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;yay&lt;span class="w"&gt; &lt;/span&gt;-S&lt;span class="w"&gt; &lt;/span&gt;webp-converter-git
Sync&lt;span class="w"&gt; &lt;/span&gt;Make&lt;span class="w"&gt; &lt;/span&gt;Dependency&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;7&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;:&lt;span class="w"&gt; &lt;/span&gt;gendesk-1.0.10-1,&lt;span class="w"&gt; &lt;/span&gt;gn-0.2324.304bbef6-2,
&lt;span class="w"&gt;    &lt;/span&gt;rust-bindgen-0.72.1-2,&lt;span class="w"&gt; &lt;/span&gt;gperf-3.3-2,&lt;span class="w"&gt; &lt;/span&gt;python-httplib2-0.31.2-1,
&lt;span class="w"&gt;    &lt;/span&gt;python-pyparsing-3.3.2-1,&lt;span class="w"&gt; &lt;/span&gt;patchutils-0.4.5-1
Sync&lt;span class="w"&gt; &lt;/span&gt;Dependency&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;:&lt;span class="w"&gt; &lt;/span&gt;libvips-8.18.2-1
AUR&lt;span class="w"&gt; &lt;/span&gt;Explicit&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;:&lt;span class="w"&gt; &lt;/span&gt;webp-converter-git-1.0.0.r2.gce5d96c-1
AUR&lt;span class="w"&gt; &lt;/span&gt;Dependency&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;:&lt;span class="w"&gt; &lt;/span&gt;electron33-33.4.11-2
::&lt;span class="w"&gt; &lt;/span&gt;PKGBUILD&lt;span class="w"&gt; &lt;/span&gt;up&lt;span class="w"&gt; &lt;/span&gt;to&lt;span class="w"&gt; &lt;/span&gt;date,&lt;span class="w"&gt; &lt;/span&gt;skipping&lt;span class="w"&gt; &lt;/span&gt;download:&lt;span class="w"&gt; &lt;/span&gt;webp-converter-git
::&lt;span class="w"&gt; &lt;/span&gt;PKGBUILD&lt;span class="w"&gt; &lt;/span&gt;up&lt;span class="w"&gt; &lt;/span&gt;to&lt;span class="w"&gt; &lt;/span&gt;date,&lt;span class="w"&gt; &lt;/span&gt;skipping&lt;span class="w"&gt; &lt;/span&gt;download:&lt;span class="w"&gt; &lt;/span&gt;electron33
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;webp-converter-git&lt;span class="w"&gt;                       &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;Build&lt;span class="w"&gt; &lt;/span&gt;Files&lt;span class="w"&gt; &lt;/span&gt;Exist&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;electron33&lt;span class="w"&gt;                               &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;Build&lt;span class="w"&gt; &lt;/span&gt;Files&lt;span class="w"&gt; &lt;/span&gt;Exist&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;==&lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;Packages&lt;span class="w"&gt; &lt;/span&gt;to&lt;span class="w"&gt; &lt;/span&gt;cleanBuild?
&lt;span class="o"&gt;==&lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;N&lt;span class="o"&gt;]&lt;/span&gt;one&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;A&lt;span class="o"&gt;]&lt;/span&gt;ll&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;Ab&lt;span class="o"&gt;]&lt;/span&gt;ort&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;I&lt;span class="o"&gt;]&lt;/span&gt;nstalled&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;No&lt;span class="o"&gt;]&lt;/span&gt;tInstalled&lt;span class="w"&gt; &lt;/span&gt;or&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;-3,&lt;span class="w"&gt; &lt;/span&gt;^4&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Oh no, hang on, wait. it's a bloated Electron application with a lot
of dependent Rust and Python packages. Forget that.&lt;/p&gt;
&lt;p&gt;However, I recall that Emacs uses the '&lt;a href="https://imagemagick.org/" rel="noopener noreferrer" target="_blank"&gt;imagemagick&lt;/a&gt;' package which
is already installed and includes a utility (&lt;a href="https://imagemagick.org/mogrify/" rel="noopener noreferrer" target="_blank"&gt;mogrify&lt;/a&gt;) that can
perform the same conversion (from JPEG/PNG to WebP).&lt;/p&gt;
&lt;div class="highlight" data-lang="bash"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;mogrify&lt;span class="w"&gt; &lt;/span&gt;-format&lt;span class="w"&gt; &lt;/span&gt;webp&lt;span class="w"&gt; &lt;/span&gt;-quality&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;80&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2026&lt;/span&gt;-04-14-BlogMore-DraftPost.png
$&lt;span class="w"&gt; &lt;/span&gt;ls&lt;span class="w"&gt; &lt;/span&gt;-lh&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2026&lt;/span&gt;*
100k&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="m"&gt;2026&lt;/span&gt;-04-14-BlogMore-DraftPost.png
44k&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="m"&gt;2026&lt;/span&gt;-04-14-BlogMore-DraftPost.webp
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Half the size. Compare the PNG versus the WebP image. Copy the WebP
file to the images directory. Update the image link in the blog post.
Job done (apart from the existing 135 images).&lt;/p&gt;</content>
    <link href="https://www.yakshaving.co.uk/posts/converting-images-to-webp-format/"/>
    <category term="blogging"/>
    <category term="Linux"/>
    <published>2026-04-15T14:46:24+01:00</published>
  </entry>
  <entry>
    <id>https://www.yakshaving.co.uk/posts/blogging-more-with-blogmore/</id>
    <title>blogging more with BlogMore</title>
    <updated>2026-04-14T11:35:56+01:00</updated>
    <content type="html">&lt;p&gt;This is my experience of migrating this blog from &lt;a href="https://gohugo.io/" rel="noopener noreferrer" target="_blank"&gt;Hugo&lt;/a&gt; to
&lt;a href="https://blogmore.davep.dev/" rel="noopener noreferrer" target="_blank"&gt;BlogMore&lt;/a&gt; (prompted by various &lt;a href="https://www.yakshaving.co.uk/posts/reflections-hugo-github-netlify/"&gt;reasons&lt;/a&gt; that initiated yet
another blog migration).&lt;/p&gt;
&lt;p&gt;The aim of the exercise was to streamline the process of publishing a
blog post to encourage me to post more frequently than once a year.&lt;/p&gt;
&lt;p&gt;My small, personal blog is hosted on Codeberg &lt;a href="https://docs.codeberg.org/codeberg-pages/" rel="noopener noreferrer" target="_blank"&gt;pages&lt;/a&gt; and I use
&lt;a href="https://archlinux.org/" rel="noopener noreferrer" target="_blank"&gt;Arch&lt;/a&gt; Linux (BTW).&lt;/p&gt;
&lt;p&gt;This post is not a substitute for the the excellent, comprehensive
&lt;a href="https://blogmore.davep.dev/" rel="noopener noreferrer" target="_blank"&gt;documentation&lt;/a&gt; which fully describes the installation,
configuration and usage of BlogMore.&lt;/p&gt;
&lt;div class="toc"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#installation"&gt;Installation&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#install-uv"&gt;Install uv&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#install-blogmore"&gt;Install BlogMore&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#updating-blogmore"&gt;Updating BlogMore&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#site-structure"&gt;Site structure&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#front-matter"&gt;Front Matter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#creating-a-post"&gt;Creating a post&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#code-blocks"&gt;Code blocks&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#building"&gt;Building&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#previewing"&gt;Previewing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#deployment"&gt;Deployment&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#publishing"&gt;Publishing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#blogmore-configuration"&gt;BlogMore configuration&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h1 id="installation"&gt;Installation&lt;/h1&gt;
&lt;h2 id="install-uv"&gt;Install uv&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://docs.astral.sh/uv/" rel="noopener noreferrer" target="_blank"&gt;uv&lt;/a&gt; is a modern, powerful Python development tool which includes
the virtualenv, pyenv and pip functionality (and much more besides).&lt;/p&gt;
&lt;p&gt;The 'uv' package is available in the Arch Linux &lt;a href="https://archlinux.org/packages/extra/x86_64/uv/" rel="noopener noreferrer" target="_blank"&gt;repository&lt;/a&gt;.&lt;/p&gt;
&lt;div class="highlight" data-lang="bash"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;yay&lt;span class="w"&gt; &lt;/span&gt;-S&lt;span class="w"&gt; &lt;/span&gt;uv
Sync&lt;span class="w"&gt; &lt;/span&gt;Explicit&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;:&lt;span class="w"&gt; &lt;/span&gt;uv-0.11.3-1
resolving&lt;span class="w"&gt; &lt;/span&gt;dependencies...
looking&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;conflicting&lt;span class="w"&gt; &lt;/span&gt;packages...

Packages&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;uv-0.11.3-1

Total&lt;span class="w"&gt; &lt;/span&gt;Download&lt;span class="w"&gt; &lt;/span&gt;Size:&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;15&lt;/span&gt;.41&lt;span class="w"&gt; &lt;/span&gt;MiB
Total&lt;span class="w"&gt; &lt;/span&gt;Installed&lt;span class="w"&gt; &lt;/span&gt;Size:&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;57&lt;/span&gt;.14&lt;span class="w"&gt; &lt;/span&gt;MiB

::&lt;span class="w"&gt; &lt;/span&gt;Proceed&lt;span class="w"&gt; &lt;/span&gt;with&lt;span class="w"&gt; &lt;/span&gt;installation?&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;Y/n&lt;span class="o"&gt;]&lt;/span&gt;
::&lt;span class="w"&gt; &lt;/span&gt;Retrieving&lt;span class="w"&gt; &lt;/span&gt;packages...
&lt;span class="w"&gt; &lt;/span&gt;uv-0.11.3-1-x86_64&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="m"&gt;15&lt;/span&gt;.4&lt;span class="w"&gt; &lt;/span&gt;MiB&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;14&lt;/span&gt;.0&lt;span class="w"&gt; &lt;/span&gt;MiB/s&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;00&lt;/span&gt;:01&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="c1"&gt;######################] 100%&lt;/span&gt;
&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;/1&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;checking&lt;span class="w"&gt; &lt;/span&gt;keys&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;keyring&lt;span class="w"&gt;                     &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="c1"&gt;######################] 100%&lt;/span&gt;
&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;/1&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;checking&lt;span class="w"&gt; &lt;/span&gt;package&lt;span class="w"&gt; &lt;/span&gt;integrity&lt;span class="w"&gt;                   &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="c1"&gt;######################] 100%&lt;/span&gt;
&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;/1&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;loading&lt;span class="w"&gt; &lt;/span&gt;package&lt;span class="w"&gt; &lt;/span&gt;files&lt;span class="w"&gt;                        &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="c1"&gt;######################] 100%&lt;/span&gt;
&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;/1&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;checking&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;file&lt;span class="w"&gt; &lt;/span&gt;conflicts&lt;span class="w"&gt;                  &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="c1"&gt;######################] 100%&lt;/span&gt;
&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;/1&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;checking&lt;span class="w"&gt; &lt;/span&gt;available&lt;span class="w"&gt; &lt;/span&gt;disk&lt;span class="w"&gt; &lt;/span&gt;space&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="c1"&gt;######################] 100%&lt;/span&gt;
::&lt;span class="w"&gt; &lt;/span&gt;Processing&lt;span class="w"&gt; &lt;/span&gt;package&lt;span class="w"&gt; &lt;/span&gt;changes...
&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;/1&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;installing&lt;span class="w"&gt; &lt;/span&gt;uv&lt;span class="w"&gt;                                &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="c1"&gt;######################] 100%&lt;/span&gt;
::&lt;span class="w"&gt; &lt;/span&gt;Running&lt;span class="w"&gt; &lt;/span&gt;post-transaction&lt;span class="w"&gt; &lt;/span&gt;hooks...
&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;/1&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Arming&lt;span class="w"&gt; &lt;/span&gt;ConditionNeedsUpdate...
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Check the version of the newly installed 'uv' package.&lt;/p&gt;
&lt;div class="highlight" data-lang="bash"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;uv&lt;span class="w"&gt; &lt;/span&gt;--version
uv&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.11.3&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;45da18ac3&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2026&lt;/span&gt;-04-01&lt;span class="w"&gt; &lt;/span&gt;x86_64-unknown-linux-gnu&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2 id="install-blogmore"&gt;Install BlogMore&lt;/h2&gt;
&lt;p&gt;Once 'uv' is available, &lt;a href="https://blogmore.davep.dev/#installation" rel="noopener noreferrer" target="_blank"&gt;installation&lt;/a&gt; of BlogMore is trivial as
'uv' automatically takes care of installing all the dependencies and
required Python packages.&lt;/p&gt;
&lt;div class="highlight" data-lang="bash"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;uv&lt;span class="w"&gt; &lt;/span&gt;tool&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;blogmore
Resolved&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;16&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;packages&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;145ms
Installed&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;16&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;packages&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;101ms
&lt;span class="w"&gt; &lt;/span&gt;+&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;blogmore&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;.9.0
&lt;span class="w"&gt; &lt;/span&gt;+&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;feedgen&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;.0.0
&lt;span class="w"&gt; &lt;/span&gt;+&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;jinja2&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;.1.6
&lt;span class="w"&gt; &lt;/span&gt;+&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;lxml&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="m"&gt;6&lt;/span&gt;.0.2
&lt;span class="w"&gt; &lt;/span&gt;+&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;markdown&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;.10.2
&lt;span class="w"&gt; &lt;/span&gt;+&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;markupsafe&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;.0.3
&lt;span class="w"&gt; &lt;/span&gt;+&lt;span class="w"&gt; &lt;/span&gt;minify-html&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.18.1
&lt;span class="w"&gt; &lt;/span&gt;+&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;pillow&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="m"&gt;12&lt;/span&gt;.2.0
&lt;span class="w"&gt; &lt;/span&gt;+&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;pygments&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;.20.0
&lt;span class="w"&gt; &lt;/span&gt;+&lt;span class="w"&gt; &lt;/span&gt;python-dateutil&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;.9.0.post0
&lt;span class="w"&gt; &lt;/span&gt;+&lt;span class="w"&gt; &lt;/span&gt;python-frontmatter&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;.1.0
&lt;span class="w"&gt; &lt;/span&gt;+&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;pyyaml&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="m"&gt;6&lt;/span&gt;.0.3
&lt;span class="w"&gt; &lt;/span&gt;+&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;rcssmin&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;.2.2
&lt;span class="w"&gt; &lt;/span&gt;+&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;rjsmin&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;.2.5
&lt;span class="w"&gt; &lt;/span&gt;+&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;six&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;.17.0
&lt;span class="w"&gt; &lt;/span&gt;+&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;watchdog&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="m"&gt;6&lt;/span&gt;.0.0
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Add the &lt;code&gt;~/.local&lt;/code&gt; directory to $PATH to make the &lt;code&gt;blogmore&lt;/code&gt; command
available.&lt;/p&gt;
&lt;div class="highlight" data-lang="bash"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;export&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="s2"&gt;/.local/bin:&lt;/span&gt;&lt;span class="nv"&gt;$PATH&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2 id="updating-blogmore"&gt;Updating BlogMore&lt;/h2&gt;
&lt;p&gt;BlogMore releases can be frequent (new functionality, bug fixes) and
the 'uv' package is also used to update BlogMore. Any updates to
dependent packages are automatically handled.&lt;/p&gt;
&lt;div class="highlight" data-lang="bash"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;uv&lt;span class="w"&gt; &lt;/span&gt;tool&lt;span class="w"&gt; &lt;/span&gt;update&lt;span class="w"&gt; &lt;/span&gt;blogmore
Updated&lt;span class="w"&gt; &lt;/span&gt;blogmore&lt;span class="w"&gt; &lt;/span&gt;v2.11.1&lt;span class="w"&gt; &lt;/span&gt;-&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;v2.13.0
&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;blogmore&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;.11.1
&lt;span class="w"&gt; &lt;/span&gt;+&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;blogmore&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;.13.0
&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;lxml&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="m"&gt;6&lt;/span&gt;.0.2
&lt;span class="w"&gt; &lt;/span&gt;+&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;lxml&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="m"&gt;6&lt;/span&gt;.0.3
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h1 id="site-structure"&gt;Site structure&lt;/h1&gt;
&lt;p&gt;As part of the migration, I reviewed the existing structure of my Hugo
site.&lt;/p&gt;
&lt;div class="highlight" data-lang="bash"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;./archetypes
./content
./content/about&lt;span class="w"&gt;                           &lt;/span&gt;&lt;span class="c1"&gt;# &amp;#39;About&amp;#39; page&lt;/span&gt;
./content/archive.md&lt;span class="w"&gt;                      &lt;/span&gt;&lt;span class="c1"&gt;# &amp;#39;Archive&amp;#39; tab on Home page&lt;/span&gt;
./content/search.md&lt;span class="w"&gt;                       &lt;/span&gt;&lt;span class="c1"&gt;# &amp;#39;Search&amp;#39; tab on Home page&lt;/span&gt;
./content/posts&lt;span class="w"&gt;                           &lt;/span&gt;&lt;span class="c1"&gt;# 1,000 posts in single directory&lt;/span&gt;
./content/posts/aboriginal-culture.md
./content/posts/a-brief-history-of-inane-drivel.md
./content/posts/absolute-disgrace.md
./content/posts/a-cause-for-concern.md
./content/posts/a-day-in-the-life.md
&lt;span class="c1"&gt;# &amp;lt;snip&amp;gt;&lt;/span&gt;
./content/posts/writing-style.md
./content/posts/yak-shaving.md
./content/posts/your-papers-please.md
./content/posts/you-were-kindness.md
./content/posts/zohowriter.md
./orgposts&lt;span class="w"&gt;                                &lt;/span&gt;&lt;span class="c1"&gt;# Orgmode posts&lt;/span&gt;
./orgposts/fun-with-static-site-generators.org
./orgposts/improving_fwp_apex_app.org
./orgposts/oracle-sql-config.org
./static
./static/images&lt;span class="w"&gt;                           &lt;/span&gt;&lt;span class="c1"&gt;# Images&lt;/span&gt;
./themes
./themes/PaperMod&lt;span class="w"&gt;                         &lt;/span&gt;&lt;span class="c1"&gt;# Papermod theme&lt;/span&gt;
./public&lt;span class="w"&gt;                                  &lt;/span&gt;&lt;span class="c1"&gt;# Generated site&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;There were a couple of things that irritated me about this setup:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Orgmode posts are stored separately from Markdown content.&lt;/li&gt;
&lt;li&gt;Markdown files derived from Orgmode posts are essentially (but
  understandably) duplicated.&lt;/li&gt;
&lt;li&gt;All 1,000 posts are stored in a single directory.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The decision to store every single post in the 'content/posts'
directory was purely historical. I started that way and never changed.
This flat structure had its advantages. Looking for patterns (posts
without any tags defined) in the front matter was easy using 'grep'.&lt;/p&gt;
&lt;p&gt;However, grep (and ripgrep) can search recursively and so I decided to
move 1,000 blog posts spanning 20 years to sub directories for each
year so this year's posts now reside under 'content/posts/2026'.&lt;/p&gt;
&lt;p&gt;Bizarrely, I found this simple change was very helpful. Previously, it
was hard to identify draft posts and find recent content. Having less
than 10 posts in the 2026 directory was more manageable.&lt;/p&gt;
&lt;h1 id="front-matter"&gt;Front Matter&lt;/h1&gt;
&lt;p&gt;Any blog migration will necessitate conversion of the front matter.&lt;/p&gt;
&lt;p&gt;Hugo front matter (TOML)&lt;/p&gt;
&lt;div class="highlight" data-lang="TOML"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;+++&lt;/span&gt;
&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;fun with static site generators&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ld"&gt;2025-10-16T09:46:10&lt;/span&gt;
&lt;span class="n"&gt;lastmod&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ld"&gt;2025-10-22T12:52:18+01:00&lt;/span&gt;
&lt;span class="n"&gt;categories&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;software&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;tags&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Hugo&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;11ty&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;BSSG&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Zola&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Nikola&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Pelican&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Jekyll&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;draft&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;
&lt;span class="err"&gt;+++&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;BlogMore front matter (YAML)&lt;/p&gt;
&lt;div class="highlight" data-lang="YAML"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="nt"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;fun with static site generators&lt;/span&gt;
&lt;span class="nt"&gt;date&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;2025-10-16 09:46:10&lt;/span&gt;
&lt;span class="nt"&gt;modified&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;2025-10-22 12:52:09&lt;/span&gt;
&lt;span class="nt"&gt;category&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;software&lt;/span&gt;
&lt;span class="nt"&gt;tags&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;Hugo, 11ty, BSSG, Zola, Nikola, Pelican, Jekyll&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The conversion of the front matter was relatively straightforward as I
already had a bunch of sed scripts as a result of previous migrations.&lt;/p&gt;
&lt;p&gt;I like BlogMore's use of a single 'Category' with multiple 'Tags' as
that's how my brain works and it helps me categorise content better.&lt;/p&gt;
&lt;p&gt;BlogMore is flexible and supports three formats to specify the
'&lt;a href="https://blogmore.davep.dev/writing_a_post/#tags-formats" rel="noopener noreferrer" target="_blank"&gt;Tags&lt;/a&gt;' meta-data&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;YAML list ('tags: [football, united]')&lt;/li&gt;
&lt;li&gt;Comma separated list ('tags: football, united')&lt;/li&gt;
&lt;li&gt;Multi-line list&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight" data-lang="YAML"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nt"&gt;tags&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;football&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;united&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;I prefer the CSV option as the square brackets in the YAML list is
just noise and visual clutter. The single line format is also easier
for any subsequent conversions to the next shiny blog platform.&lt;/p&gt;
&lt;p&gt;Similarly, the fact that &lt;a href="https://ox-hugo.scripter.co/" rel="noopener noreferrer" target="_blank"&gt;ox-hugo&lt;/a&gt; enclosed tags in double quotes
was undoubtedly sensible from a purist, developer standpoint but was
just more irritating, visual clutter when reviewing the generated
Markdown files.&lt;/p&gt;
&lt;p&gt;BlogMore is more forgiving on the precise &lt;a href="https://blogmore.davep.dev/writing_a_post/#date-formats" rel="noopener noreferrer" target="_blank"&gt;date&lt;/a&gt; and timestamp
format which has always been another source of irritation. I don't
want to know or need to learn the 'ISO 8601 with timezone' standard
simply to quickly create a blog post.&lt;/p&gt;
&lt;h1 id="creating-a-post"&gt;Creating a post&lt;/h1&gt;
&lt;p&gt;You can easily create a new post in BlogMore using your preferred text
editor. You can either create the post manually, copy the previous
post or use a shell script or templates. For Emacs, &lt;a href="https://github.com/joaotavora/yasnippet" rel="noopener noreferrer" target="_blank"&gt;YASnippet&lt;/a&gt; and
&lt;a href="https://taingram.org/blog/intro-to-emacs-tempo.html" rel="noopener noreferrer" target="_blank"&gt;tempo&lt;/a&gt; are useful.&lt;/p&gt;
&lt;p&gt;Here is my sample template for a new post.&lt;/p&gt;
&lt;div class="highlight" data-lang="YAML"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="nt"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="nt"&gt;date&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;2026-04-13 12:20:46+0100&lt;/span&gt;
&lt;span class="nt"&gt;category&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="nt"&gt;tags&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="nt"&gt;draft&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;true&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://github.com/davep" rel="noopener noreferrer" target="_blank"&gt;Dave Pearson&lt;/a&gt; has created a marvellous Emacs package
(&lt;a href="https://github.com/davep/blogmore.el" rel="noopener noreferrer" target="_blank"&gt;blogmore.el&lt;/a&gt;) that is invaluable in managing content, timestamps
and meta-data (categories and tags). However, this package merits a
separate post in due course.&lt;/p&gt;
&lt;h2 id="code-blocks"&gt;Code blocks&lt;/h2&gt;
&lt;p&gt;BlogMore is &lt;a href="https://www.python.org/" rel="noopener noreferrer" target="_blank"&gt;Python&lt;/a&gt; based and uses &lt;a href="https://pygments.org/" rel="noopener noreferrer" target="_blank"&gt;Pygments&lt;/a&gt; for syntax
highlighting. Pygments supports many different &lt;a href="https://pygments.org/languages/" rel="noopener noreferrer" target="_blank"&gt;languages&lt;/a&gt; and
&lt;a href="https://pygments.org/styles/" rel="noopener noreferrer" target="_blank"&gt;styles&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;BlogMore allows you to select your preferred &lt;a href="https://blogmore.davep.dev/writing_a_post/#code-blocks-with-syntax-highlighting" rel="noopener noreferrer" target="_blank"&gt;style&lt;/a&gt; (for light and
dark themes) using the &lt;code&gt;light/dark_mode_code_style&lt;/code&gt; configuration file
parameters.&lt;/p&gt;
&lt;p&gt;To use the popular 'monokai' theme for all code blocks, add the
following lines to the BlogMore configuration file &lt;code&gt;config.yaml&lt;/code&gt;.&lt;/p&gt;
&lt;div class="highlight" data-lang="YAML"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nt"&gt;light_mode_code_style&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;monokai&lt;/span&gt;
&lt;span class="nt"&gt;dark_mode_code_style&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;monokai&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h1 id="building"&gt;Building&lt;/h1&gt;
&lt;p&gt;When I work on a blog post, I tend to take my time. Write, edit,
review, write, edit, preview and iterate. Rinse and repeat.&lt;/p&gt;
&lt;p&gt;I normally build the BlogMore site to check for any errors in the
front matter.&lt;/p&gt;
&lt;p&gt;By default, the BlogMore build command only considers published posts
so use the &lt;code&gt;--include-drafts&lt;/code&gt; parameter to see work currently in
progress.&lt;/p&gt;
&lt;div class="highlight" data-lang="bash"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;blogmore&lt;span class="w"&gt; &lt;/span&gt;build&lt;span class="w"&gt; &lt;/span&gt;--include-drafts
Parsing&lt;span class="w"&gt; &lt;/span&gt;posts&lt;span class="w"&gt; &lt;/span&gt;from&lt;span class="w"&gt; &lt;/span&gt;content...
Found&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1033&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;posts
Found&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;pages
Optimizing&lt;span class="w"&gt; &lt;/span&gt;FontAwesome&lt;span class="w"&gt; &lt;/span&gt;CSS...
Generating&lt;span class="w"&gt; &lt;/span&gt;post&lt;span class="w"&gt; &lt;/span&gt;pages...
Generating&lt;span class="w"&gt; &lt;/span&gt;static&lt;span class="w"&gt; &lt;/span&gt;pages...
Generating&lt;span class="w"&gt; &lt;/span&gt;custom&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;404&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;page...
Generating&lt;span class="w"&gt; &lt;/span&gt;index&lt;span class="w"&gt; &lt;/span&gt;page...
Generating&lt;span class="w"&gt; &lt;/span&gt;archive&lt;span class="w"&gt; &lt;/span&gt;page...
Generating&lt;span class="w"&gt; &lt;/span&gt;date-based&lt;span class="w"&gt; &lt;/span&gt;archive&lt;span class="w"&gt; &lt;/span&gt;pages...
Generating&lt;span class="w"&gt; &lt;/span&gt;tag&lt;span class="w"&gt; &lt;/span&gt;pages...
Generating&lt;span class="w"&gt; &lt;/span&gt;tags&lt;span class="w"&gt; &lt;/span&gt;overview&lt;span class="w"&gt; &lt;/span&gt;page...
Generating&lt;span class="w"&gt; &lt;/span&gt;category&lt;span class="w"&gt; &lt;/span&gt;pages...
Generating&lt;span class="w"&gt; &lt;/span&gt;categories&lt;span class="w"&gt; &lt;/span&gt;overview&lt;span class="w"&gt; &lt;/span&gt;page...
Generating&lt;span class="w"&gt; &lt;/span&gt;RSS&lt;span class="w"&gt; &lt;/span&gt;and&lt;span class="w"&gt; &lt;/span&gt;Atom&lt;span class="w"&gt; &lt;/span&gt;feeds...
Generating&lt;span class="w"&gt; &lt;/span&gt;search&lt;span class="w"&gt; &lt;/span&gt;index&lt;span class="w"&gt; &lt;/span&gt;and&lt;span class="w"&gt; &lt;/span&gt;search&lt;span class="w"&gt; &lt;/span&gt;page...
Generating&lt;span class="w"&gt; &lt;/span&gt;blog&lt;span class="w"&gt; &lt;/span&gt;statistics&lt;span class="w"&gt; &lt;/span&gt;page...
Copied&lt;span class="w"&gt; &lt;/span&gt;bundled&lt;span class="w"&gt; &lt;/span&gt;static&lt;span class="w"&gt; &lt;/span&gt;assets
Generated&lt;span class="w"&gt; &lt;/span&gt;minified&lt;span class="w"&gt; &lt;/span&gt;CSS&lt;span class="w"&gt; &lt;/span&gt;as&lt;span class="w"&gt; &lt;/span&gt;styles.min.css
Generated&lt;span class="w"&gt; &lt;/span&gt;minified&lt;span class="w"&gt; &lt;/span&gt;CSS&lt;span class="w"&gt; &lt;/span&gt;as&lt;span class="w"&gt; &lt;/span&gt;search.min.css
Generated&lt;span class="w"&gt; &lt;/span&gt;minified&lt;span class="w"&gt; &lt;/span&gt;CSS&lt;span class="w"&gt; &lt;/span&gt;as&lt;span class="w"&gt; &lt;/span&gt;stats.min.css
Generated&lt;span class="w"&gt; &lt;/span&gt;minified&lt;span class="w"&gt; &lt;/span&gt;CSS&lt;span class="w"&gt; &lt;/span&gt;as&lt;span class="w"&gt; &lt;/span&gt;archive.min.css
Generated&lt;span class="w"&gt; &lt;/span&gt;minified&lt;span class="w"&gt; &lt;/span&gt;CSS&lt;span class="w"&gt; &lt;/span&gt;as&lt;span class="w"&gt; &lt;/span&gt;tag-cloud.min.css
Generated&lt;span class="w"&gt; &lt;/span&gt;minified&lt;span class="w"&gt; &lt;/span&gt;CSS&lt;span class="w"&gt; &lt;/span&gt;as&lt;span class="w"&gt; &lt;/span&gt;calendar.min.css
Generated&lt;span class="w"&gt; &lt;/span&gt;minified&lt;span class="w"&gt; &lt;/span&gt;code&lt;span class="w"&gt; &lt;/span&gt;CSS&lt;span class="w"&gt; &lt;/span&gt;as&lt;span class="w"&gt; &lt;/span&gt;code.min.css
Generated&lt;span class="w"&gt; &lt;/span&gt;minified&lt;span class="w"&gt; &lt;/span&gt;JS&lt;span class="w"&gt; &lt;/span&gt;as&lt;span class="w"&gt; &lt;/span&gt;theme.min.js
Generated&lt;span class="w"&gt; &lt;/span&gt;minified&lt;span class="w"&gt; &lt;/span&gt;JS&lt;span class="w"&gt; &lt;/span&gt;as&lt;span class="w"&gt; &lt;/span&gt;codeblocks.min.js
Generated&lt;span class="w"&gt; &lt;/span&gt;minified&lt;span class="w"&gt; &lt;/span&gt;JS&lt;span class="w"&gt; &lt;/span&gt;as&lt;span class="w"&gt; &lt;/span&gt;search.min.js
Generated&lt;span class="w"&gt; &lt;/span&gt;minified&lt;span class="w"&gt; &lt;/span&gt;FontAwesome&lt;span class="w"&gt; &lt;/span&gt;CSS&lt;span class="w"&gt; &lt;/span&gt;as&lt;span class="w"&gt; &lt;/span&gt;fontawesome.min.css
Copied&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;134&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;extra&lt;span class="w"&gt; &lt;/span&gt;file&lt;span class="o"&gt;(&lt;/span&gt;s&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;from&lt;span class="w"&gt; &lt;/span&gt;content/extras
Generating&lt;span class="w"&gt; &lt;/span&gt;XML&lt;span class="w"&gt; &lt;/span&gt;sitemap...
Site&lt;span class="w"&gt; &lt;/span&gt;generation&lt;span class="w"&gt; &lt;/span&gt;complete!&lt;span class="w"&gt; &lt;/span&gt;Output:&lt;span class="w"&gt; &lt;/span&gt;&amp;lt;site&amp;gt;/blogmore/site
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The build command identifies any problems, typically in the front
matter. For example&lt;/p&gt;
&lt;div class="highlight" data-lang="bash"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;Warning:&lt;span class="w"&gt; &lt;/span&gt;Skipping&lt;span class="w"&gt; &lt;/span&gt;content/posts/2026/blogging-more-with-blogmore.md:
Post&lt;span class="w"&gt; &lt;/span&gt;missing&lt;span class="w"&gt; &lt;/span&gt;required&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;title&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;frontmatter:
&lt;span class="w"&gt;    &lt;/span&gt;content/posts/2026/blogging-more-with-blogmore.md
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h1 id="previewing"&gt;Previewing&lt;/h1&gt;
&lt;p&gt;Once the site has been generated without errors, you can then preview
the site using &lt;code&gt;blogmore serve&lt;/code&gt; which makes your local site available
at http://localhost:8000/.&lt;/p&gt;
&lt;div class="highlight" data-lang="bash"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;blogmore&lt;span class="w"&gt; &lt;/span&gt;serve&lt;span class="w"&gt; &lt;/span&gt;--include-drafts
Generating&lt;span class="w"&gt; &lt;/span&gt;site&lt;span class="w"&gt; &lt;/span&gt;from&lt;span class="w"&gt; &lt;/span&gt;/home/andy/software/codeberg-repos/blogmore/content...
Removing&lt;span class="w"&gt; &lt;/span&gt;output&lt;span class="w"&gt; &lt;/span&gt;directory:&lt;span class="w"&gt; &lt;/span&gt;/home/andy/software/codeberg-repos/blogmore/site
Parsing&lt;span class="w"&gt; &lt;/span&gt;posts&lt;span class="w"&gt; &lt;/span&gt;from&lt;span class="w"&gt; &lt;/span&gt;/home/andy/software/codeberg-repos/blogmore/content...
Found&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1033&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;posts
Found&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;pages
Optimizing&lt;span class="w"&gt; &lt;/span&gt;FontAwesome&lt;span class="w"&gt; &lt;/span&gt;CSS...
Generating&lt;span class="w"&gt; &lt;/span&gt;post&lt;span class="w"&gt; &lt;/span&gt;pages...
Generating&lt;span class="w"&gt; &lt;/span&gt;static&lt;span class="w"&gt; &lt;/span&gt;pages...
Generating&lt;span class="w"&gt; &lt;/span&gt;custom&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;404&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;page...
Generating&lt;span class="w"&gt; &lt;/span&gt;index&lt;span class="w"&gt; &lt;/span&gt;page...
Generating&lt;span class="w"&gt; &lt;/span&gt;archive&lt;span class="w"&gt; &lt;/span&gt;page...
Generating&lt;span class="w"&gt; &lt;/span&gt;date-based&lt;span class="w"&gt; &lt;/span&gt;archive&lt;span class="w"&gt; &lt;/span&gt;pages...
Generating&lt;span class="w"&gt; &lt;/span&gt;tag&lt;span class="w"&gt; &lt;/span&gt;pages...
Generating&lt;span class="w"&gt; &lt;/span&gt;tags&lt;span class="w"&gt; &lt;/span&gt;overview&lt;span class="w"&gt; &lt;/span&gt;page...
Generating&lt;span class="w"&gt; &lt;/span&gt;category&lt;span class="w"&gt; &lt;/span&gt;pages...
Generating&lt;span class="w"&gt; &lt;/span&gt;categories&lt;span class="w"&gt; &lt;/span&gt;overview&lt;span class="w"&gt; &lt;/span&gt;page...
Generating&lt;span class="w"&gt; &lt;/span&gt;RSS&lt;span class="w"&gt; &lt;/span&gt;and&lt;span class="w"&gt; &lt;/span&gt;Atom&lt;span class="w"&gt; &lt;/span&gt;feeds...
Generating&lt;span class="w"&gt; &lt;/span&gt;search&lt;span class="w"&gt; &lt;/span&gt;index&lt;span class="w"&gt; &lt;/span&gt;and&lt;span class="w"&gt; &lt;/span&gt;search&lt;span class="w"&gt; &lt;/span&gt;page...
Generating&lt;span class="w"&gt; &lt;/span&gt;blog&lt;span class="w"&gt; &lt;/span&gt;statistics&lt;span class="w"&gt; &lt;/span&gt;page...
Copied&lt;span class="w"&gt; &lt;/span&gt;bundled&lt;span class="w"&gt; &lt;/span&gt;static&lt;span class="w"&gt; &lt;/span&gt;assets
Generated&lt;span class="w"&gt; &lt;/span&gt;minified&lt;span class="w"&gt; &lt;/span&gt;CSS&lt;span class="w"&gt; &lt;/span&gt;as&lt;span class="w"&gt; &lt;/span&gt;styles.min.css
Generated&lt;span class="w"&gt; &lt;/span&gt;minified&lt;span class="w"&gt; &lt;/span&gt;CSS&lt;span class="w"&gt; &lt;/span&gt;as&lt;span class="w"&gt; &lt;/span&gt;search.min.css
Generated&lt;span class="w"&gt; &lt;/span&gt;minified&lt;span class="w"&gt; &lt;/span&gt;CSS&lt;span class="w"&gt; &lt;/span&gt;as&lt;span class="w"&gt; &lt;/span&gt;stats.min.css
Generated&lt;span class="w"&gt; &lt;/span&gt;minified&lt;span class="w"&gt; &lt;/span&gt;CSS&lt;span class="w"&gt; &lt;/span&gt;as&lt;span class="w"&gt; &lt;/span&gt;archive.min.css
Generated&lt;span class="w"&gt; &lt;/span&gt;minified&lt;span class="w"&gt; &lt;/span&gt;CSS&lt;span class="w"&gt; &lt;/span&gt;as&lt;span class="w"&gt; &lt;/span&gt;tag-cloud.min.css
Generated&lt;span class="w"&gt; &lt;/span&gt;minified&lt;span class="w"&gt; &lt;/span&gt;CSS&lt;span class="w"&gt; &lt;/span&gt;as&lt;span class="w"&gt; &lt;/span&gt;calendar.min.css
Generated&lt;span class="w"&gt; &lt;/span&gt;minified&lt;span class="w"&gt; &lt;/span&gt;code&lt;span class="w"&gt; &lt;/span&gt;CSS&lt;span class="w"&gt; &lt;/span&gt;as&lt;span class="w"&gt; &lt;/span&gt;code.min.css
Generated&lt;span class="w"&gt; &lt;/span&gt;minified&lt;span class="w"&gt; &lt;/span&gt;JS&lt;span class="w"&gt; &lt;/span&gt;as&lt;span class="w"&gt; &lt;/span&gt;theme.min.js
Generated&lt;span class="w"&gt; &lt;/span&gt;minified&lt;span class="w"&gt; &lt;/span&gt;JS&lt;span class="w"&gt; &lt;/span&gt;as&lt;span class="w"&gt; &lt;/span&gt;codeblocks.min.js
Generated&lt;span class="w"&gt; &lt;/span&gt;minified&lt;span class="w"&gt; &lt;/span&gt;JS&lt;span class="w"&gt; &lt;/span&gt;as&lt;span class="w"&gt; &lt;/span&gt;search.min.js
Generated&lt;span class="w"&gt; &lt;/span&gt;minified&lt;span class="w"&gt; &lt;/span&gt;FontAwesome&lt;span class="w"&gt; &lt;/span&gt;CSS&lt;span class="w"&gt; &lt;/span&gt;as&lt;span class="w"&gt; &lt;/span&gt;fontawesome.min.css
Copied&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;134&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;extra&lt;span class="w"&gt; &lt;/span&gt;file&lt;span class="o"&gt;(&lt;/span&gt;s&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;from&lt;span class="w"&gt; &lt;/span&gt;/home/andy/software/codeberg-repos/blogmore/content/extras
Generating&lt;span class="w"&gt; &lt;/span&gt;XML&lt;span class="w"&gt; &lt;/span&gt;sitemap...
Site&lt;span class="w"&gt; &lt;/span&gt;generation&lt;span class="w"&gt; &lt;/span&gt;complete!&lt;span class="w"&gt; &lt;/span&gt;Output:&lt;span class="w"&gt; &lt;/span&gt;/home/andy/software/codeberg-repos/blogmore/site
Watching&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;changes&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;/home/andy/software/codeberg-repos/blogmore/content...
Watching&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;changes&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;config&lt;span class="w"&gt; &lt;/span&gt;file:&lt;span class="w"&gt; &lt;/span&gt;blogmore.yaml
Serving&lt;span class="w"&gt; &lt;/span&gt;site&lt;span class="w"&gt; &lt;/span&gt;at&lt;span class="w"&gt; &lt;/span&gt;http://localhost:8000/
Press&lt;span class="w"&gt; &lt;/span&gt;Ctrl+C&lt;span class="w"&gt; &lt;/span&gt;to&lt;span class="w"&gt; &lt;/span&gt;stop&lt;span class="w"&gt; &lt;/span&gt;the&lt;span class="w"&gt; &lt;/span&gt;server
&lt;span class="m"&gt;127&lt;/span&gt;.0.0.1&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="m"&gt;14&lt;/span&gt;/Apr/2026&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;11&lt;/span&gt;:19:24&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;GET /posts/blogging-more-with-blogmore/ HTTP/1.1&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;200&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-
&lt;span class="m"&gt;127&lt;/span&gt;.0.0.1&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="m"&gt;14&lt;/span&gt;/Apr/2026&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;11&lt;/span&gt;:19:24&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;GET /static/fontawesome.min.css?v=1776161935 HTTP/1.1&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;200&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-
&lt;span class="m"&gt;127&lt;/span&gt;.0.0.1&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="m"&gt;14&lt;/span&gt;/Apr/2026&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;11&lt;/span&gt;:19:24&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;GET /static/styles.min.css?v=1776161935 HTTP/1.1&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;200&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-
&lt;span class="m"&gt;127&lt;/span&gt;.0.0.1&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="m"&gt;14&lt;/span&gt;/Apr/2026&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;11&lt;/span&gt;:19:24&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;GET /static/code.min.css?v=1776161935 HTTP/1.1&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;200&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-
&lt;span class="m"&gt;127&lt;/span&gt;.0.0.1&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="m"&gt;14&lt;/span&gt;/Apr/2026&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;11&lt;/span&gt;:19:24&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;GET /static/theme.min.js HTTP/1.1&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;200&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-
&lt;span class="m"&gt;127&lt;/span&gt;.0.0.1&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="m"&gt;14&lt;/span&gt;/Apr/2026&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;11&lt;/span&gt;:19:24&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;GET /static/codeblocks.min.js HTTP/1.1&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;200&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The 'blogmore serve' command will also generate the site (implies a
'blogmore build') so include the &lt;code&gt;--include-drafts&lt;/code&gt; parameter to see
all content.&lt;/p&gt;
&lt;p&gt;BlogMore provides a helpful, visual indicator to distinguish drafts
from published posts.&lt;/p&gt;
&lt;p&gt;&lt;img alt="BlogMore draft post" src="https://www.yakshaving.co.uk/images/2026/BlogMore-DraftPost.webp" title="BlogMore draft" /&gt;&lt;/p&gt;
&lt;p&gt;The 'blogmore serve' command is a live preview that automatically
detects any changes to content and dynamically regenerates the site
which accelerates the iterative 'write-preview-fix' process.&lt;/p&gt;
&lt;div class="highlight" data-lang="bash"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;Detected&lt;span class="w"&gt; &lt;/span&gt;change&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;lt;site&amp;gt;/content/posts/2026/blogging-more-with-blogmore.md,&lt;span class="w"&gt; &lt;/span&gt;regenerating&lt;span class="w"&gt; &lt;/span&gt;site...
Removing&lt;span class="w"&gt; &lt;/span&gt;output&lt;span class="w"&gt; &lt;/span&gt;directory:&lt;span class="w"&gt; &lt;/span&gt;&amp;lt;site&amp;gt;/blogmore/site
Parsing&lt;span class="w"&gt; &lt;/span&gt;posts&lt;span class="w"&gt; &lt;/span&gt;from&lt;span class="w"&gt; &lt;/span&gt;&amp;lt;site&amp;gt;/blogmore/content...
Found&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1027&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;posts
Found&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;pages
Optimizing&lt;span class="w"&gt; &lt;/span&gt;FontAwesome&lt;span class="w"&gt; &lt;/span&gt;CSS...
Generating&lt;span class="w"&gt; &lt;/span&gt;post&lt;span class="w"&gt; &lt;/span&gt;pages...
&amp;lt;snip&amp;gt;
Generating&lt;span class="w"&gt; &lt;/span&gt;XML&lt;span class="w"&gt; &lt;/span&gt;sitemap...
Site&lt;span class="w"&gt; &lt;/span&gt;generation&lt;span class="w"&gt; &lt;/span&gt;complete!&lt;span class="w"&gt; &lt;/span&gt;Output:&lt;span class="w"&gt; &lt;/span&gt;&amp;lt;site&amp;gt;//blogmore/site
Regeneration&lt;span class="w"&gt; &lt;/span&gt;complete!
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h1 id="deployment"&gt;Deployment&lt;/h1&gt;
&lt;p&gt;Codeberg pages is currently in a state of flux but you can deploy the
BlogMore site to a Codeberg 'pages' repository. Previously, I used a
branch and CI actions but I actually prefer this method as it's
simpler, less risky and more portable.&lt;/p&gt;
&lt;div class="highlight" data-lang="bash"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;cat&lt;span class="w"&gt; &lt;/span&gt;~/bin/deploy_codeberg.sh
&lt;span class="c1"&gt;#!/bin/bash&lt;/span&gt;

&lt;span class="c1"&gt;# Deploy the Blogmore site to Codeberg&lt;/span&gt;
&lt;span class="nv"&gt;CODEBERG&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;/software/codeberg-repos
&lt;span class="nv"&gt;BLOGMORE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$CODEBERG&lt;/span&gt;/blogmore
&lt;span class="nv"&gt;PAGES&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$CODEBERG&lt;/span&gt;/pages

&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$BLOGMORE&lt;/span&gt;

blogmore&lt;span class="w"&gt; &lt;/span&gt;build

&lt;span class="c1"&gt;# Copy the contents of the Blogmore &amp;#39;site&amp;#39; folder to the Codeberg&lt;/span&gt;
&lt;span class="c1"&gt;# &amp;#39;pages&amp;#39; repository&lt;/span&gt;
rsync&lt;span class="w"&gt; &lt;/span&gt;--archive&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$BLOGMORE&lt;/span&gt;/site/&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$PAGES&lt;/span&gt;/

&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$PAGES&lt;/span&gt;

git&lt;span class="w"&gt; &lt;/span&gt;add&lt;span class="w"&gt; &lt;/span&gt;--all

&lt;span class="nv"&gt;NOW&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;date&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;+%Y-%m-%d-%H:%M:%S&amp;#39;&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;
git&lt;span class="w"&gt; &lt;/span&gt;commit&lt;span class="w"&gt; &lt;/span&gt;-m&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Published Blogmore site on &lt;/span&gt;&lt;span class="nv"&gt;$NOW&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;

git&lt;span class="w"&gt; &lt;/span&gt;push
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;I tried to tune this script by only sync'ing files with different sizes
(not timestamps) as there is no point in pushing 950 static, unchanged
blog posts to the Codeberg repository.&lt;/p&gt;
&lt;div class="highlight" data-lang="bash"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;rsync&lt;span class="w"&gt; &lt;/span&gt;--archive&lt;span class="w"&gt; &lt;/span&gt;--size-only&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$BLOGMORE&lt;/span&gt;/site/&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$PAGES&lt;/span&gt;/
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;This seemed like a good idea but doesn't always update the Blogmore
version which is included in the footer on every single post.&lt;/p&gt;
&lt;p&gt;I normally check the the newly published blog post has appeared on the
site. Occasionally Codeberg pages seems to cache data but this
normally resolves after a few minutes.&lt;/p&gt;
&lt;h1 id="publishing"&gt;Publishing&lt;/h1&gt;
&lt;p&gt;BlogMore also includes a 'publish' command that supports publishing
the generated site to a GitHub branch for GitHub pages. This command
also works fine on Codeberg.&lt;/p&gt;
&lt;p&gt;Add the following entries to the 'blogmore.yaml' configuration file.&lt;/p&gt;
&lt;div class="highlight" data-lang="YAML"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# Publish options&lt;/span&gt;
&lt;span class="nt"&gt;branch&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;cb-pages&lt;/span&gt;
&lt;span class="nt"&gt;remote&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;origin&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Publishing the site on Codeberg&lt;/p&gt;
&lt;div class="highlight" data-lang="bash"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;blogmore&lt;span class="w"&gt; &lt;/span&gt;publish
Building&lt;span class="w"&gt; &lt;/span&gt;site&lt;span class="w"&gt; &lt;/span&gt;before&lt;span class="w"&gt; &lt;/span&gt;publishing...
Removing&lt;span class="w"&gt; &lt;/span&gt;output&lt;span class="w"&gt; &lt;/span&gt;directory:&lt;span class="w"&gt; &lt;/span&gt;&amp;lt;site&amp;gt;/blogmore/site
Parsing&lt;span class="w"&gt; &lt;/span&gt;posts&lt;span class="w"&gt; &lt;/span&gt;from&lt;span class="w"&gt; &lt;/span&gt;content...
Found&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1026&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;posts
Found&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;pages
Optimizing&lt;span class="w"&gt; &lt;/span&gt;FontAwesome&lt;span class="w"&gt; &lt;/span&gt;CSS...
Generating&lt;span class="w"&gt; &lt;/span&gt;post&lt;span class="w"&gt; &lt;/span&gt;pages...
Generating&lt;span class="w"&gt; &lt;/span&gt;static&lt;span class="w"&gt; &lt;/span&gt;pages...
Generating&lt;span class="w"&gt; &lt;/span&gt;custom&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;404&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;page...
Generating&lt;span class="w"&gt; &lt;/span&gt;index&lt;span class="w"&gt; &lt;/span&gt;page...
Generating&lt;span class="w"&gt; &lt;/span&gt;archive&lt;span class="w"&gt; &lt;/span&gt;page...
Generating&lt;span class="w"&gt; &lt;/span&gt;date-based&lt;span class="w"&gt; &lt;/span&gt;archive&lt;span class="w"&gt; &lt;/span&gt;pages...
Generating&lt;span class="w"&gt; &lt;/span&gt;tag&lt;span class="w"&gt; &lt;/span&gt;pages...
Generating&lt;span class="w"&gt; &lt;/span&gt;tags&lt;span class="w"&gt; &lt;/span&gt;overview&lt;span class="w"&gt; &lt;/span&gt;page...
Generating&lt;span class="w"&gt; &lt;/span&gt;category&lt;span class="w"&gt; &lt;/span&gt;pages...
Generating&lt;span class="w"&gt; &lt;/span&gt;categories&lt;span class="w"&gt; &lt;/span&gt;overview&lt;span class="w"&gt; &lt;/span&gt;page...
Generating&lt;span class="w"&gt; &lt;/span&gt;RSS&lt;span class="w"&gt; &lt;/span&gt;and&lt;span class="w"&gt; &lt;/span&gt;Atom&lt;span class="w"&gt; &lt;/span&gt;feeds...
Generating&lt;span class="w"&gt; &lt;/span&gt;search&lt;span class="w"&gt; &lt;/span&gt;index&lt;span class="w"&gt; &lt;/span&gt;and&lt;span class="w"&gt; &lt;/span&gt;search&lt;span class="w"&gt; &lt;/span&gt;page...
Generating&lt;span class="w"&gt; &lt;/span&gt;blog&lt;span class="w"&gt; &lt;/span&gt;statistics&lt;span class="w"&gt; &lt;/span&gt;page...
Copied&lt;span class="w"&gt; &lt;/span&gt;bundled&lt;span class="w"&gt; &lt;/span&gt;static&lt;span class="w"&gt; &lt;/span&gt;assets
&amp;lt;snip&amp;gt;
Generated&lt;span class="w"&gt; &lt;/span&gt;minified&lt;span class="w"&gt; &lt;/span&gt;FontAwesome&lt;span class="w"&gt; &lt;/span&gt;CSS&lt;span class="w"&gt; &lt;/span&gt;as&lt;span class="w"&gt; &lt;/span&gt;fontawesome.min.css
Copied&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;134&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;extra&lt;span class="w"&gt; &lt;/span&gt;file&lt;span class="o"&gt;(&lt;/span&gt;s&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;from&lt;span class="w"&gt; &lt;/span&gt;content/extras
Generating&lt;span class="w"&gt; &lt;/span&gt;XML&lt;span class="w"&gt; &lt;/span&gt;sitemap...
Site&lt;span class="w"&gt; &lt;/span&gt;generation&lt;span class="w"&gt; &lt;/span&gt;complete!&lt;span class="w"&gt; &lt;/span&gt;Output:&lt;span class="w"&gt; &lt;/span&gt;&amp;lt;site&amp;gt;/blogmore/site
Site&lt;span class="w"&gt; &lt;/span&gt;built&lt;span class="w"&gt; &lt;/span&gt;successfully
Publishing&lt;span class="w"&gt; &lt;/span&gt;site&lt;span class="w"&gt; &lt;/span&gt;to&lt;span class="w"&gt; &lt;/span&gt;branch&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;cb-pages&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;on&lt;span class="w"&gt; &lt;/span&gt;remote&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;origin&amp;#39;&lt;/span&gt;...
Created&lt;span class="w"&gt; &lt;/span&gt;worktree&lt;span class="w"&gt; &lt;/span&gt;with&lt;span class="w"&gt; &lt;/span&gt;new&lt;span class="w"&gt; &lt;/span&gt;orphan&lt;span class="w"&gt; &lt;/span&gt;branch&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;cb-pages&amp;#39;&lt;/span&gt;
Created&lt;span class="w"&gt; &lt;/span&gt;.nojekyll&lt;span class="w"&gt; &lt;/span&gt;file
Changes&lt;span class="w"&gt; &lt;/span&gt;committed
Successfully&lt;span class="w"&gt; &lt;/span&gt;pushed&lt;span class="w"&gt; &lt;/span&gt;to&lt;span class="w"&gt; &lt;/span&gt;origin/cb-pages
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h1 id="blogmore-configuration"&gt;BlogMore configuration&lt;/h1&gt;
&lt;p&gt;For reference, here is my BlogMore configuration file.&lt;/p&gt;
&lt;div class="highlight" data-lang="bash"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;cat&lt;span class="w"&gt; &lt;/span&gt;blogmore.yaml
&lt;span class="c1"&gt;# BlogMore configuration&lt;/span&gt;
&lt;span class="c1"&gt;#&lt;/span&gt;
&lt;span class="c1"&gt;# Heavily based on&lt;/span&gt;
&lt;span class="c1"&gt;# https://github.com/davep/davep.github.com/blob/main/blogmore.yaml&lt;/span&gt;

&lt;span class="c1"&gt;# Locations.&lt;/span&gt;
content_dir:&lt;span class="w"&gt; &lt;/span&gt;content
output:&lt;span class="w"&gt; &lt;/span&gt;site

&lt;span class="c1"&gt;# Main site details.&lt;/span&gt;
site_title:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Blog In Isolation&amp;quot;&lt;/span&gt;
site_subtitle:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;There&amp;#39;s a radiant darkness upon us&amp;quot;&lt;/span&gt;
site_url:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;https://www.yakshaving.co.uk/&amp;quot;&lt;/span&gt;
site_description:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Personal blog of Roman Totale XVII&amp;quot;&lt;/span&gt;
site_keywords:
&lt;span class="w"&gt;  &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;Emacs
&lt;span class="w"&gt;  &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;Oracle
&lt;span class="w"&gt;  &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;APEX
&lt;span class="w"&gt;  &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;UK
default_author:&lt;span class="w"&gt; &lt;/span&gt;andyc
include_drafts:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;false&lt;/span&gt;

&lt;span class="c1"&gt;# Building&lt;/span&gt;
clean_first:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;
&lt;span class="c1"&gt;# icon_source: davep.jpeg&lt;/span&gt;
minify_css:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;
minify_js:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;
minify_html:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;
clean_urls:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;
post_path:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;posts/{slug}/index.html&amp;quot;&lt;/span&gt;
page_path:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;pages/{slug}/index.html&amp;quot;&lt;/span&gt;
archive_path:&lt;span class="w"&gt; &lt;/span&gt;/archive/index.html
categories_path:&lt;span class="w"&gt; &lt;/span&gt;/categories/index.html
search_path:&lt;span class="w"&gt; &lt;/span&gt;/search/index.html
stats_path:&lt;span class="w"&gt; &lt;/span&gt;/stats/index.html
tags_path:&lt;span class="w"&gt; &lt;/span&gt;/tags/index.html

&lt;span class="c1"&gt;# Content and styling.&lt;/span&gt;
with_search:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;
with_sitemap:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;
with_stats:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;
with_read_time:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;false&lt;/span&gt;
light_mode_code_style:&lt;span class="w"&gt; &lt;/span&gt;default

&lt;span class="c1"&gt;# The links section in the sidebar.&lt;/span&gt;
links:
&lt;span class="w"&gt;  &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;title:&lt;span class="w"&gt; &lt;/span&gt;BlogMore
&lt;span class="w"&gt;    &lt;/span&gt;url:&lt;span class="w"&gt; &lt;/span&gt;https://blogmore.davep.dev/

&lt;span class="c1"&gt;# The &amp;quot;socials&amp;quot; in the sidebar.&lt;/span&gt;
socials:
&lt;span class="w"&gt;  &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;site:&lt;span class="w"&gt; &lt;/span&gt;mastodon
&lt;span class="w"&gt;    &lt;/span&gt;url:&lt;span class="w"&gt; &lt;/span&gt;https://mastodon.me.uk/@andyc

&lt;span class="c1"&gt;# Publish options&lt;/span&gt;
branch:&lt;span class="w"&gt; &lt;/span&gt;cb-pages
remote:&lt;span class="w"&gt; &lt;/span&gt;origin
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content>
    <link href="https://www.yakshaving.co.uk/posts/blogging-more-with-blogmore/"/>
    <category term="blogging"/>
    <category term="BlogMore"/>
    <published>2026-04-14T11:35:56+01:00</published>
  </entry>
  <entry>
    <id>https://www.yakshaving.co.uk/posts/from-github-to-codeberg/</id>
    <title>from GitHub to Codeberg</title>
    <updated>2026-03-30T12:23:09+01:00</updated>
    <content type="html">&lt;p&gt;I &lt;a href="https://www.yakshaving.co.uk/posts/hugo-netlify/"&gt;migrated&lt;/a&gt; this blog to GitHub and Netlify back in September 2022.
Three years later, I decided to move my (small) number of GitHub
repositories to &lt;a href="https://codeberg.org/" rel="noopener noreferrer" target="_blank"&gt;Codeberg&lt;/a&gt; as I was impressed by their approach to
open source software, transparent communications and I always like to
support the underdog.&lt;/p&gt;
&lt;p&gt;I'm not a developer and my GitHub repositories were mainly historical
versions of my blog over the years placed under version control and as
a backup.&lt;/p&gt;
&lt;p&gt;My GitHub repos were all basic; single user and didn't include any
issues, pull requests and hardly any branches. Consequently, I simply
followed the Codeberg &lt;a href="https://docs.codeberg.org/advanced/migrating-repos/" rel="noopener noreferrer" target="_blank"&gt;documentation&lt;/a&gt; and the transition was
quick and seamless, preserving all the commit history.&lt;/p&gt;
&lt;p&gt;As the test migration went smoothly, I then considered simplifying my
blog workflow by removing the dependency on GitHub pages and Netlify.
Six months ago, Codeberg provided Codeberg &lt;a href="https://docs.codeberg.org/codeberg-pages/" rel="noopener noreferrer" target="_blank"&gt;pages&lt;/a&gt; which
looked to be very similar to GitHub pages.&lt;/p&gt;
&lt;p&gt;The blog publishing process previously performed by Netlify's
integration with GitHub pages would now be implemented using
Codeberg's Woodpecker Continuous Integration (&lt;a href="https://ci.codeberg.org/login" rel="noopener noreferrer" target="_blank"&gt;CI&lt;/a&gt;) and Codeberg
pages.&lt;/p&gt;
&lt;p&gt;You had to apply for privileges to use Woodpecker but my request was
approved very promptly.&lt;/p&gt;
&lt;p&gt;Codeberg helpfully provided examples of Woodpecker files for popular
tasks which included a YAML &lt;a href="https://codeberg.org/Codeberg-CI/examples/src/branch/main/Hugo/.woodpecker.yaml" rel="noopener noreferrer" target="_blank"&gt;template&lt;/a&gt; to publish a Hugo blog from a
Codeberg repository to Codeberg pages.&lt;/p&gt;
&lt;p&gt;Once I had configured my Codeberg secrets for the Codeberg token and
email address and a few iterations, it was working !&lt;/p&gt;
&lt;p&gt;&lt;img alt="Code CI Blog Publish" src="https://www.yakshaving.co.uk/images/2026/Codeberg-CI-Blog-Publish.webp" title="Codeberg CI Blog Publish" /&gt;&lt;/p&gt;
&lt;p&gt;I liked the Codeberg CI dashboard summary with traffic light icons
indicating the success (failure) of each stage together with timing
information and the ability to get detailed log information for each
stage of the process.&lt;/p&gt;
&lt;p&gt;The Codeberg publish process has three stages:&lt;/p&gt;
&lt;h2 id="git"&gt;git&lt;/h2&gt;
&lt;p&gt;The initial 'git' stage fetches the latest changes from the Codeberg
repository.&lt;/p&gt;
&lt;div class="highlight" data-lang="bash"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;+&lt;span class="w"&gt; &lt;/span&gt;git&lt;span class="w"&gt; &lt;/span&gt;init&lt;span class="w"&gt; &lt;/span&gt;--object-format&lt;span class="w"&gt; &lt;/span&gt;sha1&lt;span class="w"&gt; &lt;/span&gt;-b&lt;span class="w"&gt; &lt;/span&gt;main
Initialized&lt;span class="w"&gt; &lt;/span&gt;empty&lt;span class="w"&gt; &lt;/span&gt;Git&lt;span class="w"&gt; &lt;/span&gt;repository&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;/woodpecker/src/codeberg.org/andyc/yakshaving/.git/
+&lt;span class="w"&gt; &lt;/span&gt;git&lt;span class="w"&gt; &lt;/span&gt;config&lt;span class="w"&gt; &lt;/span&gt;--global&lt;span class="w"&gt; &lt;/span&gt;--replace-all&lt;span class="w"&gt; &lt;/span&gt;safe.directory&lt;span class="w"&gt; &lt;/span&gt;/woodpecker/src/codeberg.org/andyc/yakshaving
+&lt;span class="w"&gt; &lt;/span&gt;git&lt;span class="w"&gt; &lt;/span&gt;remote&lt;span class="w"&gt; &lt;/span&gt;add&lt;span class="w"&gt; &lt;/span&gt;origin&lt;span class="w"&gt; &lt;/span&gt;https://codeberg.org/andyc/yakshaving.git
+&lt;span class="w"&gt; &lt;/span&gt;git&lt;span class="w"&gt; &lt;/span&gt;fetch&lt;span class="w"&gt; &lt;/span&gt;--no-tags&lt;span class="w"&gt; &lt;/span&gt;--depth&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;--filter&lt;span class="o"&gt;=&lt;/span&gt;tree:0&lt;span class="w"&gt; &lt;/span&gt;origin&lt;span class="w"&gt; &lt;/span&gt;+ed01403b33c60e32ae05f6c81e07fe432ed6100a:
From&lt;span class="w"&gt; &lt;/span&gt;https://codeberg.org/andyc/yakshaving
&lt;span class="w"&gt; &lt;/span&gt;*&lt;span class="w"&gt; &lt;/span&gt;branch&lt;span class="w"&gt;            &lt;/span&gt;ed01403b33c60e32ae05f6c81e07fe432ed6100a&lt;span class="w"&gt; &lt;/span&gt;-&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;FETCH_HEAD
+&lt;span class="w"&gt; &lt;/span&gt;git&lt;span class="w"&gt; &lt;/span&gt;reset&lt;span class="w"&gt; &lt;/span&gt;--hard&lt;span class="w"&gt; &lt;/span&gt;-q&lt;span class="w"&gt; &lt;/span&gt;ed01403b33c60e32ae05f6c81e07fe432ed6100a
+&lt;span class="w"&gt; &lt;/span&gt;git&lt;span class="w"&gt; &lt;/span&gt;submodule&lt;span class="w"&gt; &lt;/span&gt;update&lt;span class="w"&gt; &lt;/span&gt;--init&lt;span class="w"&gt; &lt;/span&gt;--recursive&lt;span class="w"&gt; &lt;/span&gt;--depth&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;--recommend-shallow
+&lt;span class="w"&gt; &lt;/span&gt;git&lt;span class="w"&gt; &lt;/span&gt;lfs&lt;span class="w"&gt; &lt;/span&gt;fetch
Fetching&lt;span class="w"&gt; &lt;/span&gt;reference&lt;span class="w"&gt; &lt;/span&gt;refs/heads/main
+&lt;span class="w"&gt; &lt;/span&gt;git&lt;span class="w"&gt; &lt;/span&gt;lfs&lt;span class="w"&gt; &lt;/span&gt;checkout
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2 id="build"&gt;build&lt;/h2&gt;
&lt;p&gt;The 'build' stage builds the site using Hugo and includes the version
of Hugo used by Codeberg (useful for debugging &lt;a href="https://www.yakshaving.co.uk/posts/reflections-hugo-github-netlify/"&gt;issues&lt;/a&gt;) and timing
information.&lt;/p&gt;
&lt;div class="highlight" data-lang="bash"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;+&lt;span class="w"&gt; &lt;/span&gt;hugo&lt;span class="w"&gt; &lt;/span&gt;--minify
Start&lt;span class="w"&gt; &lt;/span&gt;building&lt;span class="w"&gt; &lt;/span&gt;sites&lt;span class="w"&gt; &lt;/span&gt;…
hugo&lt;span class="w"&gt; &lt;/span&gt;v0.154.5-a6f99+extended&lt;span class="w"&gt; &lt;/span&gt;linux/amd64&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;BuildDate&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;2026&lt;/span&gt;-01-11T20:53:23Z
&lt;span class="w"&gt;                  &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;EN
------------------&lt;span class="p"&gt;|&lt;/span&gt;-------
&lt;span class="w"&gt; &lt;/span&gt;Pages&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1156&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;Paginator&lt;span class="w"&gt; &lt;/span&gt;pages&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;297&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;Non-page&lt;span class="w"&gt; &lt;/span&gt;files&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;Static&lt;span class="w"&gt; &lt;/span&gt;files&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;132&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;Processed&lt;span class="w"&gt; &lt;/span&gt;images&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;Aliases&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;61&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;Cleaned&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;Total&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2612&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;ms
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2 id="publish"&gt;publish&lt;/h2&gt;
&lt;p&gt;The 'publish' phase deploys the generated site to Codeberg pages into
the 'pages' branch.&lt;/p&gt;
&lt;div class="highlight" data-lang="bash"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;+&lt;span class="w"&gt; &lt;/span&gt;git&lt;span class="w"&gt; &lt;/span&gt;config&lt;span class="w"&gt; &lt;/span&gt;--global&lt;span class="w"&gt; &lt;/span&gt;user.email&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$MAIL&lt;/span&gt;
+&lt;span class="w"&gt; &lt;/span&gt;git&lt;span class="w"&gt; &lt;/span&gt;config&lt;span class="w"&gt; &lt;/span&gt;--global&lt;span class="w"&gt; &lt;/span&gt;user.name&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Woodpecker CI&amp;quot;&lt;/span&gt;
+&lt;span class="w"&gt; &lt;/span&gt;git&lt;span class="w"&gt; &lt;/span&gt;clone&lt;span class="w"&gt; &lt;/span&gt;-b&lt;span class="w"&gt; &lt;/span&gt;pages&lt;span class="w"&gt; &lt;/span&gt;https://&lt;span class="nv"&gt;$CODEBERG_TOKEN&lt;/span&gt;@codeberg.org/&lt;span class="nv"&gt;$CI_REPO&lt;/span&gt;.git&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$CI_REPO_NAME&lt;/span&gt;
Cloning&lt;span class="w"&gt; &lt;/span&gt;into&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;yakshaving&amp;#39;&lt;/span&gt;...
+&lt;span class="w"&gt; &lt;/span&gt;cp&lt;span class="w"&gt; &lt;/span&gt;-ar&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$HUGO_OUTPUT&lt;/span&gt;/.&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$CI_REPO_NAME&lt;/span&gt;/
+&lt;span class="w"&gt; &lt;/span&gt;cp&lt;span class="w"&gt; &lt;/span&gt;.domains&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$CI_REPO_NAME&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;||&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;
+&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$CI_REPO_NAME&lt;/span&gt;
+&lt;span class="w"&gt; &lt;/span&gt;git&lt;span class="w"&gt; &lt;/span&gt;add&lt;span class="w"&gt; &lt;/span&gt;.
+&lt;span class="w"&gt; &lt;/span&gt;git&lt;span class="w"&gt; &lt;/span&gt;commit&lt;span class="w"&gt; &lt;/span&gt;-m&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Woodpecker CI ed01403b33c60e32ae05f6c81e07fe432ed6100a&amp;quot;&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;pages&lt;span class="w"&gt; &lt;/span&gt;292c34d1&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Woodpecker&lt;span class="w"&gt; &lt;/span&gt;CI&lt;span class="w"&gt; &lt;/span&gt;ed01403b33c60e32ae05f6c81e07fe432ed6100a
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1388&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;files&lt;span class="w"&gt; &lt;/span&gt;changed,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;6483&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;insertions&lt;span class="o"&gt;(&lt;/span&gt;+&lt;span class="o"&gt;)&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;6483&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;deletions&lt;span class="o"&gt;(&lt;/span&gt;-&lt;span class="o"&gt;)&lt;/span&gt;
+&lt;span class="w"&gt; &lt;/span&gt;git&lt;span class="w"&gt; &lt;/span&gt;push
remote:
remote:&lt;span class="w"&gt; &lt;/span&gt;Create&lt;span class="w"&gt; &lt;/span&gt;a&lt;span class="w"&gt; &lt;/span&gt;new&lt;span class="w"&gt; &lt;/span&gt;pull&lt;span class="w"&gt; &lt;/span&gt;request&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;pages&amp;#39;&lt;/span&gt;:
remote:&lt;span class="w"&gt;   &lt;/span&gt;https://codeberg.org/andyc/yakshaving/compare/main...pages
remote:
To&lt;span class="w"&gt; &lt;/span&gt;https://codeberg.org/andyc/yakshaving.git
&lt;span class="w"&gt;   &lt;/span&gt;7c95fab3..292c34d1&lt;span class="w"&gt;  &lt;/span&gt;pages&lt;span class="w"&gt; &lt;/span&gt;-&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;pages
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The final stage was to redirect my domain name from Namecheap to the
Codeberg URL. Although, I was aware that the answer is always 'DNS',
this configuration change was explained clearly in the Codeberg
documentation and worked fine.&lt;/p&gt;</content>
    <link href="https://www.yakshaving.co.uk/posts/from-github-to-codeberg/"/>
    <category term="blogging"/>
    <category term="GitHub"/>
    <category term="Codeberg"/>
    <category term="Hugo"/>
    <published>2026-03-30T12:23:09+01:00</published>
  </entry>
  <entry>
    <id>https://www.yakshaving.co.uk/posts/in-praise-blogmore/</id>
    <title>in praise of BlogMore</title>
    <updated>2026-03-27T13:57:47+00:00</updated>
    <content type="html">&lt;p&gt;When &lt;a href="https://blog.davep.org/" rel="noopener noreferrer" target="_blank"&gt;Dave&lt;/a&gt; Pearson quietly &lt;a href="https://blog.davep.org/2026/02/19/a-new-engine.html" rel="noopener noreferrer" target="_blank"&gt;announced&lt;/a&gt; a Python static site
generator, I felt obliged to check it out.&lt;/p&gt;
&lt;p&gt;I was immediately impressed by the default theme of &lt;a href="https://blogmore.davep.dev/" rel="noopener noreferrer" target="_blank"&gt;BlogMore&lt;/a&gt; which
was minimalist and not dissimilar from the Hugo &lt;a href="https://themes.gohugo.io/themes/hugo-papermod/" rel="noopener noreferrer" target="_blank"&gt;PaperMod&lt;/a&gt; theme and
the simplicity of &lt;a href="https://write.as/" rel="noopener noreferrer" target="_blank"&gt;write.as&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Blogmore also had many features built-in which are requirements (or
wishlist items) on my blog migration checklist. For example, support
for categories and tags with archives and search functionality (which
works perfectly and is very quick).&lt;/p&gt;
&lt;p&gt;My obsession with static site build time wasn't an issue either.
Blogmore generated my site with over 1,000 posts in less than 4
seconds. That is for a full generation of the site (not incremental).&lt;/p&gt;
&lt;p&gt;The &lt;a href="https://blogmore.davep.dev/" rel="noopener noreferrer" target="_blank"&gt;documentation&lt;/a&gt; was also excellent, well written, clear and
concise with sample code snippets and aimed at the end user (not
experienced Python developers).&lt;/p&gt;
&lt;p&gt;The source code to &lt;a href="https://github.com/davep/blogmore" rel="noopener noreferrer" target="_blank"&gt;Blogmore&lt;/a&gt; and Dave's own
&lt;a href="https://github.com/davep/davep.github.com" rel="noopener noreferrer" target="_blank"&gt;site&lt;/a&gt; were published on GitHub which was helpful.&lt;/p&gt;
&lt;p&gt;Now, as Dave himself freely admitted, Blogmore was an experiment to
try to develop an SSG using &lt;a href="https://copilot.microsoft.com/" rel="noopener noreferrer" target="_blank"&gt;Copilot&lt;/a&gt;. He was clearly aiming to satisfy
his own requirements and had no plans to create a general purpose SSG
to rival Pelican.&lt;/p&gt;
&lt;p&gt;Dave did invite feedback though so I submitted a few issues (mainly
enhancement requests). This was partly selfish as the issues mainly
addressed gaps in my potential migration from Hugo but hopefully I
tried to consider proposing enhancements that would be generally
useful to make Blogmore a more attractive proposition for other
potential users.&lt;/p&gt;
&lt;p&gt;Dave was incredibly responsive and normally actioned requests within
24 hours. Plus the documentation and test suite was always updated to
reflect the latest release.&lt;/p&gt;
&lt;p&gt;It's probably common in software development but BlogMore's &lt;a href="https://blogmore.davep.dev/changelog/" rel="noopener noreferrer" target="_blank"&gt;Release
Notes&lt;/a&gt; even contained a 'BREAKING CHANGES' alert for
changes that were not backwards compatible. A useful lesson for Hugo
perhaps.&lt;/p&gt;
&lt;p&gt;Things I like about Blogmore:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Single category, multiple tags.&lt;/li&gt;
&lt;li&gt;Theme tightly integrated with the site generator.&lt;/li&gt;
&lt;li&gt;Word cloud for tags and categories.&lt;/li&gt;
&lt;li&gt;Archive pages broken down by date with counts.&lt;/li&gt;
&lt;li&gt;Support for clean URL's.&lt;/li&gt;
&lt;li&gt;Responsive UI- renders beautifully and fast on desktop, tablet and
  phone.&lt;/li&gt;
&lt;li&gt;Timestamp formats are just intuitive and easy to understand.&lt;/li&gt;
&lt;li&gt;Support for 'last modified' field in front-matter.&lt;/li&gt;
&lt;li&gt;Support for Drafts.&lt;/li&gt;
&lt;li&gt;Support for footnotes.&lt;/li&gt;
&lt;li&gt;Support for Table of Contents.&lt;/li&gt;
&lt;li&gt;Configurable side bar.&lt;/li&gt;
&lt;li&gt;RSS and Atom feeds available out of the box.&lt;/li&gt;
&lt;li&gt;Live preview of new and modified posts.&lt;/li&gt;
&lt;li&gt;Markdown based&lt;/li&gt;
&lt;li&gt;Flexible code highlighting styles (Pygments).&lt;/li&gt;
&lt;li&gt;Fast build speed.&lt;/li&gt;
&lt;li&gt;Python based.&lt;/li&gt;
&lt;li&gt;Excellent, well written end user documentation (including release
  notes).&lt;/li&gt;
&lt;li&gt;Packaged with &lt;a href="https://docs.astral.sh/uv/" rel="noopener noreferrer" target="_blank"&gt;uv&lt;/a&gt;. Easy to upgrade.&lt;/li&gt;
&lt;li&gt;Handy &lt;a href="https://www.yakshaving.co.uk/stats/"&gt;statistics&lt;/a&gt; page.&lt;/li&gt;
&lt;li&gt;Sitemap support out of the box.&lt;/li&gt;
&lt;li&gt;Optional minification of HTML, JavaScript and CSS.&lt;/li&gt;
&lt;li&gt;The quality of the software and pace of development. Dave only
  created BlogMore in February 2026 and has made 40 releases since
  then.&lt;/li&gt;
&lt;li&gt;Number of breakages in the period - zero.&lt;/li&gt;
&lt;li&gt;Dave's useful &lt;a href="https://github.com/davep/blogmore.el" rel="noopener noreferrer" target="_blank"&gt;Emacs&lt;/a&gt; snippets to create posts.&lt;/li&gt;
&lt;li&gt;Potential for additional CSS customisation and user defined themes.&lt;/li&gt;
&lt;li&gt;Blogmore publish command. I use Codeberg (not GitHub) but once the
  overhaul to Codeberg pages is complete this command should work.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you're contemplating migrating your site to a static site
generator, I'd certainly recommend considering BlogMore and trying it
out.&lt;/p&gt;</content>
    <link href="https://www.yakshaving.co.uk/posts/in-praise-blogmore/"/>
    <category term="blogging"/>
    <category term="BlogMore"/>
    <published>2026-03-27T13:57:47+00:00</published>
  </entry>
  <entry>
    <id>https://www.yakshaving.co.uk/posts/reflections-hugo-github-netlify/</id>
    <title>reflections on Hugo, GitHub and Netlify</title>
    <updated>2026-03-26T15:29:24+00:00</updated>
    <content type="html">&lt;p&gt;Three years ago I &lt;a href="https://www.yakshaving.co.uk/posts/hugo-netlify/"&gt;moved&lt;/a&gt; my &lt;a href="https://gohugo.io/" rel="noopener noreferrer" target="_blank"&gt;Hugo&lt;/a&gt; blog to GitHub &lt;a href="https://docs.github.com/en/pages" rel="noopener noreferrer" target="_blank"&gt;Pages&lt;/a&gt; and
&lt;a href="https://www.netlify.com/" rel="noopener noreferrer" target="_blank"&gt;Netlify&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;When this end to end process worked successfully, this was brilliant.
However, at times, the automated deployment did feel like the game of
&lt;a href="https://en.wikipedia.org/wiki/Mouse_Trap_(board_game)" rel="noopener noreferrer" target="_blank"&gt;Mousetrap&lt;/a&gt; where a silver ball was released and then proceeded to
traverse helter skelters, ride up and down on see-saws, descend
zig-zag staircases, cross bridges, trigger catapults, release levers
and conquer various hazards before finally launching a bucket to
capture a little plastic mouse.&lt;/p&gt;
&lt;p&gt;By using GitHub pages and Netlify, I had introduced yet more
complexity into the blog publishing process.&lt;/p&gt;
&lt;p&gt;Then I decided to add yet another layer of complexity by composing
posts in &lt;a href="https://www.gnu.org/software/emacs/" rel="noopener noreferrer" target="_blank"&gt;Emacs&lt;/a&gt; using &lt;a href="https://orgmode.org/" rel="noopener noreferrer" target="_blank"&gt;Org Mode&lt;/a&gt; and using
&lt;a href="https://ox-hugo.scripter.co/" rel="noopener noreferrer" target="_blank"&gt;ox-hugo&lt;/a&gt; to convert posts to Markdown format.&lt;/p&gt;
&lt;p&gt;For the most part, this worked fine which was satisfying and I
congratulated myself on my technical wizardry.&lt;/p&gt;
&lt;p&gt;However, Hugo occasionally broke after yet another update. Locating
and resolving the root cause of these errors was problematic (for me)
as the Hugo &lt;a href="https://github.com/gohugoio/hugo/releases" rel="noopener noreferrer" target="_blank"&gt;release&lt;/a&gt; notes are very technical and IMHO
primarily aimed at Go and/or theme developers. There is hardly ever
any section describing breaking (i.e. non backwards compatible)
changes or user visible changes.&lt;/p&gt;
&lt;p&gt;A random example from the most recent Hugo release (v0.159.0)&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This release greatly improves and simplifies management of
Node.js/npm dependencies in a multi-module setup.&lt;br&gt;
Replace deprecated site.Data with hugo.Data in tests.&lt;br&gt;
Replace deprecated excludeFiles and includeFiles with files in tests.&lt;br&gt;
Replace deprecated :filename with :contentbasename in the permalinks test.&lt;/br&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Failure could be caused by a variety of multiple potential issues.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Was there an error generating the Markdown from the Org Mode source
   ?&lt;/li&gt;
&lt;li&gt;Did Hugo work locally and generate the HTML for the site
   successfully ? This was normally the most frequent reason for the
   failure. An Arch update would often update the Hugo package and
   Hugo updates were quite frequent.&lt;/li&gt;
&lt;li&gt;Did the PaperMod theme need updating to reflect the most recent
   changes in Hugo ?&lt;/li&gt;
&lt;li&gt;Do other popular Hugo themes (Ananke) function without any issues ?&lt;/li&gt;
&lt;li&gt;Assuming the local Hugo site works, did the push to GitHub work ?
   Check the recent updates to the GitHub repository.&lt;/li&gt;
&lt;li&gt;Did Netlify then get triggered correctly by the GitHub updates?&lt;/li&gt;
&lt;li&gt;Did the Hugo build process complete successfully on Netlify ? What
   version of Hugo is Netlify using ? Is this identical (or compatible)
   with the locally installed version of Hugo ?&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;After yet another issue following a Hugo upgrade, I got increasingly
frustrated with this frictionless blogging process that was anything
but. I was now spending more time fixing my static (sic), unchanged
blog instead of writing any new posts.&lt;/p&gt;
&lt;p&gt;Once again, I started to consider using an alternative static site
generator. After all, I already had migrated my content to each of the
popular SSG's I &lt;a href="https://www.yakshaving.co.uk/posts/fun-with-static-site-generators/"&gt;evaluated&lt;/a&gt; last year.&lt;/p&gt;
&lt;p&gt;My mind was made up. I was going to do it. Just a question of
selecting an SSG and actually doing it.&lt;/p&gt;
&lt;p&gt;And then &lt;a href="https://blog.davep.org/" rel="noopener noreferrer" target="_blank"&gt;Dave&lt;/a&gt; Pearson came along and spoiled everything by
creating &lt;a href="https://blogmore.davep.dev/" rel="noopener noreferrer" target="_blank"&gt;BlogMore&lt;/a&gt;...&lt;/p&gt;</content>
    <link href="https://www.yakshaving.co.uk/posts/reflections-hugo-github-netlify/"/>
    <category term="blogging"/>
    <category term="Emacs"/>
    <category term="Hugo"/>
    <category term="GitHub"/>
    <category term="Netlify"/>
    <published>2026-03-26T15:29:24+00:00</published>
  </entry>
  <entry>
    <id>https://www.yakshaving.co.uk/posts/blog-questions-challenge/</id>
    <title>blog questions challenge</title>
    <updated>2025-01-07T15:35:23+00:00</updated>
    <content type="html">&lt;p&gt;I was interested by Kev Quirk's &lt;a href="https://kevquirk.com/blog/blog-questions-challenge" rel="noopener noreferrer" target="_blank"&gt;Blog Questions Challenge&lt;/a&gt;,
so here's my answers.&lt;/p&gt;
&lt;p&gt;To recap, the questions are:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Why did you start blogging in the first place ?&lt;/li&gt;
&lt;li&gt;What platform are you using to manage your blog and why did you
   choose it ?&lt;/li&gt;
&lt;li&gt;Have you blogged on other platforms before ?&lt;/li&gt;
&lt;li&gt;How do you write your posts? For example, in a local editing tool,
   or in a panel/dashboard that's part of your blog ?&lt;/li&gt;
&lt;li&gt;When do you feel most inspired to write ?&lt;/li&gt;
&lt;li&gt;Do you publish immediately after writing, or do you let it simmer a
   bit as a draft ?&lt;/li&gt;
&lt;li&gt;What's your favourite post on your blog ?&lt;/li&gt;
&lt;li&gt;Any future plans for your blog ? Maybe a redesign, a move to
   another platform, or adding a new feature ?&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="why-did-you-start-blogging-in-the-first-place"&gt;Why did you start blogging in the first place ?&lt;/h2&gt;
&lt;p&gt;I had a web site from 1999 but this was essentially a set of static
HTML pages.&lt;/p&gt;
&lt;p&gt;I'm an Oracle DBA/developer and there was an active Oracle blogging
community who first piqued my interest in back in 2005. I am a serial
experimenter and curious about new technologies so initially I chose
Blogger and subsequently switched to Wordpress.&lt;/p&gt;
&lt;h2 id="what-platform-are-you-using-to-manage-your-blog-and-why-did-you-choose-it"&gt;What platform are you using to manage your blog and why did you choose it ?&lt;/h2&gt;
&lt;p&gt;This blog currently uses Emacs, Hugo, GitHub and Netlify as I wanted
to use as many moving parts as possible. This stack is also
essentially a 'free' solution.&lt;/p&gt;
&lt;h2 id="have-you-blogged-on-other-platforms-before"&gt;Have you blogged on other platforms before ?&lt;/h2&gt;
&lt;p&gt;Err, yes. I've used many blogging platforms (Blogger, Wordpress,
Joomla, Drupal, Tumblr, Posterous, Serendipity, Jekyll, Pelican,
Octopress, Habari, Nikola, Eleventy, write.as, Hugo).&lt;/p&gt;
&lt;h2 id="how-do-you-write-your-posts"&gt;How do you write your posts ?&lt;/h2&gt;
&lt;p&gt;Now I write in Emacs and orgmode. This was a recent, conscious
decision as I wanted to standardise on orgmode markup. Trying to
remember the subtle differences between Markdown and orgmode formats
was irritating.&lt;/p&gt;
&lt;h2 id="when-do-you-feel-most-inspired-to-write"&gt;When do you feel most inspired to write ?&lt;/h2&gt;
&lt;p&gt;Unfortunately not very often.&lt;/p&gt;
&lt;p&gt;Years ago, I tended to be prompted to post by other bloggers but, with
the advent of the immediacy of social media, sadly the blogging
community and the number of feeds in my RSS client has shrunk
considerably.&lt;/p&gt;
&lt;p&gt;Plus I'm lazy. Incredibly lazy.&lt;/p&gt;
&lt;h2 id="do-you-publish-immediately-or-have-draft-posts"&gt;Do you publish immediately or have Draft posts ?&lt;/h2&gt;
&lt;p&gt;Normally, I publish immediately. I really don't like content sitting
in 'Drafts' which is akin to a dripping water tap, taunting me,
nagging me.&lt;/p&gt;
&lt;p&gt;However, I am slightly pedantic about presentation and typos, in
particular, so will always preview the post locally in Hugo before
publishing.&lt;/p&gt;
&lt;h2 id="whats-your-favourite-post-on-your-blog"&gt;What's your favourite post on your blog ?&lt;/h2&gt;
&lt;p&gt;Easy. Two. Both involve hamsters.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.yakshaving.co.uk/posts/a-narrow-escape/"&gt;a narrow escape&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.yakshaving.co.uk/posts/dead-body-under-my-floorboards/"&gt;dead body under the floorboards&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="any-future-plans-for-your-blog"&gt;Any future plans for your blog ?&lt;/h2&gt;
&lt;p&gt;Possibly. I'm quite happy with my existing setup but sometimes I think
self hosting using &lt;a href="https://writefreely.org/" rel="noopener noreferrer" target="_blank"&gt;WriteFreely&lt;/a&gt; would be easier and offer better
integration with the Fediverse.&lt;/p&gt;</content>
    <link href="https://www.yakshaving.co.uk/posts/blog-questions-challenge/"/>
    <category term="blogging"/>
    <published>2025-01-07T15:35:23+00:00</published>
  </entry>
  <entry>
    <id>https://www.yakshaving.co.uk/posts/why-hashnode-why-now/</id>
    <title>why Hashnode, why now ?</title>
    <updated>2022-10-04T09:53:00+01:00</updated>
    <content type="html">&lt;h1 id="a-brief-history-of-blogging"&gt;a brief history of blogging&lt;/h1&gt;
&lt;p&gt;I have maintained a blog, on and off, for a long time (since 2005).
During that time I have used a wide variety of blogging platforms
(Blogger, WordPress, Typepad, Drupal, Tumblr, Django, Posterous,
Jekyll, Ghost, Nikola, Hugo)&lt;/p&gt;
&lt;p&gt;My blog was a personal blog. Looking back, some posts were essentially
micro-blogging (trite one-liners), link blogging (interesting, amusing
BBC news stories), endless analysis of Manchester United together with
some longer form articles.&lt;/p&gt;
&lt;p&gt;Hardly any of my content was technical despite the fact I was an IT
consultant. With hindsight, there were a few reasons for this:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I worked all day staring at a screen working on technical issues. I
  also travelled a lot in the UK and Europe so when I finally arrived
  home, my immediate thought wasn't always 'I really need get my
  laptop out and blog about that database performance issue'.&lt;/li&gt;
&lt;li&gt;'Imposter syndrome' - whatever topic I thought of, someone,
  somewhere at some time would have already blogged about the same
  topic (normally &lt;a href="https://oracle-base.com/" rel="noopener noreferrer" target="_blank"&gt;Tim Hall&lt;/a&gt;) - better and more intelligently
  than I ever could. So who would ever read my post and, moreover,
  what was the point ?&lt;/li&gt;
&lt;li&gt;'Laziness' - I am inherently lazy. I freely admit it. It's not
  necessarily a bad thing. In fact, I think most developers &lt;strong&gt;should&lt;/strong&gt;
  be lazy (think scripting, think VM's). A technical post takes time
  because, to have any value, it has to be accurate. Also, it probably
  needs to include screenshots. Taking a series of screenshots and
  posting images to a blog is a very time consuming and tiresome
  exercise. It will also pose a significant issue for the imminent
  migration to the next blogging platform. A technical post requires
  much more time and effort than posting about Manchester United's
  latest victory or the film I saw at the weekend.&lt;/li&gt;
&lt;li&gt;Work. To be honest, this was a minor issue but often I had a nagging
  doubt that if I had some useful technical knowledge to share, then
  perhaps I should share this with my colleagues who worked on similar
  technical issues rather than chasing page views on the Internet.
  There was also the issue of anonymity; obviously I could mask my
  identity, my employer's name and the customer name but was this
  ethical ? Did it breach the corporate social media policy' ?&lt;/li&gt;
&lt;li&gt;Separation - I did occasionally conquer these various self-imposed
  mental barriers and post a vaguely technical post about Siebel CRM
  or Oracle. However, while the minuscule element of my readership who
  were interested might have commented 'At last, a technical post !',
  I imagined the wider audience (the other six readers) scratching
  their heads saying 'Well, where's the joke here ? What did he have
  for breakfast ? Screw that, I'm unsubscribing'.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="hashnode"&gt;Hashnode&lt;/h1&gt;
&lt;p&gt;Clearly, I could have overcome all of these issues by maintaining two
separate blogs; a personal blog and a technical blog but, like I said,
I'm lazy.&lt;/p&gt;
&lt;p&gt;I have a love hate relationship with Twitter. I really dislike the
adverts and inserted content and for me, it represents a very
dangerous distraction and potential time-sink.&lt;/p&gt;
&lt;p&gt;However, a lot of the wonderful &lt;a href="https://apex.oracle.com/en/" rel="noopener noreferrer" target="_blank"&gt;APEX&lt;/a&gt; community use this platform
so I was forced to sign up for the 17th time purely to follow the APEX
folks who post valuable content (tagged #&lt;a href="https://twitter.com/search?q=%23orclapex&amp;amp;src=hashtag_click" rel="noopener noreferrer" target="_blank"&gt;orclapex&lt;/a&gt;) and freely
share their knowledge and expertise.&lt;/p&gt;
&lt;p&gt;One of my favourite APEX bloggers, &lt;a href="https://blog.cloudnueva.com/page/about" rel="noopener noreferrer" target="_blank"&gt;Jon Dixon&lt;/a&gt;, indirectly drew my
attention to &lt;a href="https://hashnode.com/@orclapex" rel="noopener noreferrer" target="_blank"&gt;Hashnode&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;My private email message to Jon (reproduced here without permission)
sums up my initial thoughts on Hashnode&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Thanks for inadvertently pointing me at hashnode. I was completely
unaware of this platform but I like it as it's Markdown, hooks into
GitHub and has a community.&lt;/p&gt;
&lt;p&gt;This was useful as I always wanted a technical blog that was
separate from my inane stream of consciousness that I post
elsewhere.&lt;/p&gt;
&lt;p&gt;However, a technical post does take a good deal of time (checking,
testing, screenshots, iterating) but ultimately is satisfying I
think.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I decided to dip my toe in the water with a &lt;a href="https://www.yakshaving.co.uk/posts/masking-sensitive-fields-apex/"&gt;post&lt;/a&gt; I
originally posted on an internal Confluence Wiki.&lt;/p&gt;
&lt;p&gt;This was an interesting exercise in itself. My original article was
rather rushed and missed out crucial steps (grants on a package).&lt;/p&gt;
&lt;p&gt;As I was forced to revisit the original post and review each step from
scratch in a clean, vanilla environment, guess what, things didn't
work as I described.&lt;/p&gt;
&lt;p&gt;Another benefit was that Jon posted a comment saying 'Thanks' which
was appreciated and also privately emailed me with a couple of
suggestions for minor improvements.&lt;/p&gt;
&lt;p&gt;That, to me, is the whole point of a development blog - to hopefully
share useful technical knowledge with others but also to have a peer
review and learn something new yourself.&lt;/p&gt;</content>
    <link href="https://www.yakshaving.co.uk/posts/why-hashnode-why-now/"/>
    <category term="blogging"/>
    <category term="APEX"/>
    <category term="Hashnode"/>
    <published>2022-10-04T09:53:00+01:00</published>
  </entry>
  <entry>
    <id>https://www.yakshaving.co.uk/posts/hugo-netlify/</id>
    <title>Hugo blog now hosted on Netlify</title>
    <updated>2022-09-23T10:30:45+01:00</updated>
    <content type="html">&lt;p&gt;This blog uses &lt;a href="https://gohugo.io/" rel="noopener noreferrer" target="_blank" title="Hugo"&gt;Hugo&lt;/a&gt; and was previously hosted on Amazon S3
storage. The traffic and hence the costs were minimal (zero).&lt;/p&gt;
&lt;p&gt;After recently having to completely re-install Arch Linux after an
idiotic mistake, I realised that Hugo was out of date, my Hugo theme
was out of date and I'd forgotten precisely how the deployment to S3
actually worked.&lt;/p&gt;
&lt;p&gt;I was toying with taking my ball home in a mindless fit of pique,
migrating 1,000 posts to &lt;a href="https://www.11ty.dev/" rel="noopener noreferrer" target="_blank" title="Eleventy"&gt;Eleventy&lt;/a&gt; and I also looked at the
&lt;a href="https://getpublii.com/" rel="noopener noreferrer" target="_blank" title="Publii"&gt;Publii&lt;/a&gt; static site CMS with interest.&lt;/p&gt;
&lt;p&gt;However, that would have been foolish as I already had a Hugo blog
that worked fine. The problem was I never actually used it. It's
frictionless blogging but you have to actually produce content
occasionally. The friction (for me at least) is typing the words in -
not building, previewing and publishing the site.&lt;/p&gt;
&lt;p&gt;So, in the great blog unification process, I resurrected all my
historical blog posts, my very limited content on &lt;a href="https://write.as/" rel="noopener noreferrer" target="_blank" title="write.as"&gt;write.as&lt;/a&gt;
and deposited the lot into Hugo.&lt;/p&gt;
&lt;p&gt;I changed the theme to &lt;a href="https://github.com/adityatelange/hugo-PaperMod" rel="noopener noreferrer" target="_blank"&gt;PaperMod&lt;/a&gt; as it was a modern, clean,
minimal, single column theme reminiscent of write.as.&lt;/p&gt;
&lt;p&gt;The migration was pretty straightforward as all the existing posts
were already in Markdown format and the YAML front matter just needed
tweaking.&lt;/p&gt;
&lt;p&gt;As I had used Hugo and &lt;a href="https://www.netlify.com/" rel="noopener noreferrer" target="_blank" title="Netlify"&gt;Netlify&lt;/a&gt; for a friend's conventional Web
site, I took the opportunity to switch the blog from S3 to Netlify
which gives me SSL support and is generally a 'one click' operation to
push the content to &lt;a href="https://github.com/" rel="noopener noreferrer" target="_blank" title="GitHub"&gt;GitHub&lt;/a&gt; and then publish on Netlify.&lt;/p&gt;</content>
    <link href="https://www.yakshaving.co.uk/posts/hugo-netlify/"/>
    <category term="blogging"/>
    <category term="Hugo"/>
    <category term="Netlify"/>
    <published>2022-09-23T10:30:45+01:00</published>
  </entry>
  <entry>
    <id>https://www.yakshaving.co.uk/posts/rendezvous-strange-man-mask/</id>
    <title>rendezvous with strange man in mask</title>
    <updated>2020-05-21T11:14:00+01:00</updated>
    <content type="html">&lt;p&gt;I anxiously coaxed my wife out of the door to her work trying not to
raise her suspicions. My stomach was fluttering as I had an important
early morning meeting.&lt;/p&gt;
&lt;p&gt;To fully prepare, first, I chose my mask. I had two options; a flesh
coloured creation that resembled a one bosom bra or a more sinister
black model. I tried the pale pink mask but as it, err, masked my
nose, mouth and chin, it made me resemble a burns victim who had
endured time consuming and expensive reconstructive surgery which had
either failed or was still ongoing.&lt;/p&gt;
&lt;p&gt;The black one was much better; when I looked in the mirror I saw Kendo
Nagasaki. I felt strong. I felt powerful.&lt;/p&gt;
&lt;p&gt;The door-bell chimed. I opened it and was greeted by a middle aged,
balding man wearing a pale blue mask and surgical gloves carrying a
toolbox.&lt;/p&gt;
&lt;p&gt;'Good morning. it's John isn't it ? I know I shouldn't really but
would you like a cup of tea from a sterilised mug ?'&lt;/p&gt;
&lt;p&gt;'No - thanks. I'd rather just get straight down to business'.&lt;/p&gt;
&lt;p&gt;Ah now that what's I was hoping for; firm, dominant and to the point.&lt;/p&gt;
&lt;p&gt;'Do most people watch or just leave you to it ?'&lt;/p&gt;
&lt;p&gt;'Not bothered. You can watch as long as you're eight feet away ?'&lt;/p&gt;
&lt;p&gt;John got down on all fours and got on the job straightaway. There was
a lot of puffing and panting.&lt;/p&gt;
&lt;p&gt;'Christ - this is a tight fit. Dunno how the last fella managed to fit
it in this small gap'.&lt;/p&gt;
&lt;p&gt;I said nothing. There was no answer to that.&lt;/p&gt;
&lt;p&gt;'Bloody hell, if you had another 2 inches on your red hot pipe, that'd
help'.&lt;/p&gt;
&lt;p&gt;Slightly rude and I was supposed to be the dominatrix here. After all,
I am Kendo Nagasaki clad in the black mask.&lt;/p&gt;
&lt;p&gt;More puffing and panting.&lt;/p&gt;
&lt;p&gt;'Ere, can you pass me that vaseline ? I may as well lubricate this
joint while I'd down here'.&lt;/p&gt;
&lt;p&gt;'Here you go. I thought you looked like a doctor in the blue face mask
but I didn't think you'd have time to treat my arthritic knee'.&lt;/p&gt;
&lt;p&gt;'I must say - your waste outlet is pretty good considering but your
cold water pipe has a kink in it'.&lt;/p&gt;
&lt;p&gt;Was I paying £60 call-out and £30 per hour to be insulted like this ?&lt;/p&gt;
&lt;p&gt;More puffing and expletives&lt;/p&gt;
&lt;p&gt;'Ere - pass us a tea towel, will you ? There's something dripping out
the end of your pipe'.&lt;/p&gt;
&lt;p&gt;'Ooh - sorry about that. Here you go'.&lt;/p&gt;
&lt;p&gt;'Nah - it's OK. I've had a lot worse spilled on me in my line of
work. Sort of an occupational hazard'.&lt;/p&gt;
&lt;p&gt;'Oh - I see'.&lt;/p&gt;
&lt;p&gt;There was a strange vibration. Initially, I assumed the batteries in
John's sex toy, that he'd surreptitiously taken out of his toolbox,
needed replacing.&lt;/p&gt;
&lt;p&gt;'Ere - pass me that wrench, will you ? Your front extendable leg needs
adjusting slightly'.&lt;/p&gt;
&lt;p&gt;Weird as I don't actually have a prosthetic limb. Anywhere.&lt;/p&gt;
&lt;p&gt;'Right - that's done. Now, have you got a small load you'd like to
give me ?'&lt;/p&gt;
&lt;p&gt;Another insult about the size of my manhood. I don't understand
it. This chap had excellent reviews on the Web site.&lt;/p&gt;
&lt;p&gt;'Do you want me to flush your U-bend while I'm down 'ere ?'&lt;/p&gt;
&lt;p&gt;Hmm - colonic irrigation was never mentioned at any point. Would this
be extra ?&lt;/p&gt;
&lt;p&gt;There's a stilted silence while we stare at each other, waiting for my
small load to finish.&lt;/p&gt;
&lt;p&gt;We looked at each other in an embarrassed silence. I place £60 on the
table which John silently picked up. He grabbed his toolbox and went
to leave.&lt;/p&gt;
&lt;p&gt;'OK. Thanks for coming so promptly, John'.&lt;/p&gt;
&lt;p&gt;'No problem. If you or the missus ever need anything doing again, just
give us a ring'.&lt;/p&gt;
&lt;p&gt;Although she didn't know it yet, the wife had a new washing machine.&lt;/p&gt;</content>
    <link href="https://www.yakshaving.co.uk/posts/rendezvous-strange-man-mask/"/>
    <category term="blogging"/>
    <published>2020-05-21T11:14:00+01:00</published>
  </entry>
  <entry>
    <id>https://www.yakshaving.co.uk/posts/think-of-the-grandchildren/</id>
    <title>think of the grandchildren</title>
    <updated>2020-05-14T15:01:00+01:00</updated>
    <content type="html">&lt;p&gt;Mum, mum. Please calm...&lt;/p&gt;
&lt;p&gt;You don't understand. I just want to be able to see the
grandchildren. I just want to hug them, to hold them, to cuddle them.&lt;/p&gt;
&lt;p&gt;'Yes, Mum. I realise that but this won't...'&lt;/p&gt;
&lt;p&gt;'Is it too much to ask to sit out on the patio, drawing and colouring
with them ? Is it too much to want to spoil them with toys and treats
? Like any proud Grandma ?'&lt;/p&gt;
&lt;p&gt;'Yes, Mum. I know it's a difficult time but...'&lt;/p&gt;
&lt;p&gt;'That's all we're asking. It's tearing us up inside. We're cooped up
here and they are down there - poor little things. They need to see
their Nana and Grandad. They need to know they are loved'.&lt;/p&gt;
&lt;p&gt;'Yes, Mum but with the lockdown slowly being lifted...'&lt;/p&gt;
&lt;p&gt;'Why can I invite a cleaner into my house (not that I have a cleaner,
no-one cleans as well as me) or meet Rita in the park (not that I'd
want to mind, she hasn't called me once since this all started) and
yet I can't see the two people in the world who mean the most to
me. It just isn't fair'.&lt;/p&gt;
&lt;p&gt;'Yes, Mum but in the next few weeks...'&lt;/p&gt;
&lt;p&gt;'I had bought some them lovely Easter eggs, I'd bought presents for
little Alice's birthday and baked a cake. We left them untouched in
the vain hope but Dad finally gave in and ate the mini-eggs one
afternoon. This pain is unbearable'.&lt;/p&gt;
&lt;p&gt;'Yes, Mum but please remember, as soon as this is over...'&lt;/p&gt;
&lt;p&gt;'And then there's your Dad, he's a broken man. This is really dragging
him down. He never talks. He just sits around all day staring into
space like a zombie. All he wants to do is take little Harry
fishing. He wants to be a grandfather again. Just for one day. Your
Dad did National Service and this is the thanks he gets from this
Government. He just wants to take him fishing. He's got maggots in the
fridge ready. They were next to the mini-eggs. He loves his
fishing...'&lt;/p&gt;
&lt;p&gt;'Yes, Mum but there are other grandparents in...'&lt;/p&gt;
&lt;p&gt;'Don't talk to me about other grandparents. I saw a car pull up at
Rita's house last Wednesday at 11:17 and two little kiddies happily
ran up to her door. Who were they then - her landscape gardeners, her
cleaners ?'&lt;/p&gt;
&lt;p&gt;'Yes, Mum but remember...'&lt;/p&gt;
&lt;p&gt;'Stop telling me 'Yes, Mum' and just get in your car and drive up here
here right now with my lovely grandchildren !'&lt;/p&gt;
&lt;p&gt;'But, Mum. Please remember that David hasn't even got a girlfriend and
Emma is quite happy with her partner and her job at the moment.'&lt;/p&gt;
&lt;p&gt;'What ? What did you say ?'&lt;/p&gt;
&lt;p&gt;'Mum, you haven't got any grandchildren'.&lt;/p&gt;</content>
    <link href="https://www.yakshaving.co.uk/posts/think-of-the-grandchildren/"/>
    <category term="blogging"/>
    <published>2020-05-14T15:01:00+01:00</published>
  </entry>
  <entry>
    <id>https://www.yakshaving.co.uk/posts/keeping-sense-perspective/</id>
    <title>keeping a sense of perspective</title>
    <updated>2020-05-12T15:22:00+01:00</updated>
    <content type="html">&lt;p&gt;Wife: Jane told me yesterday she just found it all quite overwhelming
last week and just sat down and had a little cry.&lt;/p&gt;
&lt;p&gt;Me: There's nothing wrong with that. I've think we've all had wobbly
moments. I certainly know I have.'&lt;/p&gt;
&lt;p&gt;Wife: 'Have you ?'&lt;/p&gt;
&lt;p&gt;Me: 'Yeah, it was a couple of weeks ago now. I heard yet another radio
interview with a lady who'd lost her Mum, she couldn't visit her in
hospital and now her Dad is left grieving on his own. Just very
upsetting. I was in pieces for 10 minutes'.&lt;/p&gt;
&lt;p&gt;Wife: 'Yes, those stories are so sad'&lt;/p&gt;
&lt;p&gt;Me: 'Was it something similar that set Jane off ?'&lt;/p&gt;
&lt;p&gt;Wife: 'Well no - she was wondering when she might next get to the
theatre'.&lt;/p&gt;</content>
    <link href="https://www.yakshaving.co.uk/posts/keeping-sense-perspective/"/>
    <category term="blogging"/>
    <published>2020-05-12T15:22:00+01:00</published>
  </entry>
  <entry>
    <id>https://www.yakshaving.co.uk/posts/day14/</id>
    <title>Day 14</title>
    <updated>2020-05-09T11:13:00+01:00</updated>
    <content type="html">&lt;p&gt;10pm Thursday – congregate in the street to look at a Flour
Moon. This is handy as flour is in short supply.&lt;/p&gt;
&lt;p&gt;10am Friday – congregate in the street to watch a fly-past. Didn't see
anything so returned inside.&lt;/p&gt;
&lt;p&gt;11am Friday – given special dispensation not to congregate in the
street to observe a two minute silence.&lt;/p&gt;
&lt;p&gt;3pm Friday – congregate in the street for a toast. Have a chat with
the neighbours (again).&lt;/p&gt;
&lt;p&gt;9am – Saturday – wife drags me into town to take a variety of cryptic
photos of local sights and place of interest in preparation for a
quiz.&lt;/p&gt;
&lt;p&gt;4pm – Saturday – Zoom family call&lt;/p&gt;
&lt;p&gt;6.30pm Saturday – Wife online Pilates class&lt;/p&gt;</content>
    <link href="https://www.yakshaving.co.uk/posts/day14/"/>
    <category term="blogging"/>
    <category term="100DaysToOffload"/>
    <published>2020-05-09T11:13:00+01:00</published>
  </entry>
  <entry>
    <id>https://www.yakshaving.co.uk/posts/day13/</id>
    <title>Day 13</title>
    <updated>2020-05-08T17:59:00+01:00</updated>
    <content type="html">&lt;p&gt;After detailed analysis by medical professionals, data scientists and
epidemiologists, we are delighted to announce that blog traffic to
Blog In Isolation finally looks to have peaked on Wednesday April 29
with 15 million unique visitors.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Blog-Stats.png" src="https://www.yakshaving.co.uk/images/2020/Blog-Stats.webp" title="Blog Stats" /&gt;&lt;/p&gt;
&lt;p&gt;Yesterday's number, by comparison, was just 4 million. However, bear
in mind this doesn't include people who with pre-existing health
conditions who have experienced pain and discomfort using an RSS
Reader.&lt;/p&gt;
&lt;p&gt;Hopefully, if this promising trend is sustained, the blog can be
re-opened up to Facebook and WhatsApp audiences on Sunday 10 May.&lt;/p&gt;</content>
    <link href="https://www.yakshaving.co.uk/posts/day13/"/>
    <category term="blogging"/>
    <category term="100DaysToOffload"/>
    <published>2020-05-08T17:59:00+01:00</published>
  </entry>
  <entry>
    <id>https://www.yakshaving.co.uk/posts/day12/</id>
    <title>Day 12</title>
    <updated>2020-05-07T14:44:00+01:00</updated>
    <content type="html">&lt;p&gt;Instead of moaning about trivial marital disputes over cheque books,
it's time to celebrate some good news !&lt;/p&gt;
&lt;p&gt;&lt;a href="https://mastodon.social/@dvdmrsdn" rel="noopener noreferrer" target="_blank"&gt;David&lt;/a&gt; celebrates a new arrival. As in a new baby not an Amazon
delivery.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Dvd-Baby.png" src="https://www.yakshaving.co.uk/images/2020/Dvd-Baby.webp" title="Marsden Baby" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://sarcasm.stream/@basil" rel="noopener noreferrer" target="_blank"&gt;Richard&lt;/a&gt; celebrates a significant &lt;a href="https://trivial.observer/blog/birthday/" rel="noopener noreferrer" target="_blank"&gt;anniversary&lt;/a&gt; during these
unprecedented times with freshly brewed coffee, craft beers and cake.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Cutts-Birthday.jpg" src="https://www.yakshaving.co.uk/images/2020/Cutts-Birthday.webp" title="Cutts Birthday" /&gt;&lt;/p&gt;
&lt;p&gt;I have known David and Richard for many years, back from identi.ca
days. They remain two of very few people (from social media circles) I
have actually met in real-life. They are both just as entertaining,
intelligent, amusing and interesting company as you would expect.&lt;/p&gt;
&lt;p&gt;Plus, they both stand their rounds. Unlike me.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://mastodon.sdf.org/@Luke" rel="noopener noreferrer" target="_blank"&gt;Luke&lt;/a&gt; wins 'Best Dad Of The Year' by single handedly constructing an
AstroTurf pitch in his garden so his lad can perfect his &lt;a href="https://write.as/luke/lockdown-panic-buys" rel="noopener noreferrer" target="_blank"&gt;footy&lt;/a&gt;
skills during lock down.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Luke-Wembley.jpg" src="https://www.yakshaving.co.uk/images/2020/Luke-Wembley.webp" title="Luke Wembley" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://sully.site/@sullybiker" rel="noopener noreferrer" target="_blank"&gt;Sully&lt;/a&gt; celebrates some fantastic news ! Coincidentally, May 12 will
mark eight years since I received similar news ('Tumour excised. Slim
margins').&lt;/p&gt;
&lt;p&gt;&lt;img alt="Sully-Good-News.png" src="https://www.yakshaving.co.uk/images/2020/Sully-Good-News.webp" title="Sully good news" /&gt;&lt;/p&gt;
&lt;p&gt;Welcome to the 'Survivor's Lounge', Sully !&lt;/p&gt;</content>
    <link href="https://www.yakshaving.co.uk/posts/day12/"/>
    <category term="blogging"/>
    <category term="100DaysToOffload"/>
    <published>2020-05-07T14:44:00+01:00</published>
  </entry>
  <entry>
    <id>https://www.yakshaving.co.uk/posts/day11/</id>
    <title>Day 11</title>
    <updated>2020-05-06T12:25:00+01:00</updated>
    <content type="html">&lt;p&gt;After six weeks of lockdown, I finally lost it and had a blazing row
with the missus over a trivial issue.&lt;/p&gt;
&lt;p&gt;'Have you got a cheque book handy ?'&lt;/p&gt;
&lt;p&gt;'No.'&lt;/p&gt;
&lt;p&gt;'What - you don't have a cheque book ?'&lt;/p&gt;
&lt;p&gt;'I have a cheque book somewhere but I haven't used it in years so it
isn't handy, no'&lt;/p&gt;
&lt;p&gt;'Hmm OK. Well, I can't find mine and I need to write a cheque for the
man from the allotment'.&lt;/p&gt;
&lt;p&gt;'I'll have a look later'.&lt;/p&gt;
&lt;p&gt;We eat dinner. Time passes.&lt;/p&gt;
&lt;p&gt;'Any more thoughts about your cheque book ?'&lt;/p&gt;
&lt;p&gt;'Any more thoughts ? Well, not really, no'.&lt;/p&gt;
&lt;p&gt;'I really would like to post the cheque to Richard tonight'&lt;/p&gt;
&lt;p&gt;'Why ? When is he next going to the allotment ?'&lt;/p&gt;
&lt;p&gt;'Next Wednesday'&lt;/p&gt;
&lt;p&gt;'So why does he need a cheque &lt;strong&gt;tonight&lt;/strong&gt; ?&lt;/p&gt;
&lt;p&gt;'Well I think it's just polite to give him the money upfront.'&lt;/p&gt;
&lt;p&gt;'OK. OK. I'll go and look now.'&lt;/p&gt;
&lt;p&gt;I go upstairs and fail to locate a legacy cheque book.&lt;/p&gt;
&lt;p&gt;'Sorry, no. It's not where I thought it was'.&lt;/p&gt;
&lt;p&gt;'Hmm - OK but Richard has asked for £26.76 via a cheque'&lt;/p&gt;
&lt;p&gt;'OK - so where's your cheque book ? Have you looked in your in-tray ?'&lt;/p&gt;
&lt;p&gt;'Yes - nothing in there'.&lt;/p&gt;
&lt;p&gt;'Can't Richard receive a bank transfer ? We just need an account and
sort code'.&lt;/p&gt;
&lt;p&gt;'No - he was insistent on a cheque'.&lt;/p&gt;
&lt;p&gt;'Christ - OK. This is like dripping water tap torture. Does he really
need it now ?'&lt;/p&gt;
&lt;p&gt;I go to my in-tray, rifle through assorted bills, papers, letters and
finally uncover a cheque book clad in a black Midland bank plastic
wallet.&lt;/p&gt;
&lt;p&gt;'Here, here is a cheque. Hurrah ! We can finally placate Richard and
the allotment committee. For Christ's sake'.&lt;/p&gt;
&lt;p&gt;'Well there's no need to be so aggressive about it. I just asked for a
cheque. What's wrong with you ?'&lt;/p&gt;
&lt;p&gt;Wife writes a cheque. Thankfully she doesn't ask me for a pen. She
then leaves the house to hand deliver the cheque for the princely sum
of £26.76 to Richard from the allotment for goods and services
unknown.&lt;/p&gt;
&lt;p&gt;We then sit in an awkward silence for 3 hours watching four episodes
of the Norwegian drama - 'Twin'.&lt;/p&gt;
&lt;p&gt;The wife then gets her in-tray out as part of her ongoing, endless,
unceasing de-cluttering, tidying and domestic goddess initiative (in a
vain effort to replace social interaction and gossiping over coffee
with her friends).&lt;/p&gt;
&lt;p&gt;'Oh look. Here is a brand new cheque book I have never used. I never
knew this was here'.&lt;/p&gt;</content>
    <link href="https://www.yakshaving.co.uk/posts/day11/"/>
    <category term="blogging"/>
    <category term="100DaysToOffload"/>
    <published>2020-05-06T12:25:00+01:00</published>
  </entry>
  <entry>
    <id>https://www.yakshaving.co.uk/posts/day10/</id>
    <title>Day 10</title>
    <updated>2020-05-05T16:01:00+01:00</updated>
    <content type="html">&lt;p&gt;I work in IT and am vaguely technical. I use Linux and vaguely know
how to program in C, Python, PL/SQL and install, configure and tune a
variety of databases.&lt;/p&gt;
&lt;p&gt;However, apart from the odd gratuitous post detailing my Linux desktop
setup, I generally don't post technical content and never have done.&lt;/p&gt;
&lt;p&gt;I am slightly conflicted and feel guilty about this as I feel that I
have learned so much from other people's blog posts and, increasingly,
videos that I should really try to reciprocate and offer something
back to the community.&lt;/p&gt;
&lt;p&gt;I think these are some reasons that I stubbornly refuse do so.&lt;/p&gt;
&lt;p&gt;1) Whatever the subject, whatever the technology, someone, somewhere
at sometime has already posted about that subject. In addition, they
have done so to such a very high standard, producing excellent content
that I could never hope to match.&lt;/p&gt;
&lt;p&gt;This is a very lazy attitude and a convenient excuse which is easy to
adopt. However, there will always be something that you know that
other people would be interested to learn about. Normally, it doesn't
really matter whether other folk have already covered the same subject
matter a hundred times as you will always have a different viewpoint
and maybe express it in a different way which will be valuable to
others.&lt;/p&gt;
&lt;p&gt;For example, I read whitepapers, subscribe to blogs and watch videos
about Oracle APEX and although, seemingly they may cover the same
functional area, I normally manage to glean some useful information
from each and every one. Most of the core technical content might be
repeated but almost always, the author has a little extra to add -
something I hadn't previously thought of and is new and relevant to
me.&lt;/p&gt;
&lt;p&gt;2) I constantly worry about the quality of the content. I also worry
that I would post incorrect or misleading information. I work for
Oracle Corporation. I don't particularly want people pointing out
glaring deficiencies or errors in my blog posts that is then
circulated to a wider audience ('Christ - this clown actually works
for Oracle and he doesn't even understand Materialised Views') - and
worse, potentially back to colleagues&lt;/p&gt;
&lt;p&gt;Again, this is a rather lazy attitude, the obvious solution to which
would be check and double check your content so it is accurate,
correct and beyond reproach. But that would take time and effort.&lt;/p&gt;
&lt;p&gt;3) I am innately very lazy. Some technical subjects can be usefully
described in a text only format on a blog but Oracle APEX is a Web
based application framework so obviously screenshots (or even video
format) would be preferable to fully describe the subject matter.&lt;/p&gt;
&lt;p&gt;Clearly, posting an set of screenshots is possible but the logistics
of recording a video complete with audio fills me with dread and
again, would be time consuming.&lt;/p&gt;
&lt;p&gt;Posting useful, accurate content on technical subjects would require
some commitment and take time. My manager would probably rather I
concentrate on my day job rather than post a series of introductory
posts aimed at aspiring Python programmers.&lt;/p&gt;
&lt;p&gt;Also, when I finish work, I tend to turn the computer off. It's not
really my idea of fun to sit down in front of my screen for another
two hours writing about how to configure Web Source Modules in APEX.&lt;/p&gt;</content>
    <link href="https://www.yakshaving.co.uk/posts/day10/"/>
    <category term="blogging"/>
    <category term="100DaysToOffload"/>
    <published>2020-05-05T16:01:00+01:00</published>
  </entry>
  <entry>
    <id>https://www.yakshaving.co.uk/posts/day09/</id>
    <title>Day 9</title>
    <updated>2020-05-04T13:27:00+01:00</updated>
    <content type="html">&lt;p&gt;Nice weekend, Barry ?&lt;/p&gt;
&lt;p&gt;Yeah, very busy though, Dave. Very busy&lt;/p&gt;
&lt;p&gt;'What did you get up to ?'&lt;/p&gt;
&lt;p&gt;'Saturday morning, Sandra and me went down Tesco. Bloody great queue
as normal. Full of idiots with nothing better to do. It was 25 minutes
before we even got into the store'.&lt;/p&gt;
&lt;p&gt;'What did you go for ?'&lt;/p&gt;
&lt;p&gt;'Nothing much. Just laughing at people asking staff for that fancy
wholemeal, gluten-free flour when there's bread on the shelves. Plus
we had to get jelly and a cake for Harry's birthday'.&lt;/p&gt;
&lt;p&gt;'Oh I didn't realise his birthday was this weekend'&lt;/p&gt;
&lt;p&gt;'Nah, nah - not till August but Sandra's worried that stuff may sell
out when lockdown is lifted'.&lt;/p&gt;
&lt;p&gt;'Anyway, driving back, we noticed a ruddy great queue at that
Drive-Thru Costa...'&lt;/p&gt;
&lt;p&gt;'Yeah - it's complete madness isn't it. People are...'&lt;/p&gt;
&lt;p&gt;'So Sandra immediately screamed at me to pull over and get in lane. We
queued for 25 minutes but I'll tell you, that iced mocha tasted like
the finest champagne'.&lt;/p&gt;
&lt;p&gt;'Sounds like you've been busy'&lt;/p&gt;
&lt;p&gt;'Yeah - after lunch, Sandra read on Facebook that B+Q was open so we
had to drive down there. Another bloody queue. 25 minutes waiting in
the car park. Where do all these people come from ?'&lt;/p&gt;
&lt;p&gt;'What were you getting - plants, paint ?'&lt;/p&gt;
&lt;p&gt;'Nah. Sandra wants one of them fancy pergola things putting up so we
were looking at trellis. You're not gonna believe this though,
Dave. They only had white left. No American Redwood or pine so we're
gonna have to go back next week. What's wrong with people ? Is trellis
really an &lt;strong&gt;essential&lt;/strong&gt; purchase - is it fuck ?!'.&lt;/p&gt;
&lt;p&gt;'Oh that's a shame. I guess you took it easy on Sunday'.&lt;/p&gt;
&lt;p&gt;'Sunday. Well on Sunday, Sandra wakes me up and tells me the Community
WhatsApp group claims the tip is open between 9 and 1pm. Guess what,
Dave - another bloody long queue of cars queuing back to the retail
park. Have people got nothing better to do on a Sunday morning ? I
mean - seriously !'&lt;/p&gt;
&lt;p&gt;'So you must have had a lot of garden rubbish ?'&lt;/p&gt;
&lt;p&gt;'Nah, not really. Just the old microwave we replaced at
Christmas. Still, the weather wasn't brilliant so we thought it might
be a nice day out'.&lt;/p&gt;
&lt;p&gt;'You've certainly have been busy'&lt;/p&gt;
&lt;p&gt;'Yeah - I know. To be honest Dave, it's be a bloody relief when this
is all over and I can go back to stretching out on the couch, watching
NetFlix'.&lt;/p&gt;</content>
    <link href="https://www.yakshaving.co.uk/posts/day09/"/>
    <category term="blogging"/>
    <category term="100DaysToOffload"/>
    <published>2020-05-04T13:27:00+01:00</published>
  </entry>
  <entry>
    <id>https://www.yakshaving.co.uk/posts/day08/</id>
    <title>Day 8</title>
    <updated>2020-05-03T13:00:00+01:00</updated>
    <content type="html">&lt;p&gt;Saturday 2 May&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Six days thou shalt do thy work, and on the seventh day thou shalt
rest: that thine ox and thine ass may rest, and the son of thy
handmaid, and the stranger, may be refreshed.&lt;/p&gt;
&lt;/blockquote&gt;</content>
    <link href="https://www.yakshaving.co.uk/posts/day08/"/>
    <category term="blogging"/>
    <category term="100DaysToOffload"/>
    <published>2020-05-03T13:00:00+01:00</published>
  </entry>
  <entry>
    <id>https://www.yakshaving.co.uk/posts/day07/</id>
    <title>Day 7</title>
    <updated>2020-05-02T15:35:00+01:00</updated>
    <content type="html">&lt;p&gt;Friday 1 May&lt;/p&gt;
&lt;p&gt;Inspired by &lt;a href="https://mastodon.sdf.org/@Luke" rel="noopener noreferrer" target="_blank"&gt;Luke&lt;/a&gt;'s post about his love of &lt;a href="https://write.as/luke/books" rel="noopener noreferrer" target="_blank"&gt;books&lt;/a&gt;, here's the
current collection of books on my bedroom dresser.&lt;/p&gt;
&lt;p&gt;I also like books but my reading is mainly limited to the time in bed
before going to sleep. This is a rather atypical list as I normally
read lightweight, disposable thrillers (Michael Connelly, Clare
Mackintosh etc).&lt;/p&gt;
&lt;p&gt;1) &lt;a href="https://www.amazon.co.uk/Humble-Pi-Comedy-Maths-Errors/dp/0141989149/" rel="noopener noreferrer" target="_blank"&gt;Humble Pi&lt;/a&gt; - Matt Parker&lt;/p&gt;
&lt;p&gt;An interesting book about how maths causes glitches in real-life
scenarios such as the wobbly Westminster bridge in London.&lt;/p&gt;
&lt;p&gt;2) &lt;a href="https://www.amazon.co.uk/Unreliable-Memoirs-Clive-James/dp/1447275489/" rel="noopener noreferrer" target="_blank"&gt;Unreliable Memoirs&lt;/a&gt; - Clive  James&lt;/p&gt;
&lt;p&gt;I purchased this after the great journalist, author and TV documentary
maker's sad demise in November 2019. A beautifully written and
humorous autobiography describing his early life in Australia.&lt;/p&gt;
&lt;p&gt;3) &lt;a href="https://www.amazon.co.uk/Parsnips-Buttered-modern-life-email/dp/1473640431" rel="noopener noreferrer" target="_blank"&gt;Parsnips Buttered&lt;/a&gt; - Joe Lycett&lt;/p&gt;
&lt;p&gt;My son bought me this book for Christmas. I enjoyed it more than I
thought I would. A modern day story of a man's quest to fight back
against large corporations and the niggles and irritations in his
daily life.&lt;/p&gt;
&lt;p&gt;4) &lt;a href="https://www.amazon.co.uk/Secret-Barrister-Stories-Law-Broken/dp/1509841148/" rel="noopener noreferrer" target="_blank"&gt;The Secret Barrister&lt;/a&gt;: Stories of the Law and How It's Broken&lt;/p&gt;
&lt;p&gt;Written by an anonymous English barrister describing the deficiencies
and pitfalls of the UK legal system. I found the history of the legal
system and the real-life anecdotes quite interesting but, after a
while, I found the author's message and content slightly repetitive
and I struggled to finish it.&lt;/p&gt;
&lt;p&gt;5) &lt;a href="https://www.amazon.co.uk/Definitive-Book-Body-Language-attitudes/dp/1409168506/" rel="noopener noreferrer" target="_blank"&gt;The Definitive Book of Body Language&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;A Xmas present to myself on a subject that always interested me. Turns
out I was already loosely aware of most of the content. Trump's
forceful, prolonged handshake is an attempt to impose himself and
intimidate others - who knew ?&lt;/p&gt;
&lt;p&gt;6)  &lt;a href="https://www.amazon.co.uk/Gotta-Get-Theroux-This-television/dp/1509880364/" rel="noopener noreferrer" target="_blank"&gt;Gotta Get Theroux This&lt;/a&gt; - Louis Theroux&lt;/p&gt;
&lt;p&gt;A fairly standard, uninspiring autobiography (clue was in the title)
aimed at the Christmas market. I like Theroux's thought provoking TV
documentaries and was particularly interested in his now infamous
programs featuring Jimmy Savile. However, if you're interested in
somebody, you normally have already watched TV interviews and read
articles about them, so it's hard to produce new, compelling content
for a book.&lt;/p&gt;
&lt;p&gt;For example, I was already aware how Theroux has wrestled and
constantly questioned himself over whether he was hoodwinked by
Savile, a subject which he covers in some depth in the book.&lt;/p&gt;
&lt;p&gt;7) &lt;a href="https://www.amazon.co.uk/Step-Life-My-Journeys/dp/1473689120/" rel="noopener noreferrer" target="_blank"&gt;Step by Step&lt;/a&gt; - Simon Reeve&lt;/p&gt;
&lt;p&gt;My current night time reading matter and the most enjoyable book I've
read in ages. Again, I like Simon Reeve's easy going manner, his
ability to gel with strangers and his mix of interesting travel
destinations coupled with other historic, political or human interest
perspectives.&lt;/p&gt;
&lt;p&gt;I was aware Simon Reeve didn't have a conventional academic background
prior to becoming a TV journalist but he was born in a rough area in
Acton, West London. He had a rather colourful life as a boy, bunking
off school, shoplifting, gang fights and eventually setting up a small
business in sourcing knives and replica weapons for his peers.&lt;/p&gt;
&lt;p&gt;He left school with few qualifications and started out as a post-room
boy at The Times newspaper. His ambition and cheerful, 'happy to help'
disposition found him assisting experienced journalists on
investigative stories and he eventually ended up as deputy news editor
and wrote a book about Osama Bin Laden (pre 9/11) before landing his
break with the BBC.&lt;/p&gt;
&lt;p&gt;I found it an entertaining and fascinating read.&lt;/p&gt;
&lt;p&gt;8) &lt;a href="https://www.amazon.co.uk/Man-without-Face-Unlikely-Vladimir/dp/1847084230/" rel="noopener noreferrer" target="_blank"&gt;The Unlikely Rise of Vladimir Putin&lt;/a&gt; - Masha Green&lt;/p&gt;
&lt;p&gt;Next in line is this biography of Vladimir Putin which was a present
from the wife following our trip to Russia in the summer of 2019.&lt;/p&gt;</content>
    <link href="https://www.yakshaving.co.uk/posts/day07/"/>
    <category term="blogging"/>
    <category term="100DaysToOffload"/>
    <published>2020-05-02T15:35:00+01:00</published>
  </entry>
</feed>
