<?xml version='1.0' encoding='UTF-8'?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" version="2.0">
  <channel>
    <title>Blog In Isolation</title>
    <link>https://www.yakshaving.co.uk</link>
    <description>Latest posts from Blog In Isolation</description>
    <atom:link href="https://www.yakshaving.co.uk/feed.xml" rel="self"/>
    <docs>http://www.rssboard.org/rss-specification</docs>
    <generator>python-feedgen</generator>
    <language>en</language>
    <lastBuildDate>Sun, 07 Jun 2026 10:03:53 +0000</lastBuildDate>
    <item>
      <title>conquering the Emacs daemon</title>
      <link>https://www.yakshaving.co.uk/posts/conquering-the-emacs-daemon/</link>
      <description>&lt;p&gt;Jack encountered some &lt;a href="https://baty.net/journal/04Jun26/" rel="noopener noreferrer" target="_blank"&gt;problems&lt;/a&gt; configuring the Emacs daemon.
Configuring Emacs to run as a background process at boot time is the
standard recommendation to significantly improve Emacs startup time.&lt;/p&gt;
&lt;p&gt;As I have also previously struggled (and given up) with this issue,
here's how I finally resolved the issue on my environment (Arch Linux,
7.0.10 kernel, GNOME v50, Wayland).&lt;/p&gt;
&lt;h2 id="test-the-emacs-client-server"&gt;Test the Emacs client server&lt;/h2&gt;
&lt;p&gt;Initially, I manually ran the Emacs daemon (as documented in the
&lt;a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Emacs-Server.html" rel="noopener noreferrer" target="_blank"&gt;manual&lt;/a&gt;) and tested invoking emacs using the &lt;code&gt;emacsclient&lt;/code&gt; command.&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;emacs&lt;span class="w"&gt; &lt;/span&gt;--fg-daemon&lt;span class="w"&gt;               &lt;/span&gt;&lt;span class="c1"&gt;# Run the daemon in the foreground to see any messages&lt;/span&gt;
$&lt;span class="w"&gt; &lt;/span&gt;emacsclient&lt;span class="w"&gt; &lt;/span&gt;--create-frame&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="c1"&gt;# Invoke emacs client&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;This worked OK although I noted a couple of minor issues:&lt;/p&gt;
&lt;h2 id="dashboard-package"&gt;Dashboard package&lt;/h2&gt;
&lt;p&gt;The dashboard package needed a (&lt;a href="https://github.com/emacs-dashboard/dashboard#emacs-daemon" rel="noopener noreferrer" target="_blank"&gt;documented&lt;/a&gt;) minor configuration
change.&lt;/p&gt;
&lt;div class="highlight" data-lang="elisp"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;setq&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;initial-buffer-choice&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;#39;dashboard-open&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;I also added another configuration entry to ensure the dashboard was
 correctly refreshed (recent files) when opening a new frame&lt;/p&gt;
&lt;div class="highlight" data-lang="elisp"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;add-hook&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;#39;server-after-make-frame-hook&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;#39;dashboard-open&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2 id="configure-systemd"&gt;Configure systemd&lt;/h2&gt;
&lt;p&gt;The Emacs distribution includes a sample systemd unit configuration
file (under &lt;code&gt;etc/emacs.service&lt;/code&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="o"&gt;[&lt;/span&gt;Unit&lt;span class="o"&gt;]&lt;/span&gt;
&lt;span class="nv"&gt;Description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;Emacs&lt;span class="w"&gt; &lt;/span&gt;text&lt;span class="w"&gt; &lt;/span&gt;editor
&lt;span class="nv"&gt;Documentation&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;info:emacs&lt;span class="w"&gt; &lt;/span&gt;man:emacs&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;https://gnu.org/software/emacs/

&lt;span class="o"&gt;[&lt;/span&gt;Service&lt;span class="o"&gt;]&lt;/span&gt;
&lt;span class="nv"&gt;Type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;notify
&lt;span class="nv"&gt;ExecStart&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;emacs&lt;span class="w"&gt; &lt;/span&gt;--fg-daemon

&lt;span class="c1"&gt;# Emacs will exit with status 15 after having received SIGTERM, which&lt;/span&gt;
&lt;span class="c1"&gt;# is the default &amp;quot;KillSignal&amp;quot; value systemd uses to stop services.&lt;/span&gt;
&lt;span class="nv"&gt;SuccessExitStatus&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;15&lt;/span&gt;

&lt;span class="c1"&gt;# The location of the SSH auth socket varies by distribution, and some&lt;/span&gt;
&lt;span class="c1"&gt;# set it from PAM, so don&amp;#39;t override by default.&lt;/span&gt;
&lt;span class="c1"&gt;# Environment=SSH_AUTH_SOCK=%t/keyring/ssh&lt;/span&gt;
&lt;span class="nv"&gt;Restart&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;on-failure

&lt;span class="o"&gt;[&lt;/span&gt;Install&lt;span class="o"&gt;]&lt;/span&gt;
&lt;span class="nv"&gt;WantedBy&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;default.target
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;A couple of minor changes were required here:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Configure the Emacs service as a user (not system) service.&lt;/li&gt;
&lt;li&gt;Ensure the Emacs daemon waits for the Wayland/X server to fully
  initialise.&lt;/li&gt;
&lt;li&gt;To avoid the &lt;code&gt;Authorization required, but no authorization protocol
  specified&lt;/code&gt; error, run the Emacs daemon in the background (use
  &lt;code&gt;--daemon&lt;/code&gt; instead of &lt;code&gt;--fg-daemon&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight" data-lang="diff"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ diff /usr/local/lib/systemd/user/emacs.service etc/emacs.service
&lt;span class="gu"&gt;4d7&lt;/span&gt;
&lt;span class="gd"&gt;&amp;lt; After=graphical-session.target&lt;/span&gt;
&lt;span class="gu"&gt;8,9c11&lt;/span&gt;
&lt;span class="gd"&gt;&amp;lt; ExecStart=/usr/local/bin/emacs --daemon&lt;/span&gt;
&lt;span class="gs"&gt;---&lt;/span&gt;
&lt;span class="gi"&gt;&amp;gt; ExecStart=emacs --fg-daemon&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;It was very tricky to get Emacs to honour the initial frame properties
(height, width) correctly. Eventually I gave up and configured this in
the Emacs configuration (which worked fine).&lt;/p&gt;
&lt;div class="highlight" data-lang="elisp"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;use-package&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;frame&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nb"&gt;:ensure&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;nil&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nb"&gt;:config&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="c1"&gt;;; Set initial frame properties (dimensions and font)&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;add-to-list&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;#39;default-frame-alist&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;height&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="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;add-to-list&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;#39;default-frame-alist&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;width&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="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;add-to-list&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;#39;default-frame-alist&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;font&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="s"&gt;&amp;quot;Inconsolata-11&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
      <guid isPermaLink="false">https://www.yakshaving.co.uk/posts/conquering-the-emacs-daemon/</guid>
      <category>software</category>
      <category>Emacs</category>
      <pubDate>Fri, 05 Jun 2026 13:47:31 +0100</pubDate>
    </item>
    <item>
      <title>APEX 26.1 upgrade from 24.2</title>
      <link>https://www.yakshaving.co.uk/posts/apex-26-1-upgrade/</link>
      <description>&lt;p&gt;Oracle finally released the long anticipated &lt;a href="https://blogs.oracle.com/apex/announcing-oracle-apex-261" rel="noopener noreferrer" target="_blank"&gt;26.1&lt;/a&gt; release of
&lt;a href="https://www.oracle.com/apex/" rel="noopener noreferrer" target="_blank"&gt;APEX&lt;/a&gt; yesterday. Here are the steps I followed to upgrade from APEX
24.2 on Oracle Linux 9.&lt;/p&gt;
&lt;h1 id="oracle-26ai-database"&gt;Oracle 26ai database&lt;/h1&gt;
&lt;p&gt;Oracle database version &lt;a href="https://docs.oracle.com/en/database/oracle/oracle-database/26/" rel="noopener noreferrer" target="_blank"&gt;26ai&lt;/a&gt; (23.26) was already installed and
configured. This is the recommended database version for APEX 26.1
although Oracle database 19c (19.18 or higher) is also
&lt;a href="https://docs.oracle.com/en/database/oracle/apex/26.1/htmrn/about-release-notes.html#GUID-540B73CB-08A7-4422-B6BF-CC785EC47694" rel="noopener noreferrer" target="_blank"&gt;supported&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;sqlplus&lt;span class="w"&gt; &lt;/span&gt;/&lt;span class="w"&gt; &lt;/span&gt;as&lt;span class="w"&gt; &lt;/span&gt;sysdba

SQL*Plus:&lt;span class="w"&gt; &lt;/span&gt;Release&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;23&lt;/span&gt;.26.1.0.0&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;Production&lt;span class="w"&gt; &lt;/span&gt;on&lt;span class="w"&gt; &lt;/span&gt;Fri&lt;span class="w"&gt; &lt;/span&gt;May&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;15&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;12&lt;/span&gt;:06:39&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2026&lt;/span&gt;
Version&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;23&lt;/span&gt;.26.1.0.0

Connected&lt;span class="w"&gt; &lt;/span&gt;to&lt;span class="w"&gt; &lt;/span&gt;an&lt;span class="w"&gt; &lt;/span&gt;idle&lt;span class="w"&gt; &lt;/span&gt;instance.
SQL&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;startup
ORACLE&lt;span class="w"&gt; &lt;/span&gt;instance&lt;span class="w"&gt; &lt;/span&gt;started.
Total&lt;span class="w"&gt; &lt;/span&gt;System&lt;span class="w"&gt; &lt;/span&gt;Global&lt;span class="w"&gt; &lt;/span&gt;Area&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;6439552584&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;bytes
Fixed&lt;span class="w"&gt; &lt;/span&gt;Size&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="m"&gt;5023304&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;bytes
Variable&lt;span class="w"&gt; &lt;/span&gt;Size&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="m"&gt;3372220416&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;bytes
Database&lt;span class="w"&gt; &lt;/span&gt;Buffers&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="m"&gt;3053453312&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;bytes
Redo&lt;span class="w"&gt; &lt;/span&gt;Buffers&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="m"&gt;8855552&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;bytes
Database&lt;span class="w"&gt; &lt;/span&gt;mounted.
Database&lt;span class="w"&gt; &lt;/span&gt;opened.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h1 id="oracle-listener"&gt;Oracle listener&lt;/h1&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;lsnrctl&lt;span class="w"&gt; &lt;/span&gt;start
LSNRCTL&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;Linux:&lt;span class="w"&gt; &lt;/span&gt;Version&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;23&lt;/span&gt;.26.1.0.0&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;Production&lt;span class="w"&gt; &lt;/span&gt;on&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;15&lt;/span&gt;-MAY-2026&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;12&lt;/span&gt;:08:40

Starting&lt;span class="w"&gt; &lt;/span&gt;/opt/oracle/product/26ai/dbhome_1/bin/tnslsnr:&lt;span class="w"&gt; &lt;/span&gt;please&lt;span class="w"&gt; &lt;/span&gt;wait...
TNSLSNR&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;Linux:&lt;span class="w"&gt; &lt;/span&gt;Version&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;23&lt;/span&gt;.26.1.0.0&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;Production
Log&lt;span class="w"&gt; &lt;/span&gt;messages&lt;span class="w"&gt; &lt;/span&gt;written&lt;span class="w"&gt; &lt;/span&gt;to&lt;span class="w"&gt; &lt;/span&gt;/opt/oracle/diag/tnslsnr/ol9-26/listener/alert/log.xml
Listening&lt;span class="w"&gt; &lt;/span&gt;on:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;DESCRIPTION&lt;/span&gt;&lt;span class="o"&gt;=(&lt;/span&gt;&lt;span class="nv"&gt;ADDRESS&lt;/span&gt;&lt;span class="o"&gt;=(&lt;/span&gt;&lt;span class="nv"&gt;PROTOCOL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;tcp&lt;span class="o"&gt;)(&lt;/span&gt;&lt;span class="nv"&gt;HOST&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;ol9-26.localdomain&lt;span class="o"&gt;)(&lt;/span&gt;&lt;span class="nv"&gt;PORT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1521&lt;/span&gt;&lt;span class="o"&gt;)))&lt;/span&gt;

Connecting&lt;span class="w"&gt; &lt;/span&gt;to&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;ADDRESS&lt;/span&gt;&lt;span class="o"&gt;=(&lt;/span&gt;&lt;span class="nv"&gt;PROTOCOL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;tcp&lt;span class="o"&gt;)(&lt;/span&gt;&lt;span class="nv"&gt;HOST&lt;/span&gt;&lt;span class="o"&gt;=)(&lt;/span&gt;&lt;span class="nv"&gt;PORT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1521&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt;
STATUS&lt;span class="w"&gt; &lt;/span&gt;of&lt;span class="w"&gt; &lt;/span&gt;the&lt;span class="w"&gt; &lt;/span&gt;LISTENER
------------------------
Alias&lt;span class="w"&gt;                     &lt;/span&gt;LISTENER
Version&lt;span class="w"&gt;                   &lt;/span&gt;TNSLSNR&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;Linux:&lt;span class="w"&gt; &lt;/span&gt;Version&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;23&lt;/span&gt;.26.1.0.0&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;Production
Start&lt;span class="w"&gt; &lt;/span&gt;Date&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="m"&gt;15&lt;/span&gt;-MAY-2026&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;12&lt;/span&gt;:08:41
Uptime&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;days&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;hr.&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;min.&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;sec
Trace&lt;span class="w"&gt; &lt;/span&gt;Level&lt;span class="w"&gt;               &lt;/span&gt;off
Security&lt;span class="w"&gt;                  &lt;/span&gt;ON:&lt;span class="w"&gt; &lt;/span&gt;Local&lt;span class="w"&gt; &lt;/span&gt;OS&lt;span class="w"&gt; &lt;/span&gt;Authentication
SNMP&lt;span class="w"&gt;                      &lt;/span&gt;OFF
Listener&lt;span class="w"&gt; &lt;/span&gt;Log&lt;span class="w"&gt; &lt;/span&gt;File&lt;span class="w"&gt;         &lt;/span&gt;/opt/oracle/diag/tnslsnr/ol9-26/listener/alert/log.xml
Listening&lt;span class="w"&gt; &lt;/span&gt;Endpoints&lt;span class="w"&gt; &lt;/span&gt;Summary...
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;DESCRIPTION&lt;/span&gt;&lt;span class="o"&gt;=(&lt;/span&gt;&lt;span class="nv"&gt;ADDRESS&lt;/span&gt;&lt;span class="o"&gt;=(&lt;/span&gt;&lt;span class="nv"&gt;PROTOCOL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;tcp&lt;span class="o"&gt;)(&lt;/span&gt;&lt;span class="nv"&gt;HOST&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;ol9-26.localdomain&lt;span class="o"&gt;)(&lt;/span&gt;&lt;span class="nv"&gt;PORT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1521&lt;/span&gt;&lt;span class="o"&gt;)))&lt;/span&gt;
The&lt;span class="w"&gt; &lt;/span&gt;listener&lt;span class="w"&gt; &lt;/span&gt;supports&lt;span class="w"&gt; &lt;/span&gt;no&lt;span class="w"&gt; &lt;/span&gt;services
The&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;command&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;completed&lt;span class="w"&gt; &lt;/span&gt;successfully
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h1 id="ords"&gt;ORDS&lt;/h1&gt;
&lt;p&gt;ORDS 26.1.1 was &lt;a href="https://www.oracle.com/database/sqldeveloper/technologies/db-actions/download/" rel="noopener noreferrer" target="_blank"&gt;released&lt;/a&gt; on 14 May 2026 in conjunction with
the release of APEX 26.1. Upgrading ORDS to 26.1.1 from 26.1 is
&lt;strong&gt;&lt;a href="https://www.oracle.com/tools/ords/ords-relnotes-26.1.1.html" rel="noopener noreferrer" target="_blank"&gt;required&lt;/a&gt;&lt;/strong&gt; to support the APEXlang functionality but a
trivial upgrade (from 26.1).&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;/u01/ords/bin/ords&lt;span class="w"&gt; &lt;/span&gt;install
ORDS:&lt;span class="w"&gt; &lt;/span&gt;Release&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;26&lt;/span&gt;.1&lt;span class="w"&gt; &lt;/span&gt;Production&lt;span class="w"&gt; &lt;/span&gt;on&lt;span class="w"&gt; &lt;/span&gt;Fri&lt;span class="w"&gt; &lt;/span&gt;May&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;15&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;11&lt;/span&gt;:13:03&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2026&lt;/span&gt;

Configuration:
&lt;span class="w"&gt;  &lt;/span&gt;/u01/config/ords
Oracle&lt;span class="w"&gt; &lt;/span&gt;REST&lt;span class="w"&gt; &lt;/span&gt;Data&lt;span class="w"&gt; &lt;/span&gt;Services&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;Interactive&lt;span class="w"&gt; &lt;/span&gt;Install
&lt;span class="w"&gt;  &lt;/span&gt;Enter&lt;span class="w"&gt; &lt;/span&gt;a&lt;span class="w"&gt; &lt;/span&gt;number&lt;span class="w"&gt; &lt;/span&gt;to&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;select&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;the&lt;span class="w"&gt; &lt;/span&gt;database&lt;span class="w"&gt; &lt;/span&gt;pool&lt;span class="w"&gt; &lt;/span&gt;to&lt;span class="w"&gt; &lt;/span&gt;upgrade&lt;span class="w"&gt; &lt;/span&gt;ORDS&lt;span class="w"&gt; &lt;/span&gt;or&lt;span class="w"&gt; &lt;/span&gt;create&lt;span class="w"&gt; &lt;/span&gt;an&lt;span class="w"&gt; &lt;/span&gt;additional&lt;span class="w"&gt; &lt;/span&gt;database&lt;span class="w"&gt; &lt;/span&gt;pool
&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;default&lt;span class="w"&gt;      &lt;/span&gt;jdbc:oracle:thin:@//ol9-26.localdomain:1521/pdb1
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;C&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Create&lt;span class="w"&gt; &lt;/span&gt;an&lt;span class="w"&gt; &lt;/span&gt;additional&lt;span class="w"&gt; &lt;/span&gt;database&lt;span class="w"&gt; &lt;/span&gt;pool
&lt;span class="w"&gt;  &lt;/span&gt;Choose&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;Provide&lt;span class="w"&gt; &lt;/span&gt;database&lt;span class="w"&gt; &lt;/span&gt;user&lt;span class="w"&gt; &lt;/span&gt;name&lt;span class="w"&gt; &lt;/span&gt;with&lt;span class="w"&gt; &lt;/span&gt;administrator&lt;span class="w"&gt; &lt;/span&gt;privileges.
&lt;span class="w"&gt;    &lt;/span&gt;Enter&lt;span class="w"&gt; &lt;/span&gt;the&lt;span class="w"&gt; &lt;/span&gt;administrator&lt;span class="w"&gt; &lt;/span&gt;username:&lt;span class="w"&gt; &lt;/span&gt;ORDSADMIN:&lt;span class="w"&gt; &lt;/span&gt;******
&lt;span class="w"&gt;  &lt;/span&gt;Enter&lt;span class="w"&gt; &lt;/span&gt;the&lt;span class="w"&gt; &lt;/span&gt;database&lt;span class="w"&gt; &lt;/span&gt;password&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;ORDSADMIN:&lt;span class="w"&gt; &lt;/span&gt;******

Retrieving&lt;span class="w"&gt; &lt;/span&gt;information.
Connecting&lt;span class="w"&gt; &lt;/span&gt;to&lt;span class="w"&gt; &lt;/span&gt;database&lt;span class="w"&gt; &lt;/span&gt;user:&lt;span class="w"&gt; &lt;/span&gt;ORDS_PUBLIC_USER&lt;span class="w"&gt; &lt;/span&gt;url:&lt;span class="w"&gt; &lt;/span&gt;jdbc:oracle:thin:@//ol9-26.localdomain:1521/pdb1
&lt;span class="m"&gt;2026&lt;/span&gt;-05-15T11:13:28.912Z&lt;span class="w"&gt; &lt;/span&gt;INFO&lt;span class="w"&gt;        &lt;/span&gt;The&lt;span class="w"&gt; &lt;/span&gt;log&lt;span class="w"&gt; &lt;/span&gt;file&lt;span class="w"&gt; &lt;/span&gt;is&lt;span class="w"&gt; &lt;/span&gt;defaulted&lt;span class="w"&gt; &lt;/span&gt;to&lt;span class="w"&gt; &lt;/span&gt;the&lt;span class="w"&gt; &lt;/span&gt;current&lt;span class="w"&gt; &lt;/span&gt;working&lt;span class="w"&gt; &lt;/span&gt;directory&lt;span class="w"&gt; &lt;/span&gt;located&lt;span class="w"&gt; &lt;/span&gt;at&lt;span class="w"&gt; &lt;/span&gt;/u01/ords/logs/
&lt;span class="m"&gt;2026&lt;/span&gt;-05-15T11:13:28.988Z&lt;span class="w"&gt; &lt;/span&gt;INFO&lt;span class="w"&gt;        &lt;/span&gt;Upgrading&lt;span class="w"&gt; &lt;/span&gt;Oracle&lt;span class="w"&gt; &lt;/span&gt;REST&lt;span class="w"&gt; &lt;/span&gt;Data&lt;span class="w"&gt; &lt;/span&gt;Services&lt;span class="w"&gt; &lt;/span&gt;schema&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;26&lt;/span&gt;.1.0.r0900845&lt;span class="w"&gt; &lt;/span&gt;to&lt;span class="w"&gt; &lt;/span&gt;version&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;26&lt;/span&gt;.1.1.r1321130&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;PDB1
&lt;span class="m"&gt;2026&lt;/span&gt;-05-15T11:13:47.340Z&lt;span class="w"&gt; &lt;/span&gt;INFO&lt;span class="w"&gt;        &lt;/span&gt;Completed&lt;span class="w"&gt; &lt;/span&gt;upgrade&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;Oracle&lt;span class="w"&gt; &lt;/span&gt;REST&lt;span class="w"&gt; &lt;/span&gt;Data&lt;span class="w"&gt; &lt;/span&gt;Services&lt;span class="w"&gt; &lt;/span&gt;version&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;26&lt;/span&gt;.1.1.r1321130.&lt;span class="w"&gt; &lt;/span&gt;Elapsed&lt;span class="w"&gt; &lt;/span&gt;time:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;00&lt;/span&gt;:00:18.168
&lt;span class="m"&gt;2026&lt;/span&gt;-05-15T11:13:47.342Z&lt;span class="w"&gt; &lt;/span&gt;INFO&lt;span class="w"&gt;        &lt;/span&gt;Log&lt;span class="w"&gt; &lt;/span&gt;file&lt;span class="w"&gt; &lt;/span&gt;written&lt;span class="w"&gt; &lt;/span&gt;to&lt;span class="w"&gt; &lt;/span&gt;/u01/ords/logs/ords_upgrade_2026-05-15_111328_91638.log
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Check the ORDS version is correct.&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;ords&lt;span class="w"&gt; &lt;/span&gt;--version
ORDS:&lt;span class="w"&gt; &lt;/span&gt;Release&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;26&lt;/span&gt;.1&lt;span class="w"&gt; &lt;/span&gt;Production&lt;span class="w"&gt; &lt;/span&gt;on&lt;span class="w"&gt; &lt;/span&gt;Fri&lt;span class="w"&gt; &lt;/span&gt;May&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;15&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;11&lt;/span&gt;:14:25&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2026&lt;/span&gt;

Configuration:
&lt;span class="w"&gt;  &lt;/span&gt;/u01/config/ords
Oracle&lt;span class="w"&gt; &lt;/span&gt;REST&lt;span class="w"&gt; &lt;/span&gt;Data&lt;span class="w"&gt; &lt;/span&gt;Services&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;26&lt;/span&gt;.1.1.r1321130
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h1 id="apex"&gt;APEX&lt;/h1&gt;
&lt;h2 id="download-apex-261-software"&gt;Download APEX 26.1 software&lt;/h2&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;wget&lt;span class="w"&gt; &lt;/span&gt;https://download.oracle.com/otn_software/apex/apex-latest.zip
$&lt;span class="w"&gt; &lt;/span&gt;mkdir&lt;span class="w"&gt; &lt;/span&gt;~/software/APEX/apex-26.1
$&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;~/software/APEX/apex-26.1
$&lt;span class="w"&gt; &lt;/span&gt;unzip&lt;span class="w"&gt; &lt;/span&gt;~/apex-latest.zip
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2 id="upgrade-to-apex-261"&gt;Upgrade to APEX 26.1&lt;/h2&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;sqlplus&lt;span class="w"&gt; &lt;/span&gt;/&lt;span class="w"&gt; &lt;/span&gt;as&lt;span class="w"&gt; &lt;/span&gt;sysdba

SQL&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;alter&lt;span class="w"&gt; &lt;/span&gt;session&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;container&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;PDB1&lt;span class="p"&gt;;&lt;/span&gt;

SQL&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;@apexins&lt;span class="w"&gt; &lt;/span&gt;APEX&lt;span class="w"&gt; &lt;/span&gt;APEX&lt;span class="w"&gt; &lt;/span&gt;TEMP&lt;span class="w"&gt; &lt;/span&gt;/i/
&lt;span class="w"&gt;  &lt;/span&gt;...set_appun.sql
PL/SQL&lt;span class="w"&gt; &lt;/span&gt;procedure&lt;span class="w"&gt; &lt;/span&gt;successfully&lt;span class="w"&gt; &lt;/span&gt;completed.
...set_ufrom_and_upgrade.sql
PL/SQL&lt;span class="w"&gt; &lt;/span&gt;procedure&lt;span class="w"&gt; &lt;/span&gt;successfully&lt;span class="w"&gt; &lt;/span&gt;completed.

.&lt;span class="w"&gt; &lt;/span&gt;ORACLE
.
.&lt;span class="w"&gt; &lt;/span&gt;Oracle&lt;span class="w"&gt; &lt;/span&gt;APEX&lt;span class="w"&gt; &lt;/span&gt;Installation.
..........................................
.
...set_appun.sql
...&lt;span class="w"&gt; &lt;/span&gt;Checking&lt;span class="w"&gt; &lt;/span&gt;prerequisites&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;MANUAL&lt;span class="o"&gt;)&lt;/span&gt;
.
.&lt;span class="w"&gt; &lt;/span&gt;SYSDBA&lt;span class="w"&gt; &lt;/span&gt;Privilege
.&lt;span class="w"&gt;   &lt;/span&gt;pass&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;Connection&lt;span class="w"&gt; &lt;/span&gt;with&lt;span class="w"&gt; &lt;/span&gt;SYSDBA&lt;span class="w"&gt; &lt;/span&gt;privilege.
.&lt;span class="w"&gt; &lt;/span&gt;Database&lt;span class="w"&gt; &lt;/span&gt;rolling&lt;span class="w"&gt; &lt;/span&gt;upgrade
.&lt;span class="w"&gt;   &lt;/span&gt;pass&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;No&lt;span class="w"&gt; &lt;/span&gt;rolling&lt;span class="w"&gt; &lt;/span&gt;upgrade.
.&lt;span class="w"&gt; &lt;/span&gt;DB&lt;span class="w"&gt; &lt;/span&gt;components
.&lt;span class="w"&gt;   &lt;/span&gt;pass&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;Database&lt;span class="w"&gt; &lt;/span&gt;version:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;23&lt;/span&gt;.26.1.0.0
.&lt;span class="w"&gt;   &lt;/span&gt;pass&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="nv"&gt;version&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;24&lt;/span&gt;.2.0,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;status&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;INVALID
.&lt;span class="w"&gt;   &lt;/span&gt;pass&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;XDB:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;version&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;23&lt;/span&gt;.0.0.0.0
.&lt;span class="w"&gt; &lt;/span&gt;XDB
.&lt;span class="w"&gt;   &lt;/span&gt;pass&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;is&lt;span class="w"&gt; &lt;/span&gt;valid
.&lt;span class="w"&gt; &lt;/span&gt;DB&lt;span class="w"&gt; &lt;/span&gt;parameters
.&lt;span class="w"&gt;   &lt;/span&gt;pass&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;workarea_size_policy&lt;span class="w"&gt; &lt;/span&gt;is&lt;span class="w"&gt; &lt;/span&gt;AUTO
.&lt;span class="w"&gt; &lt;/span&gt;PL/SQL&lt;span class="w"&gt; &lt;/span&gt;Web&lt;span class="w"&gt; &lt;/span&gt;Toolkit
.&lt;span class="w"&gt;   &lt;/span&gt;pass&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;version&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;20&lt;/span&gt;.0.0.0.1
.&lt;span class="w"&gt; &lt;/span&gt;Tablespaces
.&lt;span class="w"&gt;   &lt;/span&gt;pass&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;found&lt;span class="w"&gt; &lt;/span&gt;APEX
.&lt;span class="w"&gt;   &lt;/span&gt;pass&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;found&lt;span class="w"&gt; &lt;/span&gt;APEX
.&lt;span class="w"&gt;   &lt;/span&gt;pass&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;found&lt;span class="w"&gt; &lt;/span&gt;TEMP
.&lt;span class="w"&gt; &lt;/span&gt;PHASES&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;,2,3&lt;span class="o"&gt;)&lt;/span&gt;...

PL/SQL&lt;span class="w"&gt; &lt;/span&gt;procedure&lt;span class="w"&gt; &lt;/span&gt;successfully&lt;span class="w"&gt; &lt;/span&gt;completed.

.
...&lt;span class="w"&gt; &lt;/span&gt;Prerequisite&lt;span class="w"&gt; &lt;/span&gt;checks&lt;span class="w"&gt; &lt;/span&gt;passed.
.
...gen_adm_pwd.sql
Phase&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;&lt;span class="o"&gt;(&lt;/span&gt;Installation&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;#&lt;/span&gt;
&lt;span class="c1"&gt;# Bootstrapping&lt;/span&gt;
&lt;span class="c1"&gt;#&lt;/span&gt;
...apxsqler_exit.sql
...setting&lt;span class="w"&gt; &lt;/span&gt;session&lt;span class="w"&gt; &lt;/span&gt;environment
...Configuring&lt;span class="w"&gt; &lt;/span&gt;SHARING&lt;span class="w"&gt; &lt;/span&gt;clause
...Creating&lt;span class="w"&gt; &lt;/span&gt;users
...create&lt;span class="w"&gt; &lt;/span&gt;user&lt;span class="w"&gt; &lt;/span&gt;APEX_260100
...core_grants.sql
...grant&lt;span class="w"&gt; &lt;/span&gt;APEX&lt;span class="w"&gt; &lt;/span&gt;owner&lt;span class="w"&gt; &lt;/span&gt;core&lt;span class="w"&gt; &lt;/span&gt;privileges
...done&lt;span class="w"&gt; &lt;/span&gt;grant&lt;span class="w"&gt; &lt;/span&gt;APEX&lt;span class="w"&gt; &lt;/span&gt;owner&lt;span class="w"&gt; &lt;/span&gt;core&lt;span class="w"&gt; &lt;/span&gt;privileges
...Creating&lt;span class="w"&gt; &lt;/span&gt;APEX_260100&lt;span class="w"&gt; &lt;/span&gt;Install&lt;span class="w"&gt; &lt;/span&gt;Objects
...wwv_flows_release
...wwv_flows_apexlang_version
...wwv_install_api.sql
No&lt;span class="w"&gt; &lt;/span&gt;errors.
...wwv_install_tabs.sql
...wwv_install_seq
...wwv_install$
...wwv_install_action$
...wwv_install_error$
...wwv_flow_install_errors
No&lt;span class="w"&gt; &lt;/span&gt;errors.
...wwv_install_api.plb
No&lt;span class="w"&gt; &lt;/span&gt;errors.
...wwv_install_error&lt;span class="nv"&gt;$_bi&lt;/span&gt;
No&lt;span class="w"&gt; &lt;/span&gt;errors.
&lt;span class="c1"&gt;#&lt;/span&gt;
&lt;span class="c1"&gt;# Proceeding with upgrade installation.&lt;/span&gt;
&lt;span class="c1"&gt;#&lt;/span&gt;
timing&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;Bootstrapping
Elapsed:&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.13
&lt;span class="c1"&gt;#&lt;/span&gt;
&lt;span class="c1"&gt;# Creating APEX_GRANTS_FOR_NEW_USERS_ROLE&lt;/span&gt;
&lt;span class="c1"&gt;#&lt;/span&gt;
APEX_ADMINISTRATOR_READ_ROLE&lt;span class="w"&gt; &lt;/span&gt;exists.
APEX_ADMINISTRATOR_ROLE&lt;span class="w"&gt; &lt;/span&gt;exists.
APEX_GRANTS_FOR_NEW_USERS_ROLE&lt;span class="w"&gt; &lt;/span&gt;exists.

timing&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;Creating&lt;span class="w"&gt; &lt;/span&gt;APEX_GRANTS_FOR_NEW_USERS_ROLE
Elapsed:&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.02
&lt;span class="c1"&gt;#&lt;/span&gt;
&lt;span class="c1"&gt;# Creating SYS Objects&lt;/span&gt;
&lt;span class="c1"&gt;#&lt;/span&gt;
No&lt;span class="w"&gt; &lt;/span&gt;errors.
...wwv_util_APEX_260100
No&lt;span class="w"&gt; &lt;/span&gt;errors.
...wwv_util_APEX_260100
No&lt;span class="w"&gt; &lt;/span&gt;errors.
...&lt;span class="w"&gt; &lt;/span&gt;Re-using&lt;span class="w"&gt; &lt;/span&gt;existing&lt;span class="w"&gt; &lt;/span&gt;key.
...sys.wwv_flow_val
No&lt;span class="w"&gt; &lt;/span&gt;errors.
...wwv_flow_val
No&lt;span class="w"&gt; &lt;/span&gt;errors.
...CONNECT&lt;span class="w"&gt; &lt;/span&gt;as&lt;span class="w"&gt; &lt;/span&gt;the&lt;span class="w"&gt; &lt;/span&gt;Oracle&lt;span class="w"&gt; &lt;/span&gt;user&lt;span class="w"&gt; &lt;/span&gt;who&lt;span class="w"&gt; &lt;/span&gt;will&lt;span class="w"&gt; &lt;/span&gt;own&lt;span class="w"&gt; &lt;/span&gt;the&lt;span class="w"&gt; &lt;/span&gt;Oracle&lt;span class="w"&gt; &lt;/span&gt;APEX&lt;span class="w"&gt; &lt;/span&gt;engine

timing&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;Creating&lt;span class="w"&gt; &lt;/span&gt;SYS&lt;span class="w"&gt; &lt;/span&gt;Objects
Elapsed:&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.00
&lt;span class="c1"&gt;#&lt;/span&gt;
&lt;span class="c1"&gt;# Creating APEX Tables&lt;/span&gt;
&lt;span class="c1"&gt;#&lt;/span&gt;
...flows_files_upgrade
...create&lt;span class="w"&gt; &lt;/span&gt;or&lt;span class="w"&gt; &lt;/span&gt;upgrade&lt;span class="w"&gt; &lt;/span&gt;wwv_flow_file_objects
...create&lt;span class="w"&gt; &lt;/span&gt;flow&lt;span class="w"&gt; &lt;/span&gt;objects
GENERIC&lt;span class="w"&gt; &lt;/span&gt;OBJECTS
WORKSPACE
SESSION&lt;span class="w"&gt; &lt;/span&gt;STATE&lt;span class="w"&gt; &lt;/span&gt;MANAGEMENT
PROPERTY&lt;span class="w"&gt; &lt;/span&gt;EDITOR
APPLICATION&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;SHARED&lt;span class="w"&gt; &lt;/span&gt;COMPONENTS&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;CREDENTIALS
APPLICATION&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;SHARED&lt;span class="w"&gt; &lt;/span&gt;COMPONENTS&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;REMOTE&lt;span class="w"&gt; &lt;/span&gt;SERVERS
APPLICATION
...wwv_flow_application_groups
...wwv_flows_reserved
...wwv_flow_pages_reserved
WORKSPACE&lt;span class="w"&gt; &lt;/span&gt;USERS&lt;span class="w"&gt; &lt;/span&gt;AND&lt;span class="w"&gt; &lt;/span&gt;GROUPS
...wwv_flow_fnd_user
...wwv_flow_developers
...wwv_flow_password_history
...wwv_flow_fnd_user_groups
...wwv_flow_fnd_group_users
...wwv_flow_fnd_group_groups
...wwv_flow_acl_group_users
...wwv_flow_preferences$
...wwv_flow_persistent_auth$
APPLICATION&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;SHARED&lt;span class="w"&gt; &lt;/span&gt;COMPONENTS&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;DATA&lt;span class="w"&gt; &lt;/span&gt;PROFILES
APPLICATION&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;SHARED&lt;span class="w"&gt; &lt;/span&gt;COMPONENTS&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;WEB&lt;span class="w"&gt; &lt;/span&gt;SOURCES
&amp;lt;snip&amp;gt;
&lt;span class="c1"&gt;#&lt;/span&gt;
&lt;span class="c1"&gt;# Installing 4155&lt;/span&gt;
&lt;span class="c1"&gt;#&lt;/span&gt;
PL/SQL&lt;span class="w"&gt; &lt;/span&gt;procedure&lt;span class="w"&gt; &lt;/span&gt;successfully&lt;span class="w"&gt; &lt;/span&gt;completed.

--application/set_environment
API&lt;span class="w"&gt; &lt;/span&gt;Last&lt;span class="w"&gt; &lt;/span&gt;Extended:20260330
Your&lt;span class="w"&gt; &lt;/span&gt;Current&lt;span class="w"&gt; &lt;/span&gt;Version:20260330
This&lt;span class="w"&gt; &lt;/span&gt;import&lt;span class="w"&gt; &lt;/span&gt;is&lt;span class="w"&gt; &lt;/span&gt;compatible&lt;span class="w"&gt; &lt;/span&gt;with&lt;span class="w"&gt; &lt;/span&gt;version:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;20260330&lt;/span&gt;
COMPATIBLE&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;You&lt;span class="w"&gt; &lt;/span&gt;should&lt;span class="w"&gt; &lt;/span&gt;be&lt;span class="w"&gt; &lt;/span&gt;able&lt;span class="w"&gt; &lt;/span&gt;to&lt;span class="w"&gt; &lt;/span&gt;run&lt;span class="w"&gt; &lt;/span&gt;this&lt;span class="w"&gt; &lt;/span&gt;import&lt;span class="w"&gt; &lt;/span&gt;without&lt;span class="w"&gt; &lt;/span&gt;issues.&lt;span class="o"&gt;)&lt;/span&gt;
ID&lt;span class="w"&gt; &lt;/span&gt;offset&lt;span class="w"&gt; &lt;/span&gt;during&lt;span class="w"&gt; &lt;/span&gt;import:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;
New&lt;span class="w"&gt; &lt;/span&gt;ID&lt;span class="w"&gt; &lt;/span&gt;offset&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;application:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;
APPLICATION&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;4155&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;Scheme&lt;span class="w"&gt; &lt;/span&gt;Authentication&lt;span class="w"&gt; &lt;/span&gt;Login
--application/delete_application
--application/create_application
--application/shared_components/plugins/authentication_type/com_oracle_authentication_4155
--application/plugin_settings
--application/shared_components/navigation/listentry
--application/shared_components/files/icons_app_icon_192_png
--application/shared_components/security/authorizations/sso_authentication
--application/shared_components/navigation/navigation_bar
--application/shared_components/logic/application_items/ai_service
--application/shared_components/logic/application_items/fsp_after_login_url
--application/shared_components/logic/application_computations/ai_service
--application/shared_components/logic/application_settings
--application/shared_components/navigation/tabs/standard
--application/shared_components/navigation/tabs/parent
--application/pages/page_groups
--application/shared_components/navigation/breadcrumbentry
--application/shared_components/user_interface/themes
--application/shared_components/user_interface/theme_style
--application/shared_components/security/authentications/authentication
--application/user_interfaces/combined_files
--application/pages/page_00001
--application/pages/page_00050
--application/pages/page_00099
--application/pages/page_00200
--application/pages/page_01000
--application/shared_components/logic/component_groups/builder_shared_components
--application/deployment/definition
--application/deployment/checks
--application/deployment/buildoptions
--application/end_environment
...&lt;span class="w"&gt; &lt;/span&gt;elapsed:&lt;span class="w"&gt; &lt;/span&gt;.95&lt;span class="w"&gt; &lt;/span&gt;sec
...done

timing&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;Installing&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;4155&lt;/span&gt;
Elapsed:&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.02
&lt;span class="c1"&gt;#&lt;/span&gt;
&lt;span class="c1"&gt;# Installing Central Themes&lt;/span&gt;
&lt;span class="c1"&gt;#&lt;/span&gt;
PL/SQL&lt;span class="w"&gt; &lt;/span&gt;procedure&lt;span class="w"&gt; &lt;/span&gt;successfully&lt;span class="w"&gt; &lt;/span&gt;completed.

Oracle&lt;span class="w"&gt; &lt;/span&gt;APEX&lt;span class="w"&gt; &lt;/span&gt;Central&lt;span class="w"&gt; &lt;/span&gt;Themes

...Installing&lt;span class="w"&gt; &lt;/span&gt;Universal&lt;span class="w"&gt; &lt;/span&gt;Theme

--application/set_environment
API&lt;span class="w"&gt; &lt;/span&gt;Last&lt;span class="w"&gt; &lt;/span&gt;Extended:20260330
Your&lt;span class="w"&gt; &lt;/span&gt;Current&lt;span class="w"&gt; &lt;/span&gt;Version:20260330
This&lt;span class="w"&gt; &lt;/span&gt;import&lt;span class="w"&gt; &lt;/span&gt;is&lt;span class="w"&gt; &lt;/span&gt;compatible&lt;span class="w"&gt; &lt;/span&gt;with&lt;span class="w"&gt; &lt;/span&gt;version:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;20260330&lt;/span&gt;
COMPATIBLE&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;You&lt;span class="w"&gt; &lt;/span&gt;should&lt;span class="w"&gt; &lt;/span&gt;be&lt;span class="w"&gt; &lt;/span&gt;able&lt;span class="w"&gt; &lt;/span&gt;to&lt;span class="w"&gt; &lt;/span&gt;run&lt;span class="w"&gt; &lt;/span&gt;this&lt;span class="w"&gt; &lt;/span&gt;import&lt;span class="w"&gt; &lt;/span&gt;without&lt;span class="w"&gt; &lt;/span&gt;issues.&lt;span class="o"&gt;)&lt;/span&gt;
ID&lt;span class="w"&gt; &lt;/span&gt;offset&lt;span class="w"&gt; &lt;/span&gt;during&lt;span class="w"&gt; &lt;/span&gt;import:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;
New&lt;span class="w"&gt; &lt;/span&gt;ID&lt;span class="w"&gt; &lt;/span&gt;offset&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;application:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;
APPLICATION&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;8842&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;Universal&lt;span class="w"&gt; &lt;/span&gt;Theme&lt;span class="w"&gt; &lt;/span&gt;Legacy
--application/delete_application
--application/create_application
--application/shared_components/plugins/template_component/theme_42_avatar
--application/shared_components/plugins/template_component/theme_42_badge
--application/shared_components/plugins/template_component/theme_42_button
--application/shared_components/plugins/template_component/theme_42_comments
--application/shared_components/plugins/template_component/theme_42_content_row
--application/shared_components/plugins/template_component/theme_42_media_list
--application/shared_components/plugins/template_component/theme_42_timeline
--application/plugin_settings#
&amp;lt;snip&amp;gt;
&lt;span class="c1"&gt;#&lt;/span&gt;
&lt;span class="c1"&gt;# Recompiling APEX_260100&lt;/span&gt;
&lt;span class="c1"&gt;#&lt;/span&gt;
...reset_state_and_show_invalid.sql

timing&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;Recompiling&lt;span class="w"&gt; &lt;/span&gt;APEX_260100
Elapsed:&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.43
&lt;span class="c1"&gt;#&lt;/span&gt;
&lt;span class="c1"&gt;# Installing APEX REST Config&lt;/span&gt;
&lt;span class="c1"&gt;#&lt;/span&gt;
...gen_adm_pwd.sql
...set_appun.sql
...setting&lt;span class="w"&gt; &lt;/span&gt;session&lt;span class="w"&gt; &lt;/span&gt;environment
...create&lt;span class="w"&gt; &lt;/span&gt;APEX_LISTENER&lt;span class="w"&gt; &lt;/span&gt;and&lt;span class="w"&gt; &lt;/span&gt;APEX_REST_PUBLIC_USER&lt;span class="w"&gt; &lt;/span&gt;users
...grants&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;APEX_LISTENER&lt;span class="w"&gt; &lt;/span&gt;and&lt;span class="w"&gt; &lt;/span&gt;ORDS_METADATA&lt;span class="w"&gt; &lt;/span&gt;user
INFO:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;12&lt;/span&gt;:29:28&lt;span class="w"&gt; &lt;/span&gt;Setup&lt;span class="w"&gt; &lt;/span&gt;the&lt;span class="w"&gt; &lt;/span&gt;APEX&lt;span class="w"&gt; &lt;/span&gt;REST&lt;span class="w"&gt; &lt;/span&gt;migration&lt;span class="w"&gt; &lt;/span&gt;privileges&lt;span class="w"&gt; &lt;/span&gt;using&lt;span class="w"&gt; &lt;/span&gt;APEX_260100&lt;span class="w"&gt; &lt;/span&gt;schema&lt;span class="w"&gt; &lt;/span&gt;version&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;26&lt;/span&gt;.1.0
INFO:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;12&lt;/span&gt;:29:28&lt;span class="w"&gt; &lt;/span&gt;grant&lt;span class="w"&gt; &lt;/span&gt;execute&lt;span class="w"&gt; &lt;/span&gt;on&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;ORDS_METADATA&amp;quot;&lt;/span&gt;.&lt;span class="s2"&gt;&amp;quot;ORDS_MIGRATE&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;to&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;APEX_260100&amp;quot;&lt;/span&gt;
INFO:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;12&lt;/span&gt;:29:28&lt;span class="w"&gt; &lt;/span&gt;Configuring&lt;span class="w"&gt; &lt;/span&gt;APEX&lt;span class="w"&gt; &lt;/span&gt;and&lt;span class="w"&gt; &lt;/span&gt;ORDS&lt;span class="w"&gt; &lt;/span&gt;schemas&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;url&lt;span class="w"&gt; &lt;/span&gt;mapping
INFO:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;12&lt;/span&gt;:29:28&lt;span class="w"&gt; &lt;/span&gt;Made&lt;span class="w"&gt; &lt;/span&gt;APEX_PUBLIC_USER&lt;span class="w"&gt; &lt;/span&gt;proxiable&lt;span class="w"&gt; &lt;/span&gt;from&lt;span class="w"&gt; &lt;/span&gt;ORDS_PUBLIC_USER
INFO:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;12&lt;/span&gt;:29:28&lt;span class="w"&gt; &lt;/span&gt;Made&lt;span class="w"&gt; &lt;/span&gt;APEX_REST_PUBLIC_USER&lt;span class="w"&gt; &lt;/span&gt;proxiable&lt;span class="w"&gt; &lt;/span&gt;from&lt;span class="w"&gt; &lt;/span&gt;ORDS_PUBLIC_USER
INFO:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;12&lt;/span&gt;:29:28&lt;span class="w"&gt; &lt;/span&gt;APEX_POOL_CONFIG&lt;span class="w"&gt; &lt;/span&gt;Synonym&lt;span class="w"&gt; &lt;/span&gt;exists
INFO:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;12&lt;/span&gt;:29:28&lt;span class="w"&gt; &lt;/span&gt;grant&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;select&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;on&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;APEX_260100&amp;quot;&lt;/span&gt;.&lt;span class="s2"&gt;&amp;quot;WWV_FLOW_POOL_CONFIG&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;to&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;ORDS_RUNTIME_ROLE&amp;quot;&lt;/span&gt;
INFO:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;12&lt;/span&gt;:29:28&lt;span class="w"&gt; &lt;/span&gt;Created&lt;span class="w"&gt; &lt;/span&gt;ORDS_METADATA.APEX_WWV_FLOW_POOL_CONFIG&lt;span class="w"&gt; &lt;/span&gt;as&lt;span class="w"&gt; &lt;/span&gt;view&lt;span class="w"&gt; &lt;/span&gt;over&lt;span class="w"&gt; &lt;/span&gt;APEX_260100.WWV_FLOW_POOL_CONFIG
INFO:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;12&lt;/span&gt;:29:28&lt;span class="w"&gt; &lt;/span&gt;grant&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;select&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;on&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;ORDS_METADATA&amp;quot;&lt;/span&gt;.&lt;span class="s2"&gt;&amp;quot;APEX_WWV_FLOW_POOL_CONFIG&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;to&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;ORDS_RUNTIME_ROLE&amp;quot;&lt;/span&gt;
INFO:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;12&lt;/span&gt;:29:28&lt;span class="w"&gt; &lt;/span&gt;Created&lt;span class="w"&gt; &lt;/span&gt;ORDS_METADATA.UNIFIED_POOL_CONFIG&lt;span class="w"&gt; &lt;/span&gt;view.
INFO:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;12&lt;/span&gt;:29:28&lt;span class="w"&gt; &lt;/span&gt;grant&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;select&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;on&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;ORDS_METADATA&amp;quot;&lt;/span&gt;.&lt;span class="s2"&gt;&amp;quot;UNIFIED_POOL_CONFIG&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;to&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;ORDS_RUNTIME_ROLE&amp;quot;&lt;/span&gt;
Found&lt;span class="w"&gt; &lt;/span&gt;APEX&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;26&lt;/span&gt;.1.0.&lt;span class="w"&gt; &lt;/span&gt;Migrating&lt;span class="w"&gt; &lt;/span&gt;APEX&lt;span class="w"&gt; &lt;/span&gt;entry&lt;span class="w"&gt; &lt;/span&gt;points&lt;span class="w"&gt; &lt;/span&gt;to&lt;span class="w"&gt; &lt;/span&gt;ORDS&lt;span class="w"&gt; &lt;/span&gt;PL/SQL&lt;span class="w"&gt; &lt;/span&gt;Procedure&lt;span class="w"&gt; &lt;/span&gt;Gateway&lt;span class="w"&gt; &lt;/span&gt;Allow&lt;span class="w"&gt; &lt;/span&gt;List
Invoking&lt;span class="w"&gt; &lt;/span&gt;APEX&lt;span class="w"&gt; &lt;/span&gt;API...
Found&lt;span class="w"&gt; &lt;/span&gt;APEX&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;26&lt;/span&gt;.1.0.&lt;span class="w"&gt; &lt;/span&gt;Granting&lt;span class="w"&gt; &lt;/span&gt;execute&lt;span class="w"&gt; &lt;/span&gt;on&lt;span class="w"&gt; &lt;/span&gt;ORDS_APEX_SSO&lt;span class="w"&gt; &lt;/span&gt;package&lt;span class="w"&gt; &lt;/span&gt;to&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;APEX_260100&amp;quot;&lt;/span&gt;
INFO:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;12&lt;/span&gt;:29:28&lt;span class="w"&gt; &lt;/span&gt;APEX&lt;span class="w"&gt; &lt;/span&gt;schema:&lt;span class="w"&gt; &lt;/span&gt;APEX_260100
Updated&lt;span class="w"&gt; &lt;/span&gt;ORDS&lt;span class="w"&gt; &lt;/span&gt;views&lt;span class="w"&gt; &lt;/span&gt;and&lt;span class="w"&gt; &lt;/span&gt;synonyms&lt;span class="w"&gt; &lt;/span&gt;successfully.
INFO:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;12&lt;/span&gt;:29:28&lt;span class="w"&gt; &lt;/span&gt;Setup&lt;span class="w"&gt; &lt;/span&gt;the&lt;span class="w"&gt; &lt;/span&gt;APEX&lt;span class="w"&gt; &lt;/span&gt;REST&lt;span class="w"&gt; &lt;/span&gt;migration&lt;span class="w"&gt; &lt;/span&gt;privileges&lt;span class="w"&gt; &lt;/span&gt;using&lt;span class="w"&gt; &lt;/span&gt;APEX_260100&lt;span class="w"&gt; &lt;/span&gt;schema&lt;span class="w"&gt; &lt;/span&gt;version&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;26&lt;/span&gt;.1.0
INFO:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;12&lt;/span&gt;:29:28&lt;span class="w"&gt; &lt;/span&gt;grant&lt;span class="w"&gt; &lt;/span&gt;execute&lt;span class="w"&gt; &lt;/span&gt;on&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;ORDS_METADATA&amp;quot;&lt;/span&gt;.&lt;span class="s2"&gt;&amp;quot;ORDS_MIGRATE&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;to&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;APEX_260100&amp;quot;&lt;/span&gt;
INFO:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;12&lt;/span&gt;:29:28&lt;span class="w"&gt; &lt;/span&gt;Configuring&lt;span class="w"&gt; &lt;/span&gt;APEX&lt;span class="w"&gt; &lt;/span&gt;and&lt;span class="w"&gt; &lt;/span&gt;ORDS&lt;span class="w"&gt; &lt;/span&gt;schemas&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;url&lt;span class="w"&gt; &lt;/span&gt;mapping
INFO:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;12&lt;/span&gt;:29:28&lt;span class="w"&gt; &lt;/span&gt;Made&lt;span class="w"&gt; &lt;/span&gt;APEX_PUBLIC_USER&lt;span class="w"&gt; &lt;/span&gt;proxiable&lt;span class="w"&gt; &lt;/span&gt;from&lt;span class="w"&gt; &lt;/span&gt;ORDS_PUBLIC_USER
INFO:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;12&lt;/span&gt;:29:28&lt;span class="w"&gt; &lt;/span&gt;Made&lt;span class="w"&gt; &lt;/span&gt;APEX_REST_PUBLIC_USER&lt;span class="w"&gt; &lt;/span&gt;proxiable&lt;span class="w"&gt; &lt;/span&gt;from&lt;span class="w"&gt; &lt;/span&gt;ORDS_PUBLIC_USER
INFO:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;12&lt;/span&gt;:29:28&lt;span class="w"&gt; &lt;/span&gt;APEX_POOL_CONFIG&lt;span class="w"&gt; &lt;/span&gt;Synonym&lt;span class="w"&gt; &lt;/span&gt;exists
INFO:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;12&lt;/span&gt;:29:28&lt;span class="w"&gt; &lt;/span&gt;grant&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;select&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;on&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;APEX_260100&amp;quot;&lt;/span&gt;.&lt;span class="s2"&gt;&amp;quot;WWV_FLOW_POOL_CONFIG&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;to&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;ORDS_RUNTIME_ROLE&amp;quot;&lt;/span&gt;
INFO:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;12&lt;/span&gt;:29:28&lt;span class="w"&gt; &lt;/span&gt;Created&lt;span class="w"&gt; &lt;/span&gt;ORDS_METADATA.APEX_WWV_FLOW_POOL_CONFIG&lt;span class="w"&gt; &lt;/span&gt;as&lt;span class="w"&gt; &lt;/span&gt;view&lt;span class="w"&gt; &lt;/span&gt;over&lt;span class="w"&gt; &lt;/span&gt;APEX_260100.WWV_FLOW_POOL_CONFIG
INFO:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;12&lt;/span&gt;:29:28&lt;span class="w"&gt; &lt;/span&gt;grant&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;select&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;on&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;ORDS_METADATA&amp;quot;&lt;/span&gt;.&lt;span class="s2"&gt;&amp;quot;APEX_WWV_FLOW_POOL_CONFIG&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;to&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;ORDS_RUNTIME_ROLE&amp;quot;&lt;/span&gt;
INFO:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;12&lt;/span&gt;:29:28&lt;span class="w"&gt; &lt;/span&gt;Created&lt;span class="w"&gt; &lt;/span&gt;ORDS_METADATA.UNIFIED_POOL_CONFIG&lt;span class="w"&gt; &lt;/span&gt;view.
INFO:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;12&lt;/span&gt;:29:28&lt;span class="w"&gt; &lt;/span&gt;grant&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;select&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;on&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;ORDS_METADATA&amp;quot;&lt;/span&gt;.&lt;span class="s2"&gt;&amp;quot;UNIFIED_POOL_CONFIG&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;to&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;ORDS_RUNTIME_ROLE&amp;quot;&lt;/span&gt;
Found&lt;span class="w"&gt; &lt;/span&gt;APEX&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;26&lt;/span&gt;.1.0.&lt;span class="w"&gt; &lt;/span&gt;Migrating&lt;span class="w"&gt; &lt;/span&gt;APEX&lt;span class="w"&gt; &lt;/span&gt;entry&lt;span class="w"&gt; &lt;/span&gt;points&lt;span class="w"&gt; &lt;/span&gt;to&lt;span class="w"&gt; &lt;/span&gt;ORDS&lt;span class="w"&gt; &lt;/span&gt;PL/SQL&lt;span class="w"&gt; &lt;/span&gt;Procedure&lt;span class="w"&gt; &lt;/span&gt;Gateway&lt;span class="w"&gt; &lt;/span&gt;Allow&lt;span class="w"&gt; &lt;/span&gt;List
Invoking&lt;span class="w"&gt; &lt;/span&gt;APEX&lt;span class="w"&gt; &lt;/span&gt;API...
Found&lt;span class="w"&gt; &lt;/span&gt;APEX&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;26&lt;/span&gt;.1.0.&lt;span class="w"&gt; &lt;/span&gt;Granting&lt;span class="w"&gt; &lt;/span&gt;execute&lt;span class="w"&gt; &lt;/span&gt;on&lt;span class="w"&gt; &lt;/span&gt;ORDS_APEX_SSO&lt;span class="w"&gt; &lt;/span&gt;package&lt;span class="w"&gt; &lt;/span&gt;to&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;APEX_260100&amp;quot;&lt;/span&gt;
INFO:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;12&lt;/span&gt;:29:29&lt;span class="w"&gt; &lt;/span&gt;APEX&lt;span class="w"&gt; &lt;/span&gt;schema:&lt;span class="w"&gt; &lt;/span&gt;APEX_260100
Updated&lt;span class="w"&gt; &lt;/span&gt;ORDS&lt;span class="w"&gt; &lt;/span&gt;views&lt;span class="w"&gt; &lt;/span&gt;and&lt;span class="w"&gt; &lt;/span&gt;synonyms&lt;span class="w"&gt; &lt;/span&gt;successfully.

timing&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;Installing&lt;span class="w"&gt; &lt;/span&gt;APEX&lt;span class="w"&gt; &lt;/span&gt;REST&lt;span class="w"&gt; &lt;/span&gt;Config
Elapsed:&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.03
&lt;span class="c1"&gt;#&lt;/span&gt;
&lt;span class="c1"&gt;# Set Loaded/Upgraded in Registry&lt;/span&gt;
&lt;span class="c1"&gt;#&lt;/span&gt;
timing&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;Set&lt;span class="w"&gt; &lt;/span&gt;Loaded/Upgraded&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;Registry
Elapsed:&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.00
&lt;span class="c1"&gt;#&lt;/span&gt;
&lt;span class="c1"&gt;# Removing Unused SYS Objects and Public Privs&lt;/span&gt;
&lt;span class="c1"&gt;#&lt;/span&gt;
...drop&lt;span class="w"&gt; &lt;/span&gt;view&lt;span class="w"&gt; &lt;/span&gt;sys.flow_sessions
...drop&lt;span class="w"&gt; &lt;/span&gt;view&lt;span class="w"&gt; &lt;/span&gt;sys.flow_parameters
...drop&lt;span class="w"&gt; &lt;/span&gt;view&lt;span class="w"&gt; &lt;/span&gt;sys.flow_sqlarea
...drop&lt;span class="w"&gt; &lt;/span&gt;view&lt;span class="w"&gt; &lt;/span&gt;sys.flow_sga
...drop&lt;span class="w"&gt; &lt;/span&gt;view&lt;span class="w"&gt; &lt;/span&gt;sys.wwv_flow_gv&lt;span class="nv"&gt;$session&lt;/span&gt;

timing&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;Removing&lt;span class="w"&gt; &lt;/span&gt;Unused&lt;span class="w"&gt; &lt;/span&gt;SYS&lt;span class="w"&gt; &lt;/span&gt;Objects&lt;span class="w"&gt; &lt;/span&gt;and&lt;span class="w"&gt; &lt;/span&gt;Public&lt;span class="w"&gt; &lt;/span&gt;Privs
Elapsed:&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.00
&lt;span class="c1"&gt;#&lt;/span&gt;
&lt;span class="c1"&gt;# Validating Installation&lt;/span&gt;
&lt;span class="c1"&gt;#&lt;/span&gt;
...&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;12&lt;/span&gt;:29:29&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Starting&lt;span class="w"&gt; &lt;/span&gt;validate_apex&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;APEX_260100
...&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;12&lt;/span&gt;:29:29&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;missing&lt;span class="w"&gt; &lt;/span&gt;privileges&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;APEX_260100
...&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;12&lt;/span&gt;:29:31&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;missing&lt;span class="w"&gt; &lt;/span&gt;privileges&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;APEX_GRANTS_FOR_NEW_USERS_ROLE
...&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;12&lt;/span&gt;:29:31&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Re-generating&lt;span class="w"&gt; &lt;/span&gt;APEX_260100.wwv_flow_db_version
...&lt;span class="w"&gt; &lt;/span&gt;wwv_flow_db_version&lt;span class="w"&gt; &lt;/span&gt;is&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="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;12&lt;/span&gt;:29:31&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;sys.wwv_flow_cu_constraints
...&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;12&lt;/span&gt;:29:31&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;the&lt;span class="w"&gt; &lt;/span&gt;existence&lt;span class="w"&gt; &lt;/span&gt;of&lt;span class="w"&gt; &lt;/span&gt;APEX&lt;span class="w"&gt; &lt;/span&gt;public&lt;span class="w"&gt; &lt;/span&gt;synonyms
...&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;12&lt;/span&gt;:29:31&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;invalid&lt;span class="w"&gt; &lt;/span&gt;public&lt;span class="w"&gt; &lt;/span&gt;synonyms
...&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;12&lt;/span&gt;:29:31&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Key&lt;span class="w"&gt; &lt;/span&gt;object&lt;span class="w"&gt; &lt;/span&gt;existence&lt;span class="w"&gt; &lt;/span&gt;check
...&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;12&lt;/span&gt;:29:34&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Post-ORDS&lt;span class="w"&gt; &lt;/span&gt;updates
...&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;12&lt;/span&gt;:29:34&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;calling&lt;span class="w"&gt; &lt;/span&gt;wwv_util_apex_260100.post_ords_upgrade
...enabled_schema
...define_module
...define_template
...define_handler
...set_module_origins_allowed
...&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;12&lt;/span&gt;:29:35&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Setting&lt;span class="w"&gt; &lt;/span&gt;DBMS&lt;span class="w"&gt; &lt;/span&gt;Registry&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;APEX&lt;span class="w"&gt; &lt;/span&gt;to&lt;span class="w"&gt; &lt;/span&gt;valid
...&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;12&lt;/span&gt;:29:35&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Exiting&lt;span class="w"&gt; &lt;/span&gt;validate_apex
JOB_QUEUE_PROCESSES:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;40&lt;/span&gt;

timing&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;Validating&lt;span class="w"&gt; &lt;/span&gt;Installation
Elapsed:&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.10
&lt;span class="c1"&gt;#&lt;/span&gt;
&lt;span class="c1"&gt;# Actions in Phase 3:&lt;/span&gt;
&lt;span class="c1"&gt;#&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;ok&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;-&lt;span class="w"&gt; &lt;/span&gt;BEGIN&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;.00
&lt;span class="w"&gt;    &lt;/span&gt;ok&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="w"&gt; &lt;/span&gt;Updating&lt;span class="w"&gt; &lt;/span&gt;DBA_REGISTRY&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;.00
&lt;span class="w"&gt;    &lt;/span&gt;ok&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="w"&gt; &lt;/span&gt;Computing&lt;span class="w"&gt; &lt;/span&gt;Pub&lt;span class="w"&gt; &lt;/span&gt;Syn&lt;span class="w"&gt; &lt;/span&gt;Dependents&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;.02
&lt;span class="w"&gt;    &lt;/span&gt;ok&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;4&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;Invalidating&lt;span class="w"&gt; &lt;/span&gt;Pub&lt;span class="w"&gt; &lt;/span&gt;Syn&lt;span class="w"&gt; &lt;/span&gt;Dependents&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;.02
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;# 4 objects&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;ok&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;Upgrade&lt;span class="w"&gt; &lt;/span&gt;Hot&lt;span class="w"&gt; &lt;/span&gt;Metadata&lt;span class="w"&gt; &lt;/span&gt;and&lt;span class="w"&gt; &lt;/span&gt;Switch&lt;span class="w"&gt; &lt;/span&gt;Schemas&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;.00
&lt;span class="w"&gt;    &lt;/span&gt;ok&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;6&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;Removing&lt;span class="w"&gt; &lt;/span&gt;Jobs&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;.00
&lt;span class="w"&gt;    &lt;/span&gt;ok&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;7&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;Init&lt;span class="w"&gt; &lt;/span&gt;Phase&lt;span class="w"&gt; &lt;/span&gt;HOT&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;.02
&lt;span class="w"&gt;    &lt;/span&gt;ok&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;8&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;Determining&lt;span class="w"&gt; &lt;/span&gt;whether&lt;span class="w"&gt; &lt;/span&gt;APEX&lt;span class="w"&gt; &lt;/span&gt;is&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;use&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;.00
&lt;span class="w"&gt;    &lt;/span&gt;ok&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;9&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;Setting&lt;span class="w"&gt; &lt;/span&gt;Patch&lt;span class="w"&gt; &lt;/span&gt;Status:&lt;span class="w"&gt; &lt;/span&gt;APPLYING&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;.02
&lt;span class="w"&gt;    &lt;/span&gt;ok&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;10&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;Removing&lt;span class="w"&gt; &lt;/span&gt;FLOWS_FILES&lt;span class="w"&gt; &lt;/span&gt;grants&lt;span class="w"&gt; &lt;/span&gt;and&lt;span class="w"&gt; &lt;/span&gt;synonyms&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;.03
&lt;span class="w"&gt;    &lt;/span&gt;ok&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;11&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;Purging&lt;span class="w"&gt; &lt;/span&gt;Expired&lt;span class="w"&gt; &lt;/span&gt;Sessions&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;.00
&lt;span class="w"&gt;    &lt;/span&gt;ok&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;12&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;Purging&lt;span class="w"&gt; &lt;/span&gt;Builder&lt;span class="w"&gt; &lt;/span&gt;Sessions&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;.00
&lt;span class="w"&gt;    &lt;/span&gt;ok&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;13&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;Dropping&lt;span class="w"&gt; &lt;/span&gt;Upgrade&lt;span class="w"&gt; &lt;/span&gt;Triggers&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;APEX_240200&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;.03
&lt;span class="w"&gt;    &lt;/span&gt;ok&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;14&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;Creating&lt;span class="w"&gt; &lt;/span&gt;Upgrade&lt;span class="w"&gt; &lt;/span&gt;Triggers&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;.00
&lt;span class="w"&gt;    &lt;/span&gt;ok&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;15&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;Increment&lt;span class="w"&gt; &lt;/span&gt;Sequences&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;.00
&lt;span class="w"&gt;    &lt;/span&gt;ok&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;-&lt;span class="w"&gt; &lt;/span&gt;Disabling&lt;span class="w"&gt; &lt;/span&gt;Constraints&lt;span class="w"&gt; &lt;/span&gt;and&lt;span class="w"&gt; &lt;/span&gt;Triggers&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;.02
&lt;span class="w"&gt;    &lt;/span&gt;ok&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;17&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;Copying&lt;span class="w"&gt; &lt;/span&gt;WWV_FLOW_WORKSHEET_RPTS&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;/37&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;.00
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;# UPGRADE_PARALLEL_DEGREE: 1&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;ok&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;18&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;create&lt;span class="w"&gt; &lt;/span&gt;mapping&lt;span class="w"&gt; &lt;/span&gt;table&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;WWV_FLOW_WORKSHEET_RPTS&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;.00
&lt;span class="w"&gt;    &lt;/span&gt;ok&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;19&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;Run&lt;span class="w"&gt; &lt;/span&gt;copy&lt;span class="w"&gt; &lt;/span&gt;statement&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;WWV_FLOW_WORKSHEET_RPTS&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;.00
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;# copied 201 rows into WWV_FLOW_WORKSHEET_RPTS&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;ok&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;20&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;Rebuilding&lt;span class="w"&gt; &lt;/span&gt;WWV_FLOW_WS_RPTS_IDX4,WWV_FLOW_WS_BASE_RPT_IDX,WW&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;.00
&lt;span class="w"&gt;    &lt;/span&gt;ok&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;21&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;Copying&lt;span class="w"&gt; &lt;/span&gt;WWV_FLOW_WORKSHEET_CONDITIONS&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;/37&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;.00
&lt;span class="w"&gt;    &lt;/span&gt;ok&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;22&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;create&lt;span class="w"&gt; &lt;/span&gt;mapping&lt;span class="w"&gt; &lt;/span&gt;table&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;WWV_FLOW_WORKSHEET_CONDITIONS&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;.00
&lt;span class="w"&gt;    &lt;/span&gt;ok&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;23&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;Run&lt;span class="w"&gt; &lt;/span&gt;copy&lt;span class="w"&gt; &lt;/span&gt;statement&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;WWV_FLOW_WORKSHEET_CONDITIONS&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;.00
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;# copied 4 rows into WWV_FLOW_WORKSHEET_CONDITIONS&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;ok&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;24&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;Rebuilding&lt;span class="w"&gt; &lt;/span&gt;WWV_FLOW_WS_CONDITIONS_IDX&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;.00
&lt;span class="w"&gt;    &lt;/span&gt;ok&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;25&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;Copying&lt;span class="w"&gt; &lt;/span&gt;WWV_FLOW_WORKSHEET_COMPUTATION&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;/37&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;.00
&lt;span class="w"&gt;    &lt;/span&gt;ok&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;26&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;Run&lt;span class="w"&gt; &lt;/span&gt;copy&lt;span class="w"&gt; &lt;/span&gt;statement&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;WWV_FLOW_WORKSHEET_COMPUTATION&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;.02
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;# copied 2 rows into WWV_FLOW_WORKSHEET_COMPUTATION&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;ok&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;27&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;Rebuilding&lt;span class="w"&gt; &lt;/span&gt;WWV_FLOW_WS_COMP_COLS_IDX,WWV_FLOW_WS_COMP_COLS_I&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;.00
&lt;span class="w"&gt;    &lt;/span&gt;ok&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;28&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;Copying&lt;span class="w"&gt; &lt;/span&gt;WWV_FLOW_WORKSHEET_NOTIFY&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;4&lt;/span&gt;/37&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;.00
&lt;span class="w"&gt;    &lt;/span&gt;ok&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;29&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;Run&lt;span class="w"&gt; &lt;/span&gt;copy&lt;span class="w"&gt; &lt;/span&gt;statement&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;WWV_FLOW_WORKSHEET_NOTIFY&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;.00
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;# copied 0 rows into WWV_FLOW_WORKSHEET_NOTIFY&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;ok&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;30&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;Rebuilding&lt;span class="w"&gt; &lt;/span&gt;WWV_FLOW_WORKSHEET_NTFY_IDX3,WWV_FLOW_WORKSHEET_N&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;.00
&lt;span class="w"&gt;    &lt;/span&gt;ok&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;31&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;Copying&lt;span class="w"&gt; &lt;/span&gt;WWV_FLOW_WORKSHEET_GROUP_BY&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt;/37&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;.00
&lt;span class="w"&gt;    &lt;/span&gt;ok&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;32&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;Run&lt;span class="w"&gt; &lt;/span&gt;copy&lt;span class="w"&gt; &lt;/span&gt;statement&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;WWV_FLOW_WORKSHEET_GROUP_BY&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;.00
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;# copied 1 rows into WWV_FLOW_WORKSHEET_GROUP_BY&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;ok&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;33&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;Rebuilding&lt;span class="w"&gt; &lt;/span&gt;WWV_FLOW_WS_GROUPBY_IDX4,WWV_FLOW_WS_GROUPBY_IDX,&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;.00
&lt;span class="w"&gt;    &lt;/span&gt;ok&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;34&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;Copying&lt;span class="w"&gt; &lt;/span&gt;WWV_FLOW_WORKSHEET_PIVOT&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;6&lt;/span&gt;/37&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;.00
&lt;span class="w"&gt;    &lt;/span&gt;ok&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;35&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;Run&lt;span class="w"&gt; &lt;/span&gt;copy&lt;span class="w"&gt; &lt;/span&gt;statement&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;WWV_FLOW_WORKSHEET_PIVOT&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;.00
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;# copied 0 rows into WWV_FLOW_WORKSHEET_PIVOT&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;ok&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;36&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;Rebuilding&lt;span class="w"&gt; &lt;/span&gt;WWV_FLOW_WS_PIVOT_IDX2,WWV_FLOW_WS_PIVOT_IDX4&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;.00
&lt;span class="w"&gt;    &lt;/span&gt;ok&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;37&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;Copying&lt;span class="w"&gt; &lt;/span&gt;WWV_FLOW_WORKSHEET_PIVOT_AGG&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;7&lt;/span&gt;/37&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;.00
&lt;span class="w"&gt;    &lt;/span&gt;ok&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;38&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;create&lt;span class="w"&gt; &lt;/span&gt;mapping&lt;span class="w"&gt; &lt;/span&gt;table&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;WWV_FLOW_WORKSHEET_PIVOT_AGG&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;.00
&lt;span class="w"&gt;    &lt;/span&gt;ok&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;39&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;Run&lt;span class="w"&gt; &lt;/span&gt;copy&lt;span class="w"&gt; &lt;/span&gt;statement&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;WWV_FLOW_WORKSHEET_PIVOT_AGG&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;.00
&amp;lt;snip&amp;gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;# copied 0 rows into WWV_FLOW_WORKFLOW_VARIABLES$&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;ok&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;121&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;Rebuilding&lt;span class="w"&gt; &lt;/span&gt;WWV_WORKFLOW_VAR&lt;span class="nv"&gt;$_FLOWID_FX&lt;/span&gt;,WWV_WORKFLOW_VAR&lt;span class="nv"&gt;$_VA&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;.00
&lt;span class="w"&gt;    &lt;/span&gt;ok&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;122&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;Copying&lt;span class="w"&gt; &lt;/span&gt;WWV_FLOW_WORKFLOW_PARTICIPANT$&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;36&lt;/span&gt;/37&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;.00
&lt;span class="w"&gt;    &lt;/span&gt;ok&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;123&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;Run&lt;span class="w"&gt; &lt;/span&gt;copy&lt;span class="w"&gt; &lt;/span&gt;statement&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;WWV_FLOW_WORKFLOW_PARTICIPANT$&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;.00
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;# copied 0 rows into WWV_FLOW_WORKFLOW_PARTICIPANT$&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;ok&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;124&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;Rebuilding&lt;span class="w"&gt; &lt;/span&gt;WWV_WORKFLOW_PART&lt;span class="nv"&gt;$_SGID_FX&lt;/span&gt;,WWV_WORKFLOW_PART&lt;span class="nv"&gt;$_WF&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;.00
&lt;span class="w"&gt;    &lt;/span&gt;ok&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;125&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;Copying&lt;span class="w"&gt; &lt;/span&gt;WWV_FLOW_WORKFLOW_AUDIT_LOG$&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;37&lt;/span&gt;/37&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;.00
&lt;span class="w"&gt;    &lt;/span&gt;ok&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;126&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;Run&lt;span class="w"&gt; &lt;/span&gt;copy&lt;span class="w"&gt; &lt;/span&gt;statement&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;WWV_FLOW_WORKFLOW_AUDIT_LOG$&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;.00
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;# copied 0 rows into WWV_FLOW_WORKFLOW_AUDIT_LOG$&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;ok&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;127&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;Rebuilding&lt;span class="w"&gt; &lt;/span&gt;WWV_WORKFLOW_AUDIT&lt;span class="nv"&gt;$_TENID_FX&lt;/span&gt;,WWV_WORKFLOW_AUDIT$&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;.00
&lt;span class="w"&gt;    &lt;/span&gt;ok&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;128&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;Upgrading&lt;span class="w"&gt; &lt;/span&gt;Hot&lt;span class="w"&gt; &lt;/span&gt;Metadata&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;.00
&lt;span class="w"&gt;    &lt;/span&gt;ok&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;129&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;Enabling&lt;span class="w"&gt; &lt;/span&gt;Constraints&lt;span class="w"&gt; &lt;/span&gt;and&lt;span class="w"&gt; &lt;/span&gt;Triggers&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;.05
&lt;span class="w"&gt;    &lt;/span&gt;ok&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;130&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;Purging&lt;span class="w"&gt; &lt;/span&gt;Expired&lt;span class="w"&gt; &lt;/span&gt;Sessions&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;.00
&lt;span class="w"&gt;    &lt;/span&gt;ok&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;131&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;Purging&lt;span class="w"&gt; &lt;/span&gt;Builder&lt;span class="w"&gt; &lt;/span&gt;Sessions&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;.00
&lt;span class="w"&gt;    &lt;/span&gt;ok&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;-&lt;span class="w"&gt; &lt;/span&gt;Creating&lt;span class="w"&gt; &lt;/span&gt;Public&lt;span class="w"&gt; &lt;/span&gt;Synonyms&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;.05
&lt;span class="w"&gt;    &lt;/span&gt;ok&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;133&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;Granting&lt;span class="w"&gt; &lt;/span&gt;Public&lt;span class="w"&gt; &lt;/span&gt;Synonyms&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;.12
&lt;span class="w"&gt;    &lt;/span&gt;ok&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;-&lt;span class="w"&gt; &lt;/span&gt;Granting&lt;span class="w"&gt; &lt;/span&gt;to&lt;span class="w"&gt; &lt;/span&gt;FLOWS_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;.00
&lt;span class="w"&gt;    &lt;/span&gt;ok&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;135&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;Creating&lt;span class="w"&gt; &lt;/span&gt;FLOWS_FILES&lt;span class="w"&gt; &lt;/span&gt;grants&lt;span class="w"&gt; &lt;/span&gt;and&lt;span class="w"&gt; &lt;/span&gt;synonyms&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;.00
&lt;span class="w"&gt;    &lt;/span&gt;ok&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;136&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;Syncing&lt;span class="w"&gt; &lt;/span&gt;ORDS&lt;span class="w"&gt; &lt;/span&gt;Gateway&lt;span class="w"&gt; &lt;/span&gt;Allow&lt;span class="w"&gt; &lt;/span&gt;List&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;.00
&lt;span class="w"&gt;    &lt;/span&gt;ok&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;137&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;Meta-Cleanup&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;.00
&lt;span class="w"&gt;    &lt;/span&gt;ok&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;138&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;Upgrading&lt;span class="w"&gt; &lt;/span&gt;Team&lt;span class="w"&gt; &lt;/span&gt;Development&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;.00
&lt;span class="w"&gt;    &lt;/span&gt;ok&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;139&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;Installing&lt;span class="w"&gt; &lt;/span&gt;FLOWS_FILES&lt;span class="w"&gt; &lt;/span&gt;Objects&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;.02
&lt;span class="w"&gt;    &lt;/span&gt;ok&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;140&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;Installing&lt;span class="w"&gt; &lt;/span&gt;APEX&lt;span class="nv"&gt;$SESSION&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Context&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;.00
&lt;span class="w"&gt;    &lt;/span&gt;ok&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;141&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;Recompiling&lt;span class="w"&gt; &lt;/span&gt;APEX_260100&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;.43
&lt;span class="w"&gt;    &lt;/span&gt;ok&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;142&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;Installing&lt;span class="w"&gt; &lt;/span&gt;APEX&lt;span class="w"&gt; &lt;/span&gt;REST&lt;span class="w"&gt; &lt;/span&gt;Config&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;.03
&lt;span class="w"&gt;    &lt;/span&gt;ok&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;143&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;Set&lt;span class="w"&gt; &lt;/span&gt;Loaded/Upgraded&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;Registry&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;.00
&lt;span class="w"&gt;    &lt;/span&gt;ok&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;144&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;Setting&lt;span class="w"&gt; &lt;/span&gt;Patch&lt;span class="w"&gt; &lt;/span&gt;Status:&lt;span class="w"&gt; &lt;/span&gt;APPLIED&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;.00
&lt;span class="w"&gt;    &lt;/span&gt;ok&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;145&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;Removing&lt;span class="w"&gt; &lt;/span&gt;Unused&lt;span class="w"&gt; &lt;/span&gt;SYS&lt;span class="w"&gt; &lt;/span&gt;Objects&lt;span class="w"&gt; &lt;/span&gt;and&lt;span class="w"&gt; &lt;/span&gt;Public&lt;span class="w"&gt; &lt;/span&gt;Privs&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;.00
&lt;span class="w"&gt;    &lt;/span&gt;ok&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;146&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;Dropping&lt;span class="w"&gt; &lt;/span&gt;Upgrade&lt;span class="w"&gt; &lt;/span&gt;Triggers&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;APEX_240200&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;.00
&lt;span class="w"&gt;    &lt;/span&gt;ok&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;147&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;Validating&lt;span class="w"&gt; &lt;/span&gt;Installation&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;.10
ok&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="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;147&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;actions&lt;span class="w"&gt; &lt;/span&gt;passed,&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;actions&lt;span class="w"&gt; &lt;/span&gt;failed&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;1&lt;/span&gt;.03

Thank&lt;span class="w"&gt; &lt;/span&gt;you&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;installing&lt;span class="w"&gt; &lt;/span&gt;Oracle&lt;span class="w"&gt; &lt;/span&gt;APEX&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;26&lt;/span&gt;.1.0

Oracle&lt;span class="w"&gt; &lt;/span&gt;APEX&lt;span class="w"&gt; &lt;/span&gt;is&lt;span class="w"&gt; &lt;/span&gt;installed&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;the&lt;span class="w"&gt; &lt;/span&gt;APEX_260100&lt;span class="w"&gt; &lt;/span&gt;schema.

The&lt;span class="w"&gt; &lt;/span&gt;structure&lt;span class="w"&gt; &lt;/span&gt;of&lt;span class="w"&gt; &lt;/span&gt;the&lt;span class="w"&gt; &lt;/span&gt;link&lt;span class="w"&gt; &lt;/span&gt;to&lt;span class="w"&gt; &lt;/span&gt;the&lt;span class="w"&gt; &lt;/span&gt;Oracle&lt;span class="w"&gt; &lt;/span&gt;APEX&lt;span class="w"&gt; &lt;/span&gt;Administration&lt;span class="w"&gt; &lt;/span&gt;Services&lt;span class="w"&gt; &lt;/span&gt;is&lt;span class="w"&gt; &lt;/span&gt;as&lt;span class="w"&gt; &lt;/span&gt;follows:
http://host:port/ords/apex_admin

The&lt;span class="w"&gt; &lt;/span&gt;structure&lt;span class="w"&gt; &lt;/span&gt;of&lt;span class="w"&gt; &lt;/span&gt;the&lt;span class="w"&gt; &lt;/span&gt;link&lt;span class="w"&gt; &lt;/span&gt;to&lt;span class="w"&gt; &lt;/span&gt;the&lt;span class="w"&gt; &lt;/span&gt;Oracle&lt;span class="w"&gt; &lt;/span&gt;APEX&lt;span class="w"&gt; &lt;/span&gt;development&lt;span class="w"&gt; &lt;/span&gt;environment&lt;span class="w"&gt; &lt;/span&gt;is&lt;span class="w"&gt; &lt;/span&gt;as&lt;span class="w"&gt; &lt;/span&gt;follows:
http://host:port/ords/apex

timing&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;Phase&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="o"&gt;(&lt;/span&gt;Switch&lt;span class="o"&gt;)&lt;/span&gt;
Elapsed:&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;.03

timing&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;Complete&lt;span class="w"&gt; &lt;/span&gt;Installation
Elapsed:&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;11&lt;/span&gt;.98
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2 id="upgrade-apex-images-from-cdn"&gt;Upgrade APEX images from CDN&lt;/h2&gt;
&lt;div class="highlight" data-lang="SQL"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;begin&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;apex_instance_admin&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_parameter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="n"&gt;p_parameter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;IMAGE_PREFIX&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="n"&gt;p_value&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39; https://static.oracle.com/cdn/apex/26.1.0/&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="k"&gt;commit&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2 id="validate-apex-version"&gt;Validate APEX version&lt;/h2&gt;
&lt;div class="highlight" data-lang="SQL"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;SQL&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;select&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;dba_registry&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;where&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;comp_id&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="s1"&gt;&amp;#39;APEX&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="n"&gt;STATUS&lt;/span&gt;
&lt;span class="c1"&gt;------&lt;/span&gt;
&lt;span class="k"&gt;VALID&lt;/span&gt;

&lt;span class="k"&gt;SQL&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;select&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="k"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;apex_release&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="n"&gt;VERSION_NO&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="n"&gt;API_COMPATIBILITY&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="n"&gt;APEXLANG_VERSION&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;PATCH_APPLIED&lt;/span&gt;
&lt;span class="c1"&gt;----------   -----------------   ----------------    -------------&lt;/span&gt;
&lt;span class="mi"&gt;26&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="mi"&gt;2026&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;03&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="mi"&gt;26&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;3102&lt;/span&gt;&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="n"&gt;APPLIED&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2 id="access-apex-261"&gt;Access APEX 26.1&lt;/h2&gt;
&lt;p&gt;Login screen&lt;/p&gt;
&lt;p&gt;&lt;img alt="APEX Login Screen" src="https://www.yakshaving.co.uk/images/2026/APEX_26_1_Login_Screen.webp" title="APEX 26 Login page" /&gt;&lt;/p&gt;
&lt;p&gt;Home page&lt;/p&gt;
&lt;p&gt;&lt;img alt="APEX Home Page" src="https://www.yakshaving.co.uk/images/2026/APEX_26_1_Home_Page.webp" title="APEX 26 Home page" /&gt;&lt;/p&gt;
&lt;h2 id="upgrade-universal-theme"&gt;Upgrade Universal Theme&lt;/h2&gt;
&lt;p&gt;Navigate to the APEX application. Click 'Shared Components'&lt;/p&gt;
&lt;p&gt;Informational message displayed.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;'There is a new version of Universal Theme available! You can
refresh your theme to take advantage of new features, enhancements,
and bug fixes'.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Click 'Refresh Theme'.&lt;/p&gt;
&lt;p&gt;The success message should be displayed.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;'Successfully refreshed Universal Theme'.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="upgrade-apex-applications"&gt;Upgrade APEX applications&lt;/h2&gt;
&lt;p&gt;Upgrade each application using 'Utilities - Upgrade Application'.&lt;/p&gt;
&lt;p&gt;&lt;img alt="APEX Upgrade Application" src="https://www.yakshaving.co.uk/images/2026/APEX_26_1_Upgrade_Application.webp" title="APEX 26 Upgrade Application" /&gt;&lt;/p&gt;</description>
      <guid isPermaLink="false">https://www.yakshaving.co.uk/posts/apex-26-1-upgrade/</guid>
      <category>Oracle</category>
      <category>APEX</category>
      <pubDate>Fri, 15 May 2026 14:13:33 +0100</pubDate>
    </item>
    <item>
      <title>Things I Wish I'd Said</title>
      <link>https://www.yakshaving.co.uk/posts/things-i-wish-said/</link>
      <description>&lt;p&gt;[ Originally published in 1999 and lovingly salvaged from the
&lt;a href="https://web.archive.org/" rel="noopener noreferrer" target="_blank"&gt;WayBack&lt;/a&gt; archive ]&lt;/p&gt;
&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/The_Chameleons" rel="noopener noreferrer" target="_blank"&gt;The Chameleons&lt;/a&gt; were a band formed in 1981 Middleton, north
Manchester, England who released three albums before they split up in
1987.&lt;/p&gt;
&lt;p&gt;The Chameleons consisted of Mark Burgess (bass, vocals), Dave Fielding
(guitar), Reg Smithies (guitar) and John Lever (drums).&lt;/p&gt;
&lt;p&gt;I'm somewhat ashamed to admit that when I first saw the Chameleons
live, I barely noticed them. They were supporting U2 at the
prestigious venue known as the University of Warwick Arts Centre in
late 1981. At the time, U2 were relatively unknown too outside indy
circles. I remember Bono slagging off the Radio 1 PlayList when
introducing 'Fire'.&lt;/p&gt;
&lt;p&gt;Anyway, my first memory of the Chameleons was Mark walking on to the
stage in front of probably 200 people in the Arts Centre (probably
held 1500) muttering what later transpired to be the immortal words -&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;'Hi - we're the Chameleons and we're from Manchester'&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Of course, everyone was drinking elsewhere or talking and waiting for
U2. It wasn't until the summer of 1982 that I heard a session by The
Chameleons on Piccadilly radio (local Manchester radio station). I
still have the tape of that session - the songs included 'Monkeyland'
and 'Fan The Bellows'&lt;/p&gt;
&lt;p&gt;After that I saw the Chameleons play quite a few times mainly in
Manchester (Ritzy's, Hacienda, Salford College). The Manchester gigs
were great and notable for the large devoted Middleton contingent. I'd
only been to the Hacienda once before and it struck me as an
overpriced, overrated venue. It had big screens with flashing images
and clips from obscure, cult movies like 'Attack of the Killer
Tomatoes'. It was brilliant to hear the 'Chameleons Barmy Army'
blasting out and people invading the stage, leaping around and
generally antagonising the FAC51 bouncers.&lt;/p&gt;
&lt;p&gt;At that time, I used to watch Manchester United quite a lot as well. I
used to go to most home games and some away games. It struck me that
the atmosphere at Chameleons gigs was quite similar to a United away
game. Both events were preceded by pre-match drinking and a great
sense of expectation. There was probably more tension and (threat of)
violence at the football. In fact, the atmosphere at Chameleons gigs
was brilliant and although the gigs were very physical - a lot of
leaping around and stage diving - I don't actually remember any
fighting. At other concerts (mainly The Smiths and The Fall) I went to
around the same time, there was such a mixture of people (Punks,
Skins, students, bouncers etc) there, the undercurrent of violent
tension was always there and sometimes erupted.&lt;/p&gt;
&lt;p&gt;I also have hazy memories of trying and failing to see The Chameleons
(summer '82) at the Marquee in London (sold out) and again with a few
mates at the Camden Palace. This was a bizarre gig. Mark's voice was
knackered - they must have been in the middle of a lengthy tour. After
a couple of songs, Mark invited the audience to come up and share the
singing. Unsurprisingly it wasn't quite as good as the real thing and
the lads had to end the set. All the expectation, waiting and drinking
was for nothing - what an anti-climax.&lt;/p&gt;
&lt;p&gt;Things he did say&lt;/p&gt;
&lt;p&gt;I had an exchange of emails with Mark Burgess in late 1998. I've
published it &lt;a href="https://www.yakshaving.co.uk/posts/interview-with-mark-burgess/"&gt;here&lt;/a&gt; in case it's of interest.&lt;/p&gt;
&lt;p&gt;Things I wish I'd said&lt;/p&gt;
&lt;p&gt;I have some bootleg tapes of varying quality of Chameleons concerts.
Here's a complete list of the gigs with the set-lists including any
notable quotes by Mark in between songs.&lt;/p&gt;
&lt;div class="toc"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#derby-hall-bury-3-july-1981"&gt;Derby Hall, Bury (3 July 1981)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#derby-hall-bury-1982-date-unknown"&gt;Derby Hall, Bury (1982 date unknown)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#666-club-manchester-1-may-1982"&gt;666 Club, Manchester (1 May 1982)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#fulham-greyhound-london-4-august-1983"&gt;Fulham Greyhound, London (4 August 1983)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#futurama-leeds-18-september-1983"&gt;Futurama, Leeds (18 September 1983)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#bremen-germany-20-december-1983"&gt;Bremen, Germany (20 December 1983)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#hacienda-manchester-6-april-1984"&gt;Hacienda, Manchester (6 April 1984)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#camden-palace-london-11-september-1984"&gt;Camden Palace, London (11 September 1984)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#luxor-theatre-koln-germany-20-june-1985"&gt;Luxor Theatre, Koln, Germany (20 June 1985)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#frankfurt-germany-23-november-1986"&gt;Frankfurt, Germany (23 November 1986)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#manchester-international-12-september-1986"&gt;Manchester International (12 September 1986)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h1 id="derby-hall-bury-3-july-1981"&gt;Derby Hall, Bury (3 July 1981)&lt;/h1&gt;
&lt;p&gt;First ever live concert as the Chameleons.&lt;/p&gt;
&lt;p&gt;Don't Fall&lt;/p&gt;
&lt;p&gt;In Shreds&lt;/p&gt;
&lt;p&gt;On The Beach&lt;/p&gt;
&lt;p&gt;Up The Down Escalator&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;We don't use set lists, you know what I mean. We play what we feel
like playing on the spur of the moment so things get a bit quiet
inbetween so you'll have to make your own entertainment. Bit like
Joy Division when they played here. Anyone heard of them ? Breaking
Glass [JD song title]&lt;/p&gt;
&lt;p&gt;...like my white socks, know what I mean, new song, new faces. This
is about the old faces.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Endless Space&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This is a song about wanting to live forever. This is called Films.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Films&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Thank you very much indeed. Ta. This is the last one I'm afraid.
Well we know you've all got buses to catch and things so we won't
keep you. It's called Monkeyland. (Dave) - This set, right, we going
to dedicate it to Adrian 'cos we've known him for quite a bit but we
haven't seen him for ages and he's played with us a few times. We've
made a cassette - it's as good as the set list so if you want to buy
it. This is Reg's favourite, Monkeyland. Some people think it's the
best one. Monkeyland Raucous cheering, applause, shouts of 'Stay
On'.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Monkeyland&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Yeah, sound. Unfortunately...oh alright 'In Shreds', it is.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In Shreds&lt;/p&gt;
&lt;h1 id="derby-hall-bury-1982-date-unknown"&gt;Derby Hall, Bury (1982 date unknown)&lt;/h1&gt;
&lt;p&gt;Quite early from the set and lack of audience fervour. If anyone know
the exact date of this gig, please let me know.&lt;/p&gt;
&lt;p&gt;Intro (tuning up)&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Good evening. We're the Boomtown Rats, ha ha, my little joke. In
actual fact we are The Chameleons.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Fan The Bellows&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;(inaudible) ...This is a song which reflects that... (inaudible)
Standing on the corner (?) A song about the senseless waste of good
people. It's called 'Here Today'.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Here Today&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I'm falling from grace with myself again - happens all the time.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Falling from Grace&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Reverb please. We're going to do a song called 'Nostalgia'. Like
most of them, Reg wrote the song.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Nostalgia&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;(almost inaudible) If anyone sees a set list, let us know. (loud
feedback). Ow. Yeah. Got it...This is a song called 'Looking
Inwardly'.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Looking Inwardly&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This has got a rather strange title. This song is so new we haven't
even learned it properly so if it falls apart, you'll forgive us,
won't you ? No. Oh alright then. It's called 'Singing Rule Britannia
(as the walls close in)'&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Rule Britannia&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Goodnight. Thank you. God bless.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id="666-club-manchester-1-may-1982"&gt;666 Club, Manchester (1 May 1982)&lt;/h1&gt;
&lt;p&gt;Excellent sound quality.&lt;/p&gt;
&lt;p&gt;Intro&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Hi. We're The Chameleons. We are as organised as ever. This song's
called 'Don't Fall'.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Don't Fall&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Thank you. Back, fresh from our extensive tour of outer Mesopotamia.
Welcome home boys. Up the down escalator.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Up The Down Escalator&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;We don't have set lists you see. we just play what we feel like
playing so you'll have to be patient. This one's called 'Endless
Space'.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Endless Space&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The story of making a record.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In Shreds&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This is called 'Films' uh, uh, uh.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Films&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;It must be very nice to be trendy, I would not sit in the bar and on
the balcony.&lt;/p&gt;
&lt;p&gt;Bleak and industrial we're not, and never will be - not for you, or
you, up there, 'cos we don't f**kin' care.&lt;/p&gt;
&lt;p&gt;This song is for these people who at least listened, you know and
made some sort of enthusiastic motions.&lt;/p&gt;
&lt;p&gt;This is called 'Things I wish I'd said'. We've got to go after this
one - we can't have you all...&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Things I Wish I'd Said&lt;/p&gt;
&lt;p&gt;Beggars in the sky&lt;/p&gt;
&lt;h1 id="fulham-greyhound-london-4-august-1983"&gt;Fulham Greyhound, London (4 August 1983)&lt;/h1&gt;
&lt;p&gt;This is a small venue on Fulham Palace Road. Little more than a long,
narrow pub.&lt;/p&gt;
&lt;p&gt;A Person isn't Safe&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Thank you very much. Thursday's child has far to go.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Thursday's Child&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Jane, I've forgotten to bring my drink up. Could you bring us one ?
Who is ? (to requests for 'In Shreds') (audience replies 'You')
Yeah - right.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Perfume Garden&lt;/p&gt;
&lt;p&gt;Monkeyland&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This song's not about sex but it could be, you know. It's called
'Pleasure and Pain'.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Pleasure and Pain&lt;/p&gt;
&lt;p&gt;Don't Fall&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Well you reach the point where you know it's only your second skin.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Films&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A song about being...(inaudible)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Here Today&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Thank you.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Rule Britannia&lt;/p&gt;
&lt;p&gt;Paper Tigers&lt;/p&gt;
&lt;p&gt;In Shreds&lt;/p&gt;
&lt;p&gt;View from a hill&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Thank you very much. Good night.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Nostalgia&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Thank you.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;As High as You Can Go&lt;/p&gt;
&lt;h1 id="futurama-leeds-18-september-1983"&gt;Futurama, Leeds (18 September 1983)&lt;/h1&gt;
&lt;p&gt;All day festival featuring several bands. These gigs often ran to a
tight schedule so note the lack of the usual encores.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Good afternoon. Yes, we found it, yes. I don't want you to think I'm
a pop merchant or anything but I've had the shits about this gig
since tea time yesterday so if I make a few mistakes - well you know
?&lt;/p&gt;
&lt;p&gt;Just a second while Dave gets to grips with the technology.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Don't Fall&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Thank you.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Here Today&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Well you reach the point when you know it's only your second skin...&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Films&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Thank you. (faint chants of 'Chameleons Barmy Army' and 'Manchester
La, la, la' - MUFC football chant)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;A Person Isn't Safe&lt;/p&gt;
&lt;p&gt;Thursday's Child&lt;/p&gt;
&lt;p&gt;Up The Down Escalator&lt;/p&gt;
&lt;p&gt;Perfume Garden&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Thank you.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In Shreds&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Thank you. Well, it really has been fun. This is the last one.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Less Than Human&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Thank you. Goodnight.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id="bremen-germany-20-december-1983"&gt;Bremen, Germany (20 December 1983)&lt;/h1&gt;
&lt;p&gt;Don't Fall&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Thank you. We're going to do a song for you now called 'Here Today'.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Here Today&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Danke Schon. Oh yeah - it's a nice coat, very nice coat. That's not
it, is it ?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Thursday's Child&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;You can rip the seats up, if you want, you know. You can rip 'em
out, if you want, and throw them away with our permission. This is
the first seated gig we've ever done - you know what I mean - it's a
bit weird.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;A Person Isn't Safe&lt;/p&gt;
&lt;p&gt;Less Than Human&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Danke Schon. You might have noticed a slight technical hitch during
that number but it doesn't matter, does it ? No - it doesn't matter.
Good. This is called 'Pleasure and Pain'.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Pleasure and Pain&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Ta. When your mate comes back, can you tell him if he walks on the
stage again, I'm going to kick him in the teeth. This is called -
what is it called ? Oh, we haven't got a title - it's a new one, is
it ? Oh all right.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Films&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Danke Schon. This is called 'Paper Tigers'.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Paper Tigers&lt;/p&gt;
&lt;p&gt;MonkeyLand&lt;/p&gt;
&lt;p&gt;Danke Schon.&lt;/p&gt;
&lt;p&gt;One Flesh&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Thank you very much. Ta.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Rule Britannia&lt;/p&gt;
&lt;p&gt;Up The Down Escalator&lt;/p&gt;
&lt;p&gt;View From A Hill&lt;/p&gt;
&lt;h1 id="hacienda-manchester-6-april-1984"&gt;Hacienda, Manchester (6 April 1984)&lt;/h1&gt;
&lt;p&gt;Typical, packed, frenetic Manchester gig. Actually went to this one
which is the main reason I bought the tape. Poor sound quality and
precious few quotes between the songs. I think this was probably
because Mark had to contend with sporadic fighting between over
enthusiastic fans trying to get onto the stage and Hacienda 'doormen'.
Also the Hacienda stage is quite small and I remember the band seemed
to be quite cramped.&lt;/p&gt;
&lt;p&gt;Intro&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Thanks for coming down (audience 'You what '). I said - Thanks for
coming down (loud cheers) (inaudible)..in case the backdrop comes
down.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Don't Fall&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Chants of 'Chameleons' Barmy Army'.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Return of the Roughnecks&lt;/p&gt;
&lt;p&gt;A Person Isn't Safe&lt;/p&gt;
&lt;p&gt;Thursday's Child&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Wish I could tell you about a new record but I can't.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Here Today&lt;/p&gt;
&lt;p&gt;Pleasure and Pain&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Stop fighting - the light's are coming down.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Perfumed Garden&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;More chants of 'Chameleons' Barmy Army' and 'On the Stage'.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Monkeyland&lt;/p&gt;
&lt;p&gt;Films&lt;/p&gt;
&lt;p&gt;Intrigue in Tangiers&lt;/p&gt;
&lt;p&gt;Paper Tigers&lt;/p&gt;
&lt;p&gt;In Shreds&lt;/p&gt;
&lt;p&gt;Rule Britannia&lt;/p&gt;
&lt;p&gt;Splitting in Two&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Ta. I'd just like say again Thanks for coming 'cos I know it's good
here.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Up The Down Escalator&lt;/p&gt;
&lt;p&gt;Don't Fall&lt;/p&gt;
&lt;h1 id="camden-palace-london-11-september-1984"&gt;Camden Palace, London (11 September 1984)&lt;/h1&gt;
&lt;p&gt;Don't Fall&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Not having set lists has caused problems for these camera men. This
is called 'Intrigue'.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Intrigue In Tangiers&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Thanks. It's very nice. You skimped a bit on the dressing rooms
though. It smells like bad eggs down there, in the bowels of the
place. This is called 'Monkeyland'.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Monkeyland&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Now then, now then what shall we play next ? (audience shouts
requests) What ? Yeah, yeah. This is 'Second Skin'.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Films&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Every time we do a gig, Reg drinks my drink and there's never any
left for me. Do you want some Ribena ? 'Shreds' (audience). No. Rule
Britannia.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Rule Britannia&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;(requests) Pleasure and pain ? Yeah - we'll do 'Pleasure and Pain' -
we like that.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Pleasure and Pain&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Don't forget keeping in time is very welcome, know what I mean ?
What ? Yeah. Shall we play that ? Yeah - we'll do 'Roughnecks'. This
is called 'Return of the Roughnecks'.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Return of the Roughnecks&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Do you know when we'll have another record out ? (pause) Know what
that means ? F**k knows. (laughter). Well let's play 'A Person Isn't
Safe' 'cos we like that. Well we like 'em all but, you know, you
have your favourites, don't you ?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;A Person Isn't Safe&lt;/p&gt;
&lt;p&gt;In Shreds&lt;/p&gt;
&lt;h1 id="luxor-theatre-koln-germany-20-june-1985"&gt;Luxor Theatre, Koln, Germany (20 June 1985)&lt;/h1&gt;
&lt;p&gt;Intro&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Good evening everybody (whispered).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;A Person isn't Safe&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Thank you, Danke schon.&lt;/p&gt;
&lt;p&gt;(aside) Andy - there's some problems with the keyboard, can you not
hear it ?&lt;/p&gt;
&lt;p&gt;Just a few problems. Ees OK.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Rule Britannia.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Thank you very much. Thank you very much. Thank you.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;A Person Isn't Safe&lt;/p&gt;
&lt;p&gt;Return of the Roughnecks&lt;/p&gt;
&lt;p&gt;Monkeyland&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Oi - are you ready ?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Less Than Human&lt;/p&gt;
&lt;p&gt;In Shreds&lt;/p&gt;
&lt;p&gt;Intrigue In Tangiers&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Danke Schon.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Paper Tigers&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I am thanking you very much.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Pleasure and pain&lt;/p&gt;
&lt;p&gt;Films&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;You're a long way from home (to request for 'Don't Fall'). This is
called 'Home is where the heart is'&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Home is where the heart is&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Danke Schon. Auf wiedersehen.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Tomorrow Never Comes&lt;/p&gt;
&lt;p&gt;Don't Fall&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Thank you very much. Goodbye.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id="frankfurt-germany-23-november-1986"&gt;Frankfurt, Germany (23 November 1986)&lt;/h1&gt;
&lt;p&gt;Intro (unknown, jolly little instrumental ditty)&lt;/p&gt;
&lt;p&gt;Swamp Thing&lt;/p&gt;
&lt;p&gt;Mad Jack&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Don't look back. If you want to dance, Jack.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;A Person Isn't Safe.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Thank you very much. How are you ? Excuse the manners but I have a
cold. That was about the rape of a woman. This is about the rape of
a country and he starts it. 'Come on Mark' (audience). I am coming
on.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Rule Britannia&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Right. Another little happy song for you.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Less Than Human&lt;/p&gt;
&lt;p&gt;Paradiso&lt;/p&gt;
&lt;p&gt;Home Is Where The Heart Is&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;(Pause, audience shouts, tuning up). Sorry about that. All the
lonely people, where do they all come from ?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Soul In Isolation&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Intersperses bits of 'Mad Jack'&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Splitting In Two&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Is it a question of a University degree in Sociology ? Mark
improvises snippets of a Fall song 'Rowche Rumble' - My baby's on
Valium, my baby's on Valium - Rowche Rumble, ROWCHE RUMBLE is
Valium'.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id="manchester-international-12-september-1986"&gt;Manchester International (12 September 1986)&lt;/h1&gt;
&lt;p&gt;Great atmosphere. Great songs. Great concert. Great quotes. Only wish
I'd been there.&lt;/p&gt;
&lt;p&gt;Swamp Thing&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Blimey, we are in demand aren't we ? This song's called 'Mad Jack'&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Mad Jack&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Ta. I'd like to make conversation you know, but my voice is going.
You work me too hard - you know what I mean. All for 10 quid a week.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;A Person Isn't Safe&lt;/p&gt;
&lt;p&gt;Rule Britannia&lt;/p&gt;
&lt;p&gt;Less Than Human&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Tell 'em to move back ? Who do you think I am ? Moses ? Can you move
back, he says. Move back. King Canute.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Paradiso&lt;/p&gt;
&lt;p&gt;Home Is Where The Heart Is.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The management (laughs) has asked me to ask you : 'Would you please
not stand on each other's shoulders ?' (audience roars). I suggest
the next time he puts a crowd like this on, he loads them in in
stacker trucks.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Soul In Isolation&lt;/p&gt;
&lt;p&gt;Films&lt;/p&gt;
&lt;p&gt;Pleasure and Pain&lt;/p&gt;
&lt;p&gt;Caution&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Be seeing you. Goodbye. You're showing your age there, aren't you
(to requests for 'In Shreds') ?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Tomorrow Never Comes&lt;/p&gt;
&lt;p&gt;Mark improvises 'I won't get fooled again' at the end.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;You must have come here five years ago. Do you want me to tell you
what 'In Shreds' was like or what ? (Mimics intro to 'In Shreds') No
we're not doing 'In Shreds' but we're not, we're the bunch who wrote
this.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Splitting in Two.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Mark improvises a few lines including 'Pass the paracetamol', 'Cha
Cha Cha' (Marquis Cha Cha by The Fall ?) and then does a Chameleons
on 45 compendium, including 'Strange Times' and 'Mad Jack'.&lt;/p&gt;
&lt;p&gt;Is it a question of a University degree in Sociology ?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This tape then runs into a Bunnymen gig with 'Do It Clean' during
which Ian McCulloch is also paying tribute to The Fall by
interspersing verses from 'Totally Wired'.&lt;/p&gt;</description>
      <guid isPermaLink="false">https://www.yakshaving.co.uk/posts/things-i-wish-said/</guid>
      <category>music</category>
      <category>The Chameleons</category>
      <pubDate>Fri, 08 May 2026 19:40:08 +0100</pubDate>
    </item>
    <item>
      <title>BlogMore performance</title>
      <link>https://www.yakshaving.co.uk/posts/blogmore-performance/</link>
      <description>&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;</description>
      <guid isPermaLink="false">https://www.yakshaving.co.uk/posts/blogmore-performance/</guid>
      <category>blogging</category>
      <category>BlogMore</category>
      <pubDate>Fri, 08 May 2026 18:41:12 +0100</pubDate>
    </item>
    <item>
      <title>REST API clients</title>
      <link>https://www.yakshaving.co.uk/posts/rest-api-clients/</link>
      <description>&lt;div class="toc"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#rest-api-clients"&gt;REST API clients&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#web-browsers"&gt;Web browsers&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#firefox"&gt;Firefox&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#add-ons"&gt;Add-Ons&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#rester"&gt;RESTer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#rested"&gt;RESTED&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#chrome"&gt;Chrome&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#extensions"&gt;Extensions&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#rest-client"&gt;REST Client&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#talend"&gt;Talend&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#applications"&gt;Applications&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#postman"&gt;Postman&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#curl"&gt;Curl&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#insomnia"&gt;Insomnia&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#bruno"&gt;Bruno&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#hoppscotch"&gt;Hoppscotch&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#httpie"&gt;HTTPie&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#editorsides"&gt;Editors/IDEs&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#emacs"&gt;Emacs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#visual-studio"&gt;Visual Studio&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#thunder-client"&gt;Thunder Client&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#golden-retriever"&gt;Golden Retriever&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h1 id="rest-api-clients"&gt;REST API clients&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://www.yakshaving.co.uk/posts/intro-rest-api/"&gt;REST API&lt;/a&gt;'s are increasingly important for Web developers.&lt;/p&gt;
&lt;p&gt;There are a wide variety of tools that assist developers with
accessing, creating, testing and documenting testing REST API's.&lt;/p&gt;
&lt;p&gt;The following examples will use Transport For London (&lt;a href="https://tfl.gov.uk/" rel="noopener noreferrer" target="_blank"&gt;TFL&lt;/a&gt;)'s
report on the current air quality in London. This REST API does not
require authentication and returns a manageable amount of data.&lt;/p&gt;
&lt;p&gt;The endpoint for this REST API is:
&lt;a href="https://api.tfl.gov.uk/AirQuality/" rel="noopener noreferrer" target="_blank"&gt;https://api.tfl.gov.uk/AirQuality/&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="web-browsers"&gt;Web browsers&lt;/h2&gt;
&lt;p&gt;As a REST API is simply a URL, the most obvious &lt;sup id="fnref:361-fn1"&gt;&lt;a class="footnote-ref" href="#fn:361-fn1"&gt;1&lt;/a&gt;&lt;/sup&gt; candidate to
access a (simple) REST API is simply, err, a Web browser.&lt;/p&gt;
&lt;p&gt;If you just want to quickly check the endpoint is correct, currently
accessible and examine the data returned, this may be adequate as a
sanity check.&lt;/p&gt;
&lt;h3 id="firefox"&gt;Firefox&lt;/h3&gt;
&lt;p&gt;Mozilla &lt;a href="https://www.mozilla.org/en-GB/firefox/" rel="noopener noreferrer" target="_blank"&gt;Firefox&lt;/a&gt; can display and format the JSON data returned by a
REST API call.&lt;/p&gt;
&lt;p&gt;There are options to display the raw data and the headers.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Air Quality - Firefox" src="https://www.yakshaving.co.uk/images/2026/Air-Quality-Firefox.webp" title="Air Quality - Firefox" /&gt;&lt;/p&gt;
&lt;h4 id="add-ons"&gt;Add-Ons&lt;/h4&gt;
&lt;p&gt;If you need more flexibility or just curious, there are a couple of
Firefox add-ons available.&lt;/p&gt;
&lt;h5 id="rester"&gt;RESTer&lt;/h5&gt;
&lt;p&gt;&lt;a href="https://addons.mozilla.org/en-GB/firefox/addon/rester/" rel="noopener noreferrer" target="_blank"&gt;RESTer&lt;/a&gt; is a Firefox add-on providing a REST API client.&lt;/p&gt;
&lt;p&gt;Specify the following parameter values:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Method: GET&lt;/li&gt;
&lt;li&gt;URL: &lt;a href="https://api.tfl.gov.uk/AirQuality/" rel="noopener noreferrer" target="_blank"&gt;https://api.tfl.gov.uk/AirQuality/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img alt="Air Quality Firefox RESTer" src="https://www.yakshaving.co.uk/images/2026/Air-Quality-Firefox-Rester.webp" title="Air Quality - Firefox RESTer" /&gt;&lt;/p&gt;
&lt;h5 id="rested"&gt;RESTED&lt;/h5&gt;
&lt;p&gt;&lt;a href="https://addons.mozilla.org/en-GB/firefox/addon/rested/" rel="noopener noreferrer" target="_blank"&gt;RESTED&lt;/a&gt; is another Firefox add-on with similar functionality.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Air Quality Firefox RESTED" src="https://www.yakshaving.co.uk/images/2026/Air-Quality-Firefox-Rested.webp" title="Air Quality - Firefox RESTED" /&gt;&lt;/p&gt;
&lt;h3 id="chrome"&gt;Chrome&lt;/h3&gt;
&lt;p&gt;Out of the box, the JSON displayed by &lt;a href="https://www.google.com/intl/en_uk/chrome/" rel="noopener noreferrer" target="_blank"&gt;Chrome&lt;/a&gt; isn't as readable and
user friendly as Firefox as it's just a wall of text with no
formatting. That's OK for a computer program but not so good for a
human.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Air Quality Chrome" src="https://www.yakshaving.co.uk/images/2026/Air-Quality-Chrome.webp" title="Air Quality Chrome" /&gt;&lt;/p&gt;
&lt;p&gt;However, you can use the 'Pretty Print' option.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Air Quality Chrome Pretty Print" src="https://www.yakshaving.co.uk/images/2026/Air-Quality-Chrome-PrettyPrint.webp" title="Air Quality Chrome Pretty Print" /&gt;&lt;/p&gt;
&lt;p&gt;Alternatively, install the Chrome &lt;a href="https://chrome.google.com/webstore/detail/jsonvue/chklaanhfefbnpoihckbnefhakgolnmc?hl=en" rel="noopener noreferrer" target="_blank"&gt;JSONVue&lt;/a&gt; extension which displays
the JSON data in a more useful format.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Air Quality Chrome JSONVue" src="https://www.yakshaving.co.uk/images/2026/Air-Quality-Chrome-JSONVue.webp" title="Air Quality Chrome JSONVue" /&gt;&lt;/p&gt;
&lt;p&gt;There are also a number of Web sites that display a JSON stream into a
readable format with a variety of formatting options.&lt;/p&gt;
&lt;p&gt;For example, you can copy/paste the raw Chrome text output into &lt;a href="https://jsonformatter.org/" rel="noopener noreferrer" target="_blank"&gt;JSON
formatter&lt;/a&gt; to display the data in a more readable format.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Air Quality JSON formatter" src="https://www.yakshaving.co.uk/images/2026/Air-Quality-JSON-formatter.webp" title="Air Quality JSON formatter" /&gt;&lt;/p&gt;
&lt;h4 id="extensions"&gt;Extensions&lt;/h4&gt;
&lt;h5 id="rest-client"&gt;REST Client&lt;/h5&gt;
&lt;p&gt;&lt;a href="https://chromewebstore.google.com/detail/rest-client/oienkoejnhkbcibhdnpjoemdnmiokgah" rel="noopener noreferrer" target="_blank"&gt;REST Client&lt;/a&gt; is a Chrome extension to test REST API's.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Air Quality Chrome REST Client" src="https://www.yakshaving.co.uk/images/2026/Air-Quality-Chrome-REST-client.webp" title="Air Quality Chrome REST Client" /&gt;&lt;/p&gt;
&lt;h5 id="talend"&gt;Talend&lt;/h5&gt;
&lt;p&gt;&lt;a href="https://www.talend.com/" rel="noopener noreferrer" target="_blank"&gt;Talend&lt;/a&gt; offers a commercial product together with a free Chrome
&lt;a href="https://chrome.google.com/webstore/detail/talend-api-tester-free-ed/aejoelaoggembcahagimdiliamlcdmfm?hl=en" rel="noopener noreferrer" target="_blank"&gt;extension&lt;/a&gt; that may suffice for simple
requirements.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Air Quality Chrome Talend" src="https://www.yakshaving.co.uk/images/2026/Air-Quality-Chrome-Talend.webp" title="Air Quality Chrome Talend" /&gt;&lt;/p&gt;
&lt;h2 id="applications"&gt;Applications&lt;/h2&gt;
&lt;h3 id="postman"&gt;Postman&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://www.postman.com/" rel="noopener noreferrer" target="_blank"&gt;Postman&lt;/a&gt; is a very popular desktop REST API application and
includes team working, workspaces, Git support, AI integration, data
driven testing and many other features. There is a free plan available
for individuals.&lt;/p&gt;
&lt;p&gt;Postman is available on the Web and there are native applications for
Windows, Linux and macOS.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Air Quality Postman Web" src="https://www.yakshaving.co.uk/images/2026/Air-Quality-Postman-Web.webp" title="Air Quality Postman Web" /&gt;&lt;/p&gt;
&lt;p&gt;Postman is useful as many sites offering REST API's also include a
pre-built Postman collection that you can import and experiment with.&lt;/p&gt;
&lt;p&gt;Personally, I find the Postman Web site very busy and cluttered which
is overkill for my simple requirements. Postman also requires that you
sign up for an account.&lt;/p&gt;
&lt;p&gt;Postman offers a native Linux application which is 375MB (on Arch
Linux).&lt;/p&gt;
&lt;p&gt;&lt;img alt="Air Quality Postman App" src="https://www.yakshaving.co.uk/images/2026/Air-Quality-Postman-App.webp" title="Air Quality Postman App" /&gt;&lt;/p&gt;
&lt;h3 id="curl"&gt;Curl&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://curl.se/" rel="noopener noreferrer" target="_blank"&gt;curl&lt;/a&gt; is a open source command line utility for testing REST API's
which is universally available (Linux, Windows, MacOS).&lt;/p&gt;
&lt;p&gt;You can find out whether curl is installed and, if so, which version
using the following command. It's worth checking you are using a
recent version of the software.&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;curl&lt;span class="w"&gt; &lt;/span&gt;--version
curl&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;8&lt;/span&gt;.19.0&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;x86_64-pc-linux-gnu&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;libcurl/8.19.0&lt;span class="w"&gt; &lt;/span&gt;OpenSSL/3.6.2
&lt;span class="w"&gt;  &lt;/span&gt;zlib/1.3.2&lt;span class="w"&gt; &lt;/span&gt;brotli/1.2.0&lt;span class="w"&gt; &lt;/span&gt;zstd/1.5.7&lt;span class="w"&gt; &lt;/span&gt;libidn2/2.3.8&lt;span class="w"&gt; &lt;/span&gt;libpsl/0.21.5
&lt;span class="w"&gt;  &lt;/span&gt;libssh2/1.11.1&lt;span class="w"&gt; &lt;/span&gt;nghttp2/1.69.0&lt;span class="w"&gt; &lt;/span&gt;ngtcp2/1.22.1&lt;span class="w"&gt; &lt;/span&gt;nghttp3/1.15.0&lt;span class="w"&gt; &lt;/span&gt;mit-krb5/1.21.3
Release-Date:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2026&lt;/span&gt;-03-11
Protocols:&lt;span class="w"&gt; &lt;/span&gt;dict&lt;span class="w"&gt; &lt;/span&gt;file&lt;span class="w"&gt; &lt;/span&gt;ftp&lt;span class="w"&gt; &lt;/span&gt;ftps&lt;span class="w"&gt; &lt;/span&gt;gopher&lt;span class="w"&gt; &lt;/span&gt;gophers&lt;span class="w"&gt; &lt;/span&gt;http&lt;span class="w"&gt; &lt;/span&gt;https&lt;span class="w"&gt; &lt;/span&gt;imap&lt;span class="w"&gt; &lt;/span&gt;imaps
&lt;span class="w"&gt;  &lt;/span&gt;ipfs&lt;span class="w"&gt; &lt;/span&gt;ipns&lt;span class="w"&gt; &lt;/span&gt;mqtt&lt;span class="w"&gt; &lt;/span&gt;mqtts&lt;span class="w"&gt; &lt;/span&gt;pop3&lt;span class="w"&gt; &lt;/span&gt;pop3s&lt;span class="w"&gt; &lt;/span&gt;rtsp&lt;span class="w"&gt; &lt;/span&gt;scp&lt;span class="w"&gt; &lt;/span&gt;sftp&lt;span class="w"&gt; &lt;/span&gt;smb&lt;span class="w"&gt; &lt;/span&gt;smbs&lt;span class="w"&gt; &lt;/span&gt;smtp&lt;span class="w"&gt; &lt;/span&gt;smtps
&lt;span class="w"&gt;  &lt;/span&gt;telnet&lt;span class="w"&gt; &lt;/span&gt;tftp&lt;span class="w"&gt; &lt;/span&gt;ws&lt;span class="w"&gt; &lt;/span&gt;wss
Features:&lt;span class="w"&gt; &lt;/span&gt;alt-svc&lt;span class="w"&gt; &lt;/span&gt;AsynchDNS&lt;span class="w"&gt; &lt;/span&gt;brotli&lt;span class="w"&gt; &lt;/span&gt;GSS-API&lt;span class="w"&gt; &lt;/span&gt;HSTS&lt;span class="w"&gt; &lt;/span&gt;HTTP2&lt;span class="w"&gt; &lt;/span&gt;HTTP3
&lt;span class="w"&gt;  &lt;/span&gt;HTTPS-proxy&lt;span class="w"&gt; &lt;/span&gt;IDN&lt;span class="w"&gt; &lt;/span&gt;IPv6&lt;span class="w"&gt; &lt;/span&gt;Kerberos&lt;span class="w"&gt; &lt;/span&gt;Largefile&lt;span class="w"&gt; &lt;/span&gt;libz&lt;span class="w"&gt; &lt;/span&gt;NTLM&lt;span class="w"&gt; &lt;/span&gt;PSL&lt;span class="w"&gt; &lt;/span&gt;SPNEGO&lt;span class="w"&gt; &lt;/span&gt;SSL
&lt;span class="w"&gt;  &lt;/span&gt;threadsafe&lt;span class="w"&gt; &lt;/span&gt;TLS-SRP&lt;span class="w"&gt; &lt;/span&gt;UnixSockets&lt;span class="w"&gt; &lt;/span&gt;zstd
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;You can use curl to exercise the TFL Air Quality REST API using the
following command.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;--silent&lt;/code&gt; parameter suppresses download and timing information
and the raw output is piped to &lt;code&gt;jq&lt;/code&gt; to format the JSON in a prettier
format.&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;curl&lt;span class="w"&gt; &lt;/span&gt;--request&lt;span class="w"&gt; &lt;/span&gt;GET&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;       &lt;/span&gt;--url&lt;span class="w"&gt; &lt;/span&gt;https://api.tfl.gov.uk/AirQuality/&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;jq
&lt;span class="o"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;$id&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;1&amp;quot;&lt;/span&gt;,
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;$type&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Tfl.Api.Presentation.Entities.LondonAirForecast, Tfl.Api.Presentation.Entities&amp;quot;&lt;/span&gt;,
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;updatePeriod&amp;quot;&lt;/span&gt;:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;hourly&amp;quot;&lt;/span&gt;,
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;updateFrequency&amp;quot;&lt;/span&gt;:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;1&amp;quot;&lt;/span&gt;,
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;forecastURL&amp;quot;&lt;/span&gt;:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;http://londonair.org.uk/forecast&amp;quot;&lt;/span&gt;,
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;disclaimerText&amp;quot;&lt;/span&gt;:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;This forecast is intended to provide information on expected pollution levels in areas of significant public exposure. It may not apply in very specific locations close to unusually strong or short-lived local sources of pollution.&amp;quot;&lt;/span&gt;,
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;currentForecast&amp;quot;&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="o"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;$id&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;2&amp;quot;&lt;/span&gt;,
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;$type&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Tfl.Api.Presentation.Entities.CurrentForecast, Tfl.Api.Presentation.Entities&amp;quot;&lt;/span&gt;,
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;forecastType&amp;quot;&lt;/span&gt;:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Current&amp;quot;&lt;/span&gt;,
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;forecastID&amp;quot;&lt;/span&gt;:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;53210&amp;quot;&lt;/span&gt;,
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;forecastBand&amp;quot;&lt;/span&gt;:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Low&amp;quot;&lt;/span&gt;,
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;forecastSummary&amp;quot;&lt;/span&gt;:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Low air pollution forecast valid from Friday 24 April to end of Friday 24 April GMT&amp;quot;&lt;/span&gt;,
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;nO2Band&amp;quot;&lt;/span&gt;:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Low&amp;quot;&lt;/span&gt;,
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;o3Band&amp;quot;&lt;/span&gt;:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Low&amp;quot;&lt;/span&gt;,
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;pM10Band&amp;quot;&lt;/span&gt;:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Low&amp;quot;&lt;/span&gt;,
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;pM25Band&amp;quot;&lt;/span&gt;:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Low&amp;quot;&lt;/span&gt;,
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;sO2Band&amp;quot;&lt;/span&gt;:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Low&amp;quot;&lt;/span&gt;,
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;forecastText&amp;quot;&lt;/span&gt;:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;A sunny warm day on Friday.&amp;amp;lt;br/&amp;amp;gt;&amp;amp;lt;br/&amp;amp;gt;Back trajectories indicate air arriving from the North Sea. This should be a relatively &amp;amp;#39;clean&amp;amp;#39; air feed. A light and cooler breeze should ensure dispersion of any local emissions.&amp;amp;lt;br/&amp;amp;gt;&amp;amp;lt;br/&amp;amp;gt;Air pollution is expected to remain &amp;amp;#39;Low&amp;amp;#39; for the following pollutants:&amp;amp;lt;br/&amp;amp;gt;&amp;amp;lt;br/&amp;amp;gt;Nitrogen dioxide&amp;amp;lt;br/&amp;amp;gt;Ozone&amp;amp;lt;br/&amp;amp;gt;Sulphur dioxide&amp;amp;lt;br/&amp;amp;gt;PM10 Particulates&amp;amp;lt;br/&amp;amp;gt;PM2.5 Particulates&amp;amp;lt;br/&amp;amp;gt;&amp;amp;lt;br/&amp;amp;gt;&amp;quot;&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="o"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;       &lt;/span&gt;&amp;lt;snip&amp;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="o"&gt;]&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3 id="insomnia"&gt;Insomnia&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://insomnia.rest/" rel="noopener noreferrer" target="_blank"&gt;Insomnia&lt;/a&gt; is another option although the free version doesn't
support synchronisation to the cloud.&lt;/p&gt;
&lt;p&gt;Insomnia is an Electron based application which is great for platform
portability but does increase the size of the program (which is a
hefty 725MB on Arch Linux).&lt;/p&gt;
&lt;p&gt;Insomnia also requires an account (although there is a 'scratchpad'
available with limited functionality).&lt;/p&gt;
&lt;p&gt;&lt;img alt="Air Quality Insomnia" src="https://www.yakshaving.co.uk/images/2026/Air-Quality-Insomnia.webp" title="Air Quality Insomnia" /&gt;&lt;/p&gt;
&lt;h3 id="bruno"&gt;Bruno&lt;/h3&gt;
&lt;p&gt;Bruno is another Electron based REST API client (although the size of
the AppImage is 158MB). Bruno expressly does not offer a cloud
synchronisation option or require an account. Your work is stored
locally and sharing is via Git repositories. Nor will Bruno use your
data to train AI models.&lt;/p&gt;
&lt;p&gt;Bruno supports collections and each API request is stored as a text
file.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Air Quality Bruno" src="https://www.yakshaving.co.uk/images/2026/Air-Quality-Bruno.webp" title="Air Quality Bruno" /&gt;&lt;/p&gt;
&lt;h3 id="hoppscotch"&gt;Hoppscotch&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://hoppscotch.io/" rel="noopener noreferrer" target="_blank"&gt;Hoppscotch&lt;/a&gt; is yet another option that offers a cloud service
(requires login) as well as native clients for Linux, macOS and
Windows.&lt;/p&gt;
&lt;p&gt;Hoppscotch Community Edition is open source (MIT licence) and can be
used on personal and commercial projects. Hoppscotch can also be
self-hosted.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Air Quality Hoppscotch" src="https://www.yakshaving.co.uk/images/2026/Air-Quality-Hoppscotch.webp" title="Air Quality Hoppscotch" /&gt;&lt;/p&gt;
&lt;h3 id="httpie"&gt;HTTPie&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://httpie.io/" rel="noopener noreferrer" target="_blank"&gt;HTTPie&lt;/a&gt; is another REST client (similar to Hoppscotch) which
supports importing API's from 'curl', 'Postman' and 'Insomnia'.&lt;/p&gt;
&lt;p&gt;Some prospective users may be discouraged by the imminent promise of
'HTTPie AI'.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Air Quality HTTPie" src="https://www.yakshaving.co.uk/images/2026/Air-Quality-HTTPie.webp" title="Air Quality HTTPie" /&gt;&lt;/p&gt;
&lt;h2 id="editorsides"&gt;Editors/IDEs&lt;/h2&gt;
&lt;h3 id="emacs"&gt;Emacs&lt;/h3&gt;
&lt;p&gt;Emacs includes a package &lt;a href="https://github.com/pashky/restclient.el" rel="noopener noreferrer" target="_blank"&gt;restclient&lt;/a&gt; (available in &lt;a href="https://melpa.org/" rel="noopener noreferrer" target="_blank"&gt;MELPA&lt;/a&gt;) which
is a REST client that presents the output in a separate buffer. The
package still works fine but appears to be without an owner as the
repository was archived in April 2024.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Air Quality Emacs restclient" src="https://www.yakshaving.co.uk/images/2026/Air-Quality-Emacs-restclient.webp" title="Air Quality Emacs restclient" /&gt;&lt;/p&gt;
&lt;h3 id="visual-studio"&gt;Visual Studio&lt;/h3&gt;
&lt;h4 id="thunder-client"&gt;Thunder Client&lt;/h4&gt;
&lt;p&gt;&lt;a href="https://www.thunderclient.com/" rel="noopener noreferrer" target="_blank"&gt;Thunder Client&lt;/a&gt; is a VS Code extension for the widely used VS
Code editor/IDE.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Air Quality VSCode ThunderClient" src="https://www.yakshaving.co.uk/images/2026/Air-Quality-VSCode-ThunderClient.webp" title="Air Quality VSCode Thunderclient" /&gt;&lt;/p&gt;
&lt;h4 id="golden-retriever"&gt;Golden Retriever&lt;/h4&gt;
&lt;p&gt;If you want an alternative to ThunderClient and like dogs, try the
&lt;a href="https://techblog.skeepers.io/golden-retriever-testing-rest-apis-in-vs-code-made-easy-4aff454d6953" rel="noopener noreferrer" target="_blank"&gt;Golden Retriever&lt;/a&gt; extension.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;'Think of it as Postman’s loyal cousin who stays local, syncs with
Git, and doesn’t demand a cloud subscription'.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img alt="Air Quality VSCode GoldenRetriever" src="https://www.yakshaving.co.uk/images/2026/Air-Quality-VSCode-GoldenRetriever.webp" title="Air Quality VSCode Golden Retriever" /&gt;&lt;/p&gt;
&lt;div class="footnote"&gt;
&lt;hr /&gt;
&lt;ol&gt;
&lt;li id="fn:361-fn1"&gt;
&lt;p&gt;Seems obvious, but it took two years for this simple, obvious
fact to dawn on me.&amp;#160;&lt;a class="footnote-backref" href="#fnref:361-fn1" title="Jump back to footnote 1 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</description>
      <guid isPermaLink="false">https://www.yakshaving.co.uk/posts/rest-api-clients/</guid>
      <category>software</category>
      <category>REST</category>
      <pubDate>Wed, 29 Apr 2026 11:00:21 +0100</pubDate>
    </item>
    <item>
      <title>converting JPEG and PNG images to WebP format</title>
      <link>https://www.yakshaving.co.uk/posts/converting-images-to-webp-format/</link>
      <description>&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;</description>
      <guid isPermaLink="false">https://www.yakshaving.co.uk/posts/converting-images-to-webp-format/</guid>
      <category>blogging</category>
      <category>Linux</category>
      <pubDate>Wed, 15 Apr 2026 14:46:24 +0100</pubDate>
    </item>
    <item>
      <title>blogging more with BlogMore</title>
      <link>https://www.yakshaving.co.uk/posts/blogging-more-with-blogmore/</link>
      <description>&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;</description>
      <guid isPermaLink="false">https://www.yakshaving.co.uk/posts/blogging-more-with-blogmore/</guid>
      <category>blogging</category>
      <category>BlogMore</category>
      <pubDate>Tue, 14 Apr 2026 11:35:56 +0100</pubDate>
    </item>
    <item>
      <title>Emacs 31.x Orgmode version mismatch</title>
      <link>https://www.yakshaving.co.uk/posts/emacs-31-orgmode-version-mismatch/</link>
      <description>&lt;p&gt;The latest development version of GNU Emacs contains features coming
in the next major release so I build Emacs from source. This
development release is generally stable and very reliable.&lt;/p&gt;
&lt;p&gt;The source code for GNU Emacs is available on &lt;a href="http://savannah.gnu.org/projects/emacs/" rel="noopener noreferrer" target="_blank"&gt;Savannah&lt;/a&gt; and there
is also a GitHub &lt;a href="https://github.com/emacs-mirror/" rel="noopener noreferrer" target="_blank"&gt;mirror&lt;/a&gt; available. I tend to use the GitHub mirror
as it seems more reliable and faster.&lt;/p&gt;
&lt;p&gt;Clone the latest, bleeding edge Emacs code.&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;clone&lt;span class="w"&gt; &lt;/span&gt;https://github.com/emacs-mirror/emacs.git&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;# GitHub mirror&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Configure and build Emacs&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;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;emacs
$&lt;span class="w"&gt; &lt;/span&gt;./autogen.sh
$&lt;span class="w"&gt; &lt;/span&gt;./configure&lt;span class="w"&gt; &lt;/span&gt;--with-mailutils&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="c1"&gt;# silence warning&lt;/span&gt;
$&lt;span class="w"&gt; &lt;/span&gt;make&lt;span class="w"&gt; &lt;/span&gt;-j&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;4&lt;/span&gt;&lt;span class="w"&gt;                      &lt;/span&gt;&lt;span class="c1"&gt;# 4 parallel threads&lt;/span&gt;
$&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;make&lt;span class="w"&gt; &lt;/span&gt;install
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Occasionally, after upgrading to the latest version, Emacs produces a
warning caused by a version mismatch for the Orgmode package. This
helpful error message gives four possible causes.&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;&lt;span class="o"&gt;(&lt;/span&gt;emacs&lt;span class="o"&gt;)&lt;/span&gt;:&lt;span class="w"&gt; &lt;/span&gt;Org&lt;span class="w"&gt; &lt;/span&gt;version&lt;span class="w"&gt; &lt;/span&gt;mismatch.
This&lt;span class="w"&gt; &lt;/span&gt;warning&lt;span class="w"&gt; &lt;/span&gt;usually&lt;span class="w"&gt; &lt;/span&gt;appears&lt;span class="w"&gt; &lt;/span&gt;when&lt;span class="w"&gt; &lt;/span&gt;a&lt;span class="w"&gt; &lt;/span&gt;built-in&lt;span class="w"&gt; &lt;/span&gt;Org&lt;span class="w"&gt; &lt;/span&gt;version&lt;span class="w"&gt; &lt;/span&gt;is&lt;span class="w"&gt; &lt;/span&gt;loaded
prior&lt;span class="w"&gt; &lt;/span&gt;to&lt;span class="w"&gt; &lt;/span&gt;the&lt;span class="w"&gt; &lt;/span&gt;more&lt;span class="w"&gt; &lt;/span&gt;recent&lt;span class="w"&gt; &lt;/span&gt;Org&lt;span class="w"&gt; &lt;/span&gt;version.

Version&lt;span class="w"&gt; &lt;/span&gt;mismatch&lt;span class="w"&gt; &lt;/span&gt;is&lt;span class="w"&gt; &lt;/span&gt;commonly&lt;span class="w"&gt; &lt;/span&gt;encountered&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;the&lt;span class="w"&gt; &lt;/span&gt;following&lt;span class="w"&gt; &lt;/span&gt;situations:

&lt;span class="m"&gt;1&lt;/span&gt;.&lt;span class="w"&gt; &lt;/span&gt;Emacs&lt;span class="w"&gt; &lt;/span&gt;is&lt;span class="w"&gt; &lt;/span&gt;loaded&lt;span class="w"&gt; &lt;/span&gt;using&lt;span class="w"&gt; &lt;/span&gt;literate&lt;span class="w"&gt; &lt;/span&gt;Org&lt;span class="w"&gt; &lt;/span&gt;config&lt;span class="w"&gt; &lt;/span&gt;and&lt;span class="w"&gt; &lt;/span&gt;more&lt;span class="w"&gt; &lt;/span&gt;recent&lt;span class="w"&gt; &lt;/span&gt;Org
&lt;span class="w"&gt;   &lt;/span&gt;version&lt;span class="w"&gt; &lt;/span&gt;is&lt;span class="w"&gt; &lt;/span&gt;loaded&lt;span class="w"&gt; &lt;/span&gt;inside&lt;span class="w"&gt; &lt;/span&gt;the&lt;span class="w"&gt; &lt;/span&gt;file&lt;span class="w"&gt; &lt;/span&gt;loaded&lt;span class="w"&gt; &lt;/span&gt;by&lt;span class="w"&gt; &lt;/span&gt;‘org-babel-load-file’.
&lt;span class="w"&gt;   &lt;/span&gt;‘org-babel-load-file’&lt;span class="w"&gt; &lt;/span&gt;triggers&lt;span class="w"&gt; &lt;/span&gt;the&lt;span class="w"&gt; &lt;/span&gt;built-in&lt;span class="w"&gt; &lt;/span&gt;Org&lt;span class="w"&gt; &lt;/span&gt;version&lt;span class="w"&gt; &lt;/span&gt;clashing
&lt;span class="w"&gt;   &lt;/span&gt;the&lt;span class="w"&gt; &lt;/span&gt;newer&lt;span class="w"&gt; &lt;/span&gt;Org&lt;span class="w"&gt; &lt;/span&gt;version&lt;span class="w"&gt; &lt;/span&gt;attempt&lt;span class="w"&gt; &lt;/span&gt;to&lt;span class="w"&gt; &lt;/span&gt;be&lt;span class="w"&gt; &lt;/span&gt;loaded&lt;span class="w"&gt; &lt;/span&gt;later.

&lt;span class="w"&gt;   &lt;/span&gt;It&lt;span class="w"&gt; &lt;/span&gt;is&lt;span class="w"&gt; &lt;/span&gt;recommended&lt;span class="w"&gt; &lt;/span&gt;to&lt;span class="w"&gt; &lt;/span&gt;move&lt;span class="w"&gt; &lt;/span&gt;the&lt;span class="w"&gt; &lt;/span&gt;Org&lt;span class="w"&gt; &lt;/span&gt;loading&lt;span class="w"&gt; &lt;/span&gt;code&lt;span class="w"&gt; &lt;/span&gt;before&lt;span class="w"&gt; &lt;/span&gt;the
&lt;span class="w"&gt;   &lt;/span&gt;‘org-babel-load-file’&lt;span class="w"&gt; &lt;/span&gt;call.

&lt;span class="m"&gt;2&lt;/span&gt;.&lt;span class="w"&gt; &lt;/span&gt;New&lt;span class="w"&gt; &lt;/span&gt;Org&lt;span class="w"&gt; &lt;/span&gt;version&lt;span class="w"&gt; &lt;/span&gt;is&lt;span class="w"&gt; &lt;/span&gt;loaded&lt;span class="w"&gt; &lt;/span&gt;manually&lt;span class="w"&gt; &lt;/span&gt;by&lt;span class="w"&gt; &lt;/span&gt;setting&lt;span class="w"&gt; &lt;/span&gt;‘load-path’,&lt;span class="w"&gt; &lt;/span&gt;but&lt;span class="w"&gt; &lt;/span&gt;some
&lt;span class="w"&gt;   &lt;/span&gt;other&lt;span class="w"&gt; &lt;/span&gt;package&lt;span class="w"&gt; &lt;/span&gt;depending&lt;span class="w"&gt; &lt;/span&gt;on&lt;span class="w"&gt; &lt;/span&gt;Org&lt;span class="w"&gt; &lt;/span&gt;is&lt;span class="w"&gt; &lt;/span&gt;loaded&lt;span class="w"&gt; &lt;/span&gt;before&lt;span class="w"&gt; &lt;/span&gt;the&lt;span class="w"&gt; &lt;/span&gt;‘load-path’&lt;span class="w"&gt; &lt;/span&gt;is
&lt;span class="w"&gt;   &lt;/span&gt;configured.
&lt;span class="w"&gt;   &lt;/span&gt;This&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;other package&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;is&lt;span class="w"&gt; &lt;/span&gt;triggering&lt;span class="w"&gt; &lt;/span&gt;built-in&lt;span class="w"&gt; &lt;/span&gt;Org&lt;span class="w"&gt; &lt;/span&gt;version,&lt;span class="w"&gt; &lt;/span&gt;again
&lt;span class="w"&gt;   &lt;/span&gt;causing&lt;span class="w"&gt; &lt;/span&gt;the&lt;span class="w"&gt; &lt;/span&gt;version&lt;span class="w"&gt; &lt;/span&gt;mismatch.

&lt;span class="w"&gt;   &lt;/span&gt;It&lt;span class="w"&gt; &lt;/span&gt;is&lt;span class="w"&gt; &lt;/span&gt;recommended&lt;span class="w"&gt; &lt;/span&gt;to&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;‘load-path’&lt;span class="w"&gt; &lt;/span&gt;as&lt;span class="w"&gt; &lt;/span&gt;early&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;the&lt;span class="w"&gt; &lt;/span&gt;config&lt;span class="w"&gt; &lt;/span&gt;as
&lt;span class="w"&gt;   &lt;/span&gt;possible.

&lt;span class="m"&gt;3&lt;/span&gt;.&lt;span class="w"&gt; &lt;/span&gt;New&lt;span class="w"&gt; &lt;/span&gt;Org&lt;span class="w"&gt; &lt;/span&gt;version&lt;span class="w"&gt; &lt;/span&gt;is&lt;span class="w"&gt; &lt;/span&gt;loaded&lt;span class="w"&gt; &lt;/span&gt;using&lt;span class="w"&gt; &lt;/span&gt;straight.el&lt;span class="w"&gt; &lt;/span&gt;package&lt;span class="w"&gt; &lt;/span&gt;manager&lt;span class="w"&gt; &lt;/span&gt;and
&lt;span class="w"&gt;   &lt;/span&gt;other&lt;span class="w"&gt; &lt;/span&gt;package&lt;span class="w"&gt; &lt;/span&gt;depending&lt;span class="w"&gt; &lt;/span&gt;on&lt;span class="w"&gt; &lt;/span&gt;Org&lt;span class="w"&gt; &lt;/span&gt;is&lt;span class="w"&gt; &lt;/span&gt;loaded&lt;span class="w"&gt; &lt;/span&gt;before&lt;span class="w"&gt; &lt;/span&gt;straight&lt;span class="w"&gt; &lt;/span&gt;triggers
&lt;span class="w"&gt;   &lt;/span&gt;loading&lt;span class="w"&gt; &lt;/span&gt;of&lt;span class="w"&gt; &lt;/span&gt;the&lt;span class="w"&gt; &lt;/span&gt;newer&lt;span class="w"&gt; &lt;/span&gt;Org&lt;span class="w"&gt; &lt;/span&gt;version.

&lt;span class="w"&gt;   &lt;/span&gt;It&lt;span class="w"&gt; &lt;/span&gt;is&lt;span class="w"&gt; &lt;/span&gt;recommended&lt;span class="w"&gt; &lt;/span&gt;to&lt;span class="w"&gt; &lt;/span&gt;put

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;straight-use-package&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;org&lt;span class="o"&gt;)&lt;/span&gt;

&lt;span class="w"&gt;   &lt;/span&gt;early&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;the&lt;span class="w"&gt; &lt;/span&gt;config.&lt;span class="w"&gt;  &lt;/span&gt;Ideally,&lt;span class="w"&gt; &lt;/span&gt;right&lt;span class="w"&gt; &lt;/span&gt;after&lt;span class="w"&gt; &lt;/span&gt;the&lt;span class="w"&gt; &lt;/span&gt;straight.el
&lt;span class="w"&gt;   &lt;/span&gt;bootstrap.&lt;span class="w"&gt;  &lt;/span&gt;Moving&lt;span class="w"&gt; &lt;/span&gt;‘use-package’&lt;span class="w"&gt; &lt;/span&gt;:straight&lt;span class="w"&gt; &lt;/span&gt;declaration&lt;span class="w"&gt; &lt;/span&gt;may&lt;span class="w"&gt; &lt;/span&gt;not&lt;span class="w"&gt; &lt;/span&gt;be
&lt;span class="w"&gt;   &lt;/span&gt;sufficient&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;the&lt;span class="w"&gt; &lt;/span&gt;corresponding&lt;span class="w"&gt; &lt;/span&gt;‘use-package’&lt;span class="w"&gt; &lt;/span&gt;statement&lt;span class="w"&gt; &lt;/span&gt;is
&lt;span class="w"&gt;   &lt;/span&gt;deferring&lt;span class="w"&gt; &lt;/span&gt;the&lt;span class="w"&gt; &lt;/span&gt;loading.

&lt;span class="m"&gt;4&lt;/span&gt;.&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;Org&lt;span class="w"&gt; &lt;/span&gt;version&lt;span class="w"&gt; &lt;/span&gt;is&lt;span class="w"&gt; &lt;/span&gt;synchronized&lt;span class="w"&gt; &lt;/span&gt;with&lt;span class="w"&gt; &lt;/span&gt;Emacs&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;and
&lt;span class="w"&gt;   &lt;/span&gt;stale&lt;span class="w"&gt; &lt;/span&gt;.elc&lt;span class="w"&gt; &lt;/span&gt;files&lt;span class="w"&gt; &lt;/span&gt;are&lt;span class="w"&gt; &lt;/span&gt;still&lt;span class="w"&gt; &lt;/span&gt;left&lt;span class="w"&gt; &lt;/span&gt;from&lt;span class="w"&gt; &lt;/span&gt;the&lt;span class="w"&gt; &lt;/span&gt;previous&lt;span class="w"&gt; &lt;/span&gt;build.

&lt;span class="w"&gt;   &lt;/span&gt;It&lt;span class="w"&gt; &lt;/span&gt;is&lt;span class="w"&gt; &lt;/span&gt;recommended&lt;span class="w"&gt; &lt;/span&gt;to&lt;span class="w"&gt; &lt;/span&gt;remove&lt;span class="w"&gt; &lt;/span&gt;.elc&lt;span class="w"&gt; &lt;/span&gt;files&lt;span class="w"&gt; &lt;/span&gt;from&lt;span class="w"&gt; &lt;/span&gt;lisp/org&lt;span class="w"&gt; &lt;/span&gt;directory&lt;span class="w"&gt; &lt;/span&gt;and
&lt;span class="w"&gt;   &lt;/span&gt;re-compile.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;In my case, none of these fixes resolved my issue but I discovered
that there is a package cache stored in the &lt;code&gt;~/.emacs.d/elncache&lt;/code&gt;
directory.&lt;/p&gt;
&lt;p&gt;This 'elncache' directory stores natively compiled .eln files for
Emacs packages with sub-directories for each Emacs version.&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;ls&lt;span class="w"&gt; &lt;/span&gt;~/.emacs.d/eln-cache/
&lt;span class="m"&gt;30&lt;/span&gt;.2-6a8b22b2
&lt;span class="m"&gt;31&lt;/span&gt;.0.50-be59b212
$&lt;span class="w"&gt; &lt;/span&gt;ls&lt;span class="w"&gt; &lt;/span&gt;-1&lt;span class="w"&gt; &lt;/span&gt;~/.emacs.d/eln-cache/31.0.50-be59b212/
autorevert-841d6890-e5e85ba9.eln
benchmark-0e5ff0c6-b45151e2.eln
blogmore-bd298bd5-140db3f8.eln
bookmark-8667481e-0391040a.eln
browse-url-87f72988-d18440ad.eln
&amp;lt;snip&amp;gt;
org-capture-31aeb3cb-5a0ab108.eln
org-compat-8f643782-38135399.eln
org-d208de9c-51cfc11b.eln
org-faces-fdfdb79f-6e1f5bdc.eln
org-footnote-a50a8027-86895802.eln
org-id-b4e96473-012fc1e0.eln
org-indent-91cb060a-1219f44c.eln
org-keys-d9945960-5b58cda5.eln
org-roam-56f7ff31-fcc8f708.eln
&amp;lt;snip&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;You can either remove all files or remove individual 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;rm&lt;span class="w"&gt; &lt;/span&gt;-fr&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;/.emacs.d/eln-cache
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The eln cache is rebuilt on the next Emacs startup and this fix
silences the irritating message on startup.&lt;/p&gt;</description>
      <guid isPermaLink="false">https://www.yakshaving.co.uk/posts/emacs-31-orgmode-version-mismatch/</guid>
      <category>Emacs</category>
      <category>Orgmode</category>
      <pubDate>Wed, 08 Apr 2026 10:49:23 +0100</pubDate>
    </item>
    <item>
      <title>from GitHub to Codeberg</title>
      <link>https://www.yakshaving.co.uk/posts/from-github-to-codeberg/</link>
      <description>&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;</description>
      <guid isPermaLink="false">https://www.yakshaving.co.uk/posts/from-github-to-codeberg/</guid>
      <category>blogging</category>
      <category>GitHub</category>
      <category>Codeberg</category>
      <category>Hugo</category>
      <pubDate>Mon, 30 Mar 2026 12:23:09 +0100</pubDate>
    </item>
    <item>
      <title>in praise of BlogMore</title>
      <link>https://www.yakshaving.co.uk/posts/in-praise-blogmore/</link>
      <description>&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;</description>
      <guid isPermaLink="false">https://www.yakshaving.co.uk/posts/in-praise-blogmore/</guid>
      <category>blogging</category>
      <category>BlogMore</category>
      <pubDate>Fri, 27 Mar 2026 13:57:47 +0000</pubDate>
    </item>
    <item>
      <title>reflections on Hugo, GitHub and Netlify</title>
      <link>https://www.yakshaving.co.uk/posts/reflections-hugo-github-netlify/</link>
      <description>&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;</description>
      <guid isPermaLink="false">https://www.yakshaving.co.uk/posts/reflections-hugo-github-netlify/</guid>
      <category>blogging</category>
      <category>Emacs</category>
      <category>Hugo</category>
      <category>GitHub</category>
      <category>Netlify</category>
      <pubDate>Thu, 26 Mar 2026 15:29:24 +0000</pubDate>
    </item>
    <item>
      <title>Dovecot 2.4.2 upgrade</title>
      <link>https://www.yakshaving.co.uk/posts/dovecot-242-upgrade/</link>
      <description>&lt;p&gt;&lt;a href="https://dovecot.org/" rel="noopener noreferrer" target="_blank"&gt;Dovecot&lt;/a&gt; recently &lt;a href="https://dovecot.org/mailman3/archives/list/dovecot@dovecot.org/thread/XTMMPVQ3QKQMYDZ3CZZCXPNHN7OXKS3L/" rel="noopener noreferrer" target="_blank"&gt;released&lt;/a&gt; version 2.4.2 which required some
&lt;a href="https://doc.dovecot.org/2.4.0/installation/upgrade/2.3-to-2.4.html" rel="noopener noreferrer" target="_blank"&gt;changes&lt;/a&gt; to the configuration file (from version 2.3.x).&lt;/p&gt;
&lt;p&gt;I use Dovecot as a personal, local IMAP server which pulls from the
corporate Outlook server so I can maintain a local archive not subject
to any quota constraints.&lt;/p&gt;
&lt;p&gt;As I use Arch Linux and mindlessly update weekly, I was puzzled when
Thunderbird suddenly stopped working.&lt;/p&gt;
&lt;p&gt;My Dovecot server is local for me only, insecure and hence my
configuration file is relatively simple.&lt;/p&gt;
&lt;p&gt;Here is my modified Dovecot configuration for 2.4.2.&lt;/p&gt;
&lt;div class="highlight" data-lang="text"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;dovecot_config_version = 2.4.2
dovecot_storage_version = 2.4.2

mail_driver = maildir
mail_path = ~/Maildir
mailbox_list_layout = fs
protocols = imap
listen = 127.0.0.1
auth_allow_cleartext = yes
auth_mechanisms = plain login
userdb passwd {
   driver = passwd
}
passdb pam {
    driver = pam
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
      <guid isPermaLink="false">https://www.yakshaving.co.uk/posts/dovecot-242-upgrade/</guid>
      <category>software</category>
      <category>Dovecot</category>
      <pubDate>Mon, 03 Nov 2025 12:45:07 +0000</pubDate>
    </item>
    <item>
      <title>fun with static site generators</title>
      <link>https://www.yakshaving.co.uk/posts/fun-with-static-site-generators/</link>
      <description>&lt;div class="toc"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#introduction"&gt;Introduction&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#test-environment"&gt;Test Environment&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#hardware"&gt;Hardware&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#test-data"&gt;Test Data&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#hugo"&gt;Hugo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#eleventy"&gt;Eleventy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#bssg"&gt;BSSG&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#zola"&gt;Zola&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#nikola"&gt;Nikola&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#pelican"&gt;Pelican&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#jekyll"&gt;Jekyll&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#resources"&gt;Useful SSG performance resources&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;Static site generators (&lt;a href="https://en.wikipedia.org/wiki/Static_site_generator" rel="noopener noreferrer" target="_blank"&gt;SSG&lt;/a&gt;'s) are often used for blogs. SSG's
typically process Markdown files into static HTML files. The use of
static HTML files (rather than dynamically generating the site using a
database) offers benefits for performance and security.&lt;/p&gt;
&lt;p&gt;I use Hugo for my blog and have used (or experimented with) the
following static site generators (SSG's).&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Hugo (Go)&lt;/li&gt;
&lt;li&gt;Eleventy (Javascript)&lt;/li&gt;
&lt;li&gt;BSSG (Bash)&lt;/li&gt;
&lt;li&gt;Zola (Rust)&lt;/li&gt;
&lt;li&gt;Nikola (Python)&lt;/li&gt;
&lt;li&gt;Pelican (Python)&lt;/li&gt;
&lt;li&gt;Jekyll (Ruby)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A throwaway post from &lt;a href="https://mastodon.neilzone.co.uk/@neil/" rel="noopener noreferrer" target="_blank"&gt;Neil Brown&lt;/a&gt; on Mastodon prompted me to
investigate the build performance of different static site generators
with a significant volume of posts (1,000).&lt;/p&gt;
&lt;p&gt;Neil reduced the build time for his Hugo &lt;a href="https://neilzone.co.uk/" rel="noopener noreferrer" target="_blank"&gt;blog&lt;/a&gt; simply by adding
more hardware resources. A decent strategy involving minimal effort
producing an immediate improvement.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;'I have upped the RAM in the VM running my Web server to a heady 1GB,
and added a second CPU core'.&lt;/p&gt;
&lt;p&gt;'That has halved the Hugo build time for my blog [from 4 minutes to 2
minutes]'.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This comment surprised me as I also use Hugo which builds my entire
blog, containing 1,000 pages, in less than two seconds on a 10 year
old desktop computer.&lt;/p&gt;
&lt;p&gt;Neil's blog is self-hosted and uses Hugo. A 'View Source' reveals the
version of Hugo in use. Neil is using v0.131.0 (released in August
2024).&lt;/p&gt;
&lt;div class="highlight" data-lang="HTML"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;meta&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;generator&amp;quot;&lt;/span&gt; &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Hugo 0.131.0&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The &lt;a href="https://github.com/gohugoio/hugo/releases" rel="noopener noreferrer" target="_blank"&gt;latest&lt;/a&gt; version of Hugo is 0.151.1 (released in October 2025).
However, Neil is using the Hugo version included in the Debian
(Trixie) repositories.&lt;/p&gt;
&lt;p&gt;Reviewing the 'Archives' page, Neil's blog contains 457 posts.&lt;/p&gt;
&lt;p&gt;Neil &lt;a href="https://neilzone.co.uk/2023/10/moving-from-html-to-hugo-for-a-static-site-blog/" rel="noopener noreferrer" target="_blank"&gt;moved&lt;/a&gt; his blog from &lt;a href="https://www.htmly.com/" rel="noopener noreferrer" target="_blank"&gt;HTMLy&lt;/a&gt; to Hugo in 2023 and was using
Hugo v.0.111.3 (from the Debian repos) back then and used the &lt;a href="https://github.com/LukasJoswiak/etch" rel="noopener noreferrer" target="_blank"&gt;Etch&lt;/a&gt;
theme.&lt;/p&gt;
&lt;p&gt;Looking at the Etch theme, it is clear Neil has stuck with this
attractive, minimal Hugo theme since then.&lt;/p&gt;
&lt;p&gt;Given the disparity between Neil's build time and mine, I thought it
would be fun to compare the performance of Hugo with different themes
as well as other popular static site generators.&lt;/p&gt;
&lt;h2 id="test-environment"&gt;Test Environment&lt;/h2&gt;
&lt;h3 id="hardware"&gt;Hardware&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Lenovo M900 Tower Desktop (SFF)&lt;/li&gt;
&lt;li&gt;CPU: Intel i7-6700 CPU @ 3.40GHz (4 cores, 8 threads)&lt;/li&gt;
&lt;li&gt;Memory: 48GB&lt;/li&gt;
&lt;li&gt;Disk: 1TB&lt;/li&gt;
&lt;li&gt;O/S: Linux 6.17.2&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="test-data"&gt;Test Data&lt;/h3&gt;
&lt;p&gt;I used my personal &lt;a href="https://www.yakshaving.co.uk/"&gt;blog&lt;/a&gt; as the data set for the performance
tests.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;1028 articles (Markdown)&lt;/li&gt;
&lt;li&gt;Content spanning twenty years (2005 to 2025)&lt;/li&gt;
&lt;li&gt;116 code blocks&lt;/li&gt;
&lt;li&gt;74 static images&lt;/li&gt;
&lt;li&gt;29 categories&lt;/li&gt;
&lt;li&gt;46 tags&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="hugo"&gt;Hugo&lt;/h2&gt;
&lt;p&gt;Hugo: &lt;a href="https://gohugo.io/" rel="noopener noreferrer" target="_blank"&gt;https://gohugo.io/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://gohugo.io/" rel="noopener noreferrer" target="_blank"&gt;Hugo&lt;/a&gt; is a popular static site generator written in &lt;a href="https://go.dev/" rel="noopener noreferrer" target="_blank"&gt;Go&lt;/a&gt; with a
reputation for speed and performance.&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;version
hugo&lt;span class="w"&gt; &lt;/span&gt;v0.151.1+extended+withdeploy&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;unknown
$&lt;span class="w"&gt; &lt;/span&gt;go&lt;span class="w"&gt; &lt;/span&gt;version
go&lt;span class="w"&gt; &lt;/span&gt;version&lt;span class="w"&gt; &lt;/span&gt;go1.25.3&lt;span class="w"&gt; &lt;/span&gt;X:nodwarf5&lt;span class="w"&gt; &lt;/span&gt;linux/amd64
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The tests ran the standard &lt;code&gt;hugo build&lt;/code&gt; command three times and took
the average elapsed time.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Theme&lt;/th&gt;
&lt;th&gt;Time (secs)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Ananke&lt;/td&gt;
&lt;td&gt;0.615&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PaperMod (Base)&lt;/td&gt;
&lt;td&gt;1.067&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PaperMod (Custom)&lt;/td&gt;
&lt;td&gt;1.633&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Etch (Base)&lt;/td&gt;
&lt;td&gt;1.911&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Etch (Related)&lt;/td&gt;
&lt;td&gt;1.958&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BearBlog&lt;/td&gt;
&lt;td&gt;0.425&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Simple&lt;/td&gt;
&lt;td&gt;0.377&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Beautiful Hugo&lt;/td&gt;
&lt;td&gt;1.541&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Most Hugo themes used the default, out of the box settings with no
customisation.&lt;/p&gt;
&lt;p&gt;The 'PaperMod (Custom)' test used my personal blog which includes
additional 'Archive', 'Categories', 'Posts' pages and search
functionality.&lt;/p&gt;
&lt;p&gt;The timings for 'Etch' surprised me as it is a relatively simple theme
that displays a list of all posts.&lt;/p&gt;
&lt;p&gt;I added support for up to 15 'Related Posts' using Neil's &lt;a href="https://neilzone.co.uk/2023/10/moving-from-html-to-hugo-for-a-static-site-blog/" rel="noopener noreferrer" target="_blank"&gt;code&lt;/a&gt; but
saw no noticeable increase in build time (which is less than two
seconds).&lt;/p&gt;
&lt;p&gt;Hugo supports 'Related Posts' functionality and the list of articles
is built during the build (regardless of whether it is used or not).&lt;/p&gt;
&lt;p&gt;Ananke: &lt;a href="https://github.com/theNewDynamic/gohugo-theme-ananke" rel="noopener noreferrer" target="_blank"&gt;https://github.com/theNewDynamic/gohugo-theme-ananke&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;PaperMod: &lt;a href="https://github.com/adityatelange/hugo-PaperMod" rel="noopener noreferrer" target="_blank"&gt;https://github.com/adityatelange/hugo-PaperMod&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Etch: &lt;a href="https://github.com/LukasJoswiak/etch" rel="noopener noreferrer" target="_blank"&gt;https://github.com/LukasJoswiak/etch&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;BearBlog: &lt;a href="https://github.com/janraasch/hugo-bearblog" rel="noopener noreferrer" target="_blank"&gt;https://github.com/janraasch/hugo-bearblog&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Simple: &lt;a href="https://github.com/maolonglong/hugo-simple/" rel="noopener noreferrer" target="_blank"&gt;https://github.com/maolonglong/hugo-simple/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Beautiful Hugo: &lt;a href="https://github.com/halogenica/beautifulhugo" rel="noopener noreferrer" target="_blank"&gt;https://github.com/halogenica/beautifulhugo&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Hugo provides useful diagnostics about potential &lt;a href="https://gohugo.io/troubleshooting/performance/" rel="noopener noreferrer" target="_blank"&gt;performance&lt;/a&gt;
bottlenecks.&lt;/p&gt;
&lt;p&gt;Here is the template metrics report for the Etch theme (with related
posts). There are three candidate templates that could be cached
(header, footer and posts).&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;--templateMetrics&lt;span class="w"&gt; &lt;/span&gt;--templateMetricsHints
Template&lt;span class="w"&gt; &lt;/span&gt;Metrics:
&lt;span class="w"&gt;     &lt;/span&gt;cumulative&lt;span class="w"&gt;       &lt;/span&gt;average&lt;span class="w"&gt;       &lt;/span&gt;maximum&lt;span class="w"&gt;      &lt;/span&gt;cache&lt;span class="w"&gt;  &lt;/span&gt;percent&lt;span class="w"&gt;  &lt;/span&gt;cached&lt;span class="w"&gt;  &lt;/span&gt;total
&lt;span class="w"&gt;       &lt;/span&gt;duration&lt;span class="w"&gt;      &lt;/span&gt;duration&lt;span class="w"&gt;      &lt;/span&gt;duration&lt;span class="w"&gt;  &lt;/span&gt;potential&lt;span class="w"&gt;   &lt;/span&gt;cached&lt;span class="w"&gt;   &lt;/span&gt;count&lt;span class="w"&gt;  &lt;/span&gt;count&lt;span class="w"&gt;  &lt;/span&gt;template
&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="w"&gt;  &lt;/span&gt;---------&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="w"&gt;  &lt;/span&gt;--------
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;.691672237s&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;53&lt;/span&gt;.833444ms&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;83&lt;/span&gt;.570806ms&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;&lt;span class="m"&gt;0&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;&lt;span class="m"&gt;50&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;rss.xml
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;.409607939s&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;.345045ms&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;11&lt;/span&gt;.568865ms&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;&lt;span class="m"&gt;0&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;&lt;span class="m"&gt;1048&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;single.html
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;322&lt;/span&gt;.542988ms&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="m"&gt;307&lt;/span&gt;.77µs&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;.927895ms&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="m"&gt;28&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;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;1048&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;_partials/related.html
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;126&lt;/span&gt;.863653ms&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="m"&gt;115&lt;/span&gt;.54µs&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;.183336ms&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="m"&gt;44&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;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;1098&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;_partials/head.html
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="m"&gt;81&lt;/span&gt;.827628ms&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;40&lt;/span&gt;.913814ms&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;41&lt;/span&gt;.042982ms&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="m"&gt;100&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;&lt;span class="m"&gt;0&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;_partials/posts.html
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="m"&gt;79&lt;/span&gt;.788949ms&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="m"&gt;25&lt;/span&gt;.193µs&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="m"&gt;363&lt;/span&gt;.218µs&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;&lt;span class="m"&gt;0&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;&lt;span class="m"&gt;3167&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;li.html
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="m"&gt;55&lt;/span&gt;.705094ms&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;.160522ms&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="m"&gt;7&lt;/span&gt;.457174ms&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;&lt;span class="m"&gt;0&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;&lt;span class="m"&gt;48&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;_default/taxonomy.html
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="m"&gt;44&lt;/span&gt;.028022ms&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;44&lt;/span&gt;.028022ms&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;44&lt;/span&gt;.028022ms&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;&lt;span class="m"&gt;0&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;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;index.html
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="m"&gt;43&lt;/span&gt;.649693ms&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;43&lt;/span&gt;.649693ms&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;43&lt;/span&gt;.649693ms&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;&lt;span class="m"&gt;0&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;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;list.html
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="m"&gt;32&lt;/span&gt;.992786ms&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;32&lt;/span&gt;.992786ms&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;32&lt;/span&gt;.992786ms&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;&lt;span class="m"&gt;0&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;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;sitemap.xml
&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="m"&gt;24&lt;/span&gt;.19536ms&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="m"&gt;22&lt;/span&gt;.035µs&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="m"&gt;948&lt;/span&gt;.957µs&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="m"&gt;100&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;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;1098&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;_partials/header.html
&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="m"&gt;7&lt;/span&gt;.410874ms&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="m"&gt;6&lt;/span&gt;.749µs&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="m"&gt;143&lt;/span&gt;.528µs&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="m"&gt;100&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;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;1098&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;_partials/footer.html
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="m"&gt;961&lt;/span&gt;.219µs&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="m"&gt;106&lt;/span&gt;.802µs&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="m"&gt;278&lt;/span&gt;.188µs&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;&lt;span class="m"&gt;0&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;&lt;span class="m"&gt;9&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;_shortcodes/figure.html
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="m"&gt;708&lt;/span&gt;.877µs&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="m"&gt;141&lt;/span&gt;.775µs&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="m"&gt;299&lt;/span&gt;.575µs&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;&lt;span class="m"&gt;0&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;&lt;span class="m"&gt;5&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;_markup/render-table.html.html
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="m"&gt;551&lt;/span&gt;.337µs&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="m"&gt;110&lt;/span&gt;.267µs&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="m"&gt;208&lt;/span&gt;.377µs&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;&lt;span class="m"&gt;0&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;&lt;span class="m"&gt;5&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;_markup/render-table.rss.xml
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="m"&gt;105&lt;/span&gt;.423µs&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="m"&gt;52&lt;/span&gt;.711µs&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="m"&gt;88&lt;/span&gt;.545µs&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;&lt;span class="m"&gt;0&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;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;alias.html
&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="m"&gt;15&lt;/span&gt;.147µs&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="m"&gt;15&lt;/span&gt;.147µs&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="m"&gt;15&lt;/span&gt;.147µs&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;&lt;span class="m"&gt;0&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;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;/css/dark.css
&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;.76µs&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;.76µs&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;.76µs&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;&lt;span class="m"&gt;0&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;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;404&lt;/span&gt;.html

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;2002&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;ms
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2 id="eleventy"&gt;Eleventy&lt;/h2&gt;
&lt;p&gt;Eleventy: &lt;a href="https://www.11ty.dev/" rel="noopener noreferrer" target="_blank"&gt;https://www.11ty.dev/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Eleventy is a popular SSG written in Javascript.&lt;/p&gt;
&lt;p&gt;Eleventy Base Blog (v9): &lt;a href="https://github.com/11ty/eleventy-base-blog" rel="noopener noreferrer" target="_blank"&gt;https://github.com/11ty/eleventy-base-blog&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The Eleventy Base Blog theme is minimal and not dissimilar in
appearance from the Hugo PaperMod theme.&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;node&lt;span class="w"&gt; &lt;/span&gt;--version
v20.19.5
$&lt;span class="w"&gt; &lt;/span&gt;npx&lt;span class="w"&gt; &lt;/span&gt;@11ty/eleventy&lt;span class="w"&gt; &lt;/span&gt;--version
&lt;span class="m"&gt;3&lt;/span&gt;.1.2
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Building the Eleventy blog. Eleventy doesn't have separate 'build' and
'serve' commands.&lt;/p&gt;
&lt;p&gt;The Eleventy build summary for my blog.&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;npx&lt;span class="w"&gt; &lt;/span&gt;@11ty/eleventy&lt;span class="w"&gt; &lt;/span&gt;--serve
&lt;span class="o"&gt;[&lt;/span&gt;11ty/eleventy-img&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;143&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;images&lt;span class="w"&gt; &lt;/span&gt;optimized&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;143&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;deferred&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;11ty&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Benchmark&lt;span class="w"&gt;   &lt;/span&gt;1664ms&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;11&lt;/span&gt;%&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;1052&lt;/span&gt;×&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;Configuration&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;@11ty/eleventy/html-transformer&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Transform
&lt;span class="o"&gt;[&lt;/span&gt;11ty&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Copied&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Wrote&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1043&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;files&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;14&lt;/span&gt;.53&lt;span class="w"&gt; &lt;/span&gt;seconds&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;13&lt;/span&gt;.9ms&lt;span class="w"&gt; &lt;/span&gt;each,&lt;span class="w"&gt; &lt;/span&gt;v3.1.2&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;11ty&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Server&lt;span class="w"&gt; &lt;/span&gt;at&lt;span class="w"&gt; &lt;/span&gt;http://localhost:8080/
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Eleventy supports &lt;a href="https://www.11ty.dev/docs/usage/incremental/" rel="noopener noreferrer" target="_blank"&gt;incremental&lt;/a&gt; builds using the &lt;code&gt;--incremental&lt;/code&gt;
parameter which only processes content modified since the last build.&lt;/p&gt;
&lt;p&gt;Initially, I saw no difference using &lt;code&gt;--incremental&lt;/code&gt; but the Eleventy
documentation suggested adding the &lt;code&gt;--ignore-initial&lt;/code&gt; option. This
reduced the build time significantly from 14 seconds to sub-second.&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;npx&lt;span class="w"&gt; &lt;/span&gt;@11ty/eleventy&lt;span class="w"&gt; &lt;/span&gt;--serve&lt;span class="w"&gt; &lt;/span&gt;--incremental&lt;span class="w"&gt; &lt;/span&gt;--ignore-initial
&lt;span class="o"&gt;[&lt;/span&gt;11ty&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Copied&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Wrote&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;files&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;0&lt;/span&gt;.77&lt;span class="w"&gt; &lt;/span&gt;seconds&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;v3.1.2&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;11ty&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Watching…
&lt;span class="c1"&gt;# Add a new post with tags&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;11ty/eleventy-img&lt;span class="o"&gt;]&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;images&lt;span class="w"&gt; &lt;/span&gt;optimized&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;deferred&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;11ty&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Wrote&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;32&lt;/span&gt;&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;skipped&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1012&lt;/span&gt;&lt;span class="o"&gt;)&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;&lt;span class="m"&gt;0&lt;/span&gt;.51&lt;span class="w"&gt; &lt;/span&gt;seconds&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;v3.1.2&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# Add more text to existing post&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;11ty/eleventy-img&lt;span class="o"&gt;]&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;images&lt;span class="w"&gt; &lt;/span&gt;optimized&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;deferred&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;11ty&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Wrote&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;32&lt;/span&gt;&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;skipped&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1012&lt;/span&gt;&lt;span class="o"&gt;)&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;&lt;span class="m"&gt;0&lt;/span&gt;.46&lt;span class="w"&gt; &lt;/span&gt;seconds&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;v3.1.2&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Summary of timings for Eleventy&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Theme&lt;/th&gt;
&lt;th&gt;Time (secs)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Eleventy (Full)&lt;/td&gt;
&lt;td&gt;14.42&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Eleventy (Incremental)&lt;/td&gt;
&lt;td&gt;0.46&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="bssg"&gt;BSSG&lt;/h2&gt;
&lt;p&gt;BSSG - &lt;a href="https://bssg.dragas.net/" rel="noopener noreferrer" target="_blank"&gt;https://bssg.dragas.net/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Bash Static Site Generator (BSSG) is an SSG created by &lt;a href="https://mastodon.bsd.cafe/@stefano" rel="noopener noreferrer" target="_blank"&gt;Stefano&lt;/a&gt;
Marinelli. BSSG is written in the Bash shell.&lt;/p&gt;
&lt;p&gt;BSSG is a relatively new SSG. The first public release of BSSG was in
March 2025 but there have been 14 subsequent &lt;a href="https://brew.bsd.cafe/stefano/BSSG/releases" rel="noopener noreferrer" target="_blank"&gt;releases&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;BSSG includes a broad range of &lt;a href="https://bssg.dragas.net/example/" rel="noopener noreferrer" target="_blank"&gt;themes&lt;/a&gt;, support for incremental
builds, parallel processing and a post article editor to manage
content.&lt;/p&gt;
&lt;p&gt;BSSG doesn't currently support 'Categories' so all existing
'Categories' were migrated to 'Tags'.&lt;/p&gt;
&lt;p&gt;It is possible this skewed the data set slightly and adversely
affected performance as it resulted in four tags having a lot of
associated posts. BSSG can list all tags with article counts using the
'bssg.sh tags' command.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tag&lt;/th&gt;
&lt;th&gt;Count&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;blogging&lt;/td&gt;
&lt;td&gt;236&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;football&lt;/td&gt;
&lt;td&gt;112&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;software&lt;/td&gt;
&lt;td&gt;122&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;UK&lt;/td&gt;
&lt;td&gt;260&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&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;bssg.sh
BSSG&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;Bash&lt;span class="w"&gt; &lt;/span&gt;Static&lt;span class="w"&gt; &lt;/span&gt;Site&lt;span class="w"&gt; &lt;/span&gt;Generator&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;v0.32&lt;span class="o"&gt;)&lt;/span&gt;
$&lt;span class="w"&gt; &lt;/span&gt;bash&lt;span class="w"&gt; &lt;/span&gt;--version
GNU&lt;span class="w"&gt; &lt;/span&gt;bash,&lt;span class="w"&gt; &lt;/span&gt;version&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt;.3.3&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;-release&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;x86_64-pc-linux-gnu&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Initial BSSG build from scratch.&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;bssg.sh&lt;span class="w"&gt; &lt;/span&gt;build
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;BBSG uses incremental builds and only rebuilds what has changed.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Theme&lt;/th&gt;
&lt;th&gt;Time (secs)&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Default&lt;/td&gt;
&lt;td&gt;2,389&lt;/td&gt;
&lt;td&gt;Full (2,389 secs = 39 mins)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Default&lt;/td&gt;
&lt;td&gt;23&lt;/td&gt;
&lt;td&gt;Unchanged.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Default&lt;/td&gt;
&lt;td&gt;61&lt;/td&gt;
&lt;td&gt;Add new post (no tags).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Default&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;Add new post (existing tag).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Default&lt;/td&gt;
&lt;td&gt;62&lt;/td&gt;
&lt;td&gt;Modify existing post.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Default&lt;/td&gt;
&lt;td&gt;107&lt;/td&gt;
&lt;td&gt;Add existing tag to existing post.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Default&lt;/td&gt;
&lt;td&gt;83&lt;/td&gt;
&lt;td&gt;Add new tag to existing post.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;By default, BSSG generates related posts based on the 'Tags' in each
post. The default number of related posts displayed is 3. If this
feature is disabled, then the build time is reduced significantly.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Theme&lt;/th&gt;
&lt;th&gt;Time (secs)&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Default&lt;/td&gt;
&lt;td&gt;169&lt;/td&gt;
&lt;td&gt;Full&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Default&lt;/td&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;Unchanged.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Default&lt;/td&gt;
&lt;td&gt;63&lt;/td&gt;
&lt;td&gt;Add new post (no tags).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Default&lt;/td&gt;
&lt;td&gt;62&lt;/td&gt;
&lt;td&gt;Add new post (existing tag).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Default&lt;/td&gt;
&lt;td&gt;64&lt;/td&gt;
&lt;td&gt;Modify existing post.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Default&lt;/td&gt;
&lt;td&gt;62&lt;/td&gt;
&lt;td&gt;Add existing tag to existing post.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Default&lt;/td&gt;
&lt;td&gt;70&lt;/td&gt;
&lt;td&gt;Add new tag to existing post.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;BSSG also supports parallel processing using the GNU &lt;a href="https://www.gnu.org/software/parallel/" rel="noopener noreferrer" target="_blank"&gt;parallel&lt;/a&gt;
shell tool. The GNU parallel package is very lightweight (&amp;lt; 1MB).&lt;/p&gt;
&lt;p&gt;BSSG detects the presence of GNU parallel automatically and spawns N
processes in parallel where N is the number of threads available.&lt;/p&gt;
&lt;div class="highlight" data-lang="bash"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;Checked&lt;span class="w"&gt; &lt;/span&gt;dependencies.&lt;span class="w"&gt; &lt;/span&gt;Parallel&lt;span class="w"&gt; &lt;/span&gt;available:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;
GNU&lt;span class="w"&gt; &lt;/span&gt;parallel&lt;span class="w"&gt; &lt;/span&gt;found!&lt;span class="w"&gt; &lt;/span&gt;Using&lt;span class="w"&gt; &lt;/span&gt;parallel&lt;span class="w"&gt; &lt;/span&gt;processing.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;On my computer, this resulted in BSSG spawning 8 Bash processes which
may have been too many as the load average climbed to between 10
and 15.&lt;/p&gt;
&lt;p&gt;However, the elapsed time for the initial build of a blog with 1,000
posts reduces from 39 minutes to under 10 minutes.&lt;/p&gt;
&lt;p&gt;Before you exclaim '10 minutes when Hugo and Eleventy are sub-second',
think about how often you completely rebuild every single post on your
blog. Not very often.&lt;/p&gt;
&lt;p&gt;The typical use case is writing a new blog post. There may be
occasions when you change theme or spend two weeks consolidating all
your tags and categories but, hopefully, those should be relatively
rare.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Theme&lt;/th&gt;
&lt;th&gt;Time (secs)&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Default&lt;/td&gt;
&lt;td&gt;559&lt;/td&gt;
&lt;td&gt;Full. Parallel.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Default&lt;/td&gt;
&lt;td&gt;32&lt;/td&gt;
&lt;td&gt;Unchanged.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Default&lt;/td&gt;
&lt;td&gt;60&lt;/td&gt;
&lt;td&gt;Add new post (no tags).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Default&lt;/td&gt;
&lt;td&gt;75&lt;/td&gt;
&lt;td&gt;Add new post (existing tag).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Default&lt;/td&gt;
&lt;td&gt;67&lt;/td&gt;
&lt;td&gt;Modify existing post.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Default&lt;/td&gt;
&lt;td&gt;73&lt;/td&gt;
&lt;td&gt;Add existing tag to existing post.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Default&lt;/td&gt;
&lt;td&gt;67&lt;/td&gt;
&lt;td&gt;Add new tag to existing post.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Removing 'Related Posts' and running in parallel reduces the time for
a full build to 1 minute and an incremental build to 45 seconds.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Theme&lt;/th&gt;
&lt;th&gt;Time (secs)&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Default&lt;/td&gt;
&lt;td&gt;59&lt;/td&gt;
&lt;td&gt;Full. Parallel.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Default&lt;/td&gt;
&lt;td&gt;30&lt;/td&gt;
&lt;td&gt;Unchanged.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Default&lt;/td&gt;
&lt;td&gt;44&lt;/td&gt;
&lt;td&gt;Add new post (no tags).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Default&lt;/td&gt;
&lt;td&gt;44&lt;/td&gt;
&lt;td&gt;Add new post (existing tag).&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;One big advantage of BSSG is the ability to quickly and easily change
&lt;a href="https://bssg.dragas.net/example/" rel="noopener noreferrer" target="_blank"&gt;themes&lt;/a&gt;. You simply select a theme, modify the THEME entry in the
configuration file and it just works. This is because BSSG themes use
a single CSS style sheet. This may limit the functionality available
but it just works.&lt;/p&gt;
&lt;h2 id="zola"&gt;Zola&lt;/h2&gt;
&lt;p&gt;Zola - &lt;a href="https://www.getzola.org/" rel="noopener noreferrer" target="_blank"&gt;https://www.getzola.org/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Zola is a SSG written in &lt;a href="https://rust-lang.org/" rel="noopener noreferrer" target="_blank"&gt;Rust&lt;/a&gt;. Like Hugo, Zola is a single
executable. Like Hugo, Zola is fast. Like Hugo, changing themes in
Zola is not simply a case of modifying the THEME entry in
'config.toml'. Each theme seems to have additional, custom
configuration options that need to be set.&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;zola&lt;span class="w"&gt; &lt;/span&gt;--version
zola&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.21.0
$&lt;span class="w"&gt; &lt;/span&gt;rustc&lt;span class="w"&gt; &lt;/span&gt;--version
rustc&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;.90.0&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;1159e78c4&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2025&lt;/span&gt;-09-14&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;Arch&lt;span class="w"&gt; &lt;/span&gt;Linux&lt;span class="w"&gt; &lt;/span&gt;rust&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;:1.90.0-3&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Serene Theme - &lt;a href="https://github.com/isunjn/serene" rel="noopener noreferrer" target="_blank"&gt;https://github.com/isunjn/serene&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Building the blog&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;zola&lt;span class="w"&gt; &lt;/span&gt;build
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The Zola build time for 1,000 posts was so lightning fast, I had to
check it actually worked !&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;zola&lt;span class="w"&gt; &lt;/span&gt;build
Building&lt;span class="w"&gt; &lt;/span&gt;site...
Checking&lt;span class="w"&gt; &lt;/span&gt;all&lt;span class="w"&gt; &lt;/span&gt;internal&lt;span class="w"&gt; &lt;/span&gt;links&lt;span class="w"&gt; &lt;/span&gt;with&lt;span class="w"&gt; &lt;/span&gt;anchors.
&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;Successfully&lt;span class="w"&gt; &lt;/span&gt;checked&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;internal&lt;span class="w"&gt; &lt;/span&gt;link&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;with&lt;span class="w"&gt; &lt;/span&gt;anchors.
-&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;Creating&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1030&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;pages&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;orphan&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;and&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;sections
Done&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;351ms.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Like Hugo, Zola also has a live development server that watches for
changes to the site in real-time. This is also fast.&lt;/p&gt;
&lt;div class="highlight" data-lang="bash"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;Building&lt;span class="w"&gt; &lt;/span&gt;site...
Checking&lt;span class="w"&gt; &lt;/span&gt;all&lt;span class="w"&gt; &lt;/span&gt;internal&lt;span class="w"&gt; &lt;/span&gt;links&lt;span class="w"&gt; &lt;/span&gt;with&lt;span class="w"&gt; &lt;/span&gt;anchors.
&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;Successfully&lt;span class="w"&gt; &lt;/span&gt;checked&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;internal&lt;span class="w"&gt; &lt;/span&gt;link&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;with&lt;span class="w"&gt; &lt;/span&gt;anchors.
-&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;Creating&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1031&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;pages&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;orphan&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;and&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;sections
Done&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;309ms.

Listening&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;zola-blog/&lt;span class="o"&gt;{&lt;/span&gt;config.toml,content,sass,static,templates,themes&lt;span class="o"&gt;}&lt;/span&gt;

Web&lt;span class="w"&gt; &lt;/span&gt;server&lt;span class="w"&gt; &lt;/span&gt;is&lt;span class="w"&gt; &lt;/span&gt;available&lt;span class="w"&gt; &lt;/span&gt;at&lt;span class="w"&gt; &lt;/span&gt;http://127.0.0.1:1111&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;bound&lt;span class="w"&gt; &lt;/span&gt;to&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;127&lt;/span&gt;.0.0.1:1111&lt;span class="o"&gt;)&lt;/span&gt;

Change&lt;span class="w"&gt; &lt;/span&gt;detected&lt;span class="w"&gt; &lt;/span&gt;@&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2025&lt;/span&gt;-10-14&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;13&lt;/span&gt;:17:09
-&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;Content&lt;span class="w"&gt; &lt;/span&gt;changed&lt;span class="w"&gt; &lt;/span&gt;zola-blog/content/posts/zola-new-post.md
Checking&lt;span class="w"&gt; &lt;/span&gt;all&lt;span class="w"&gt; &lt;/span&gt;internal&lt;span class="w"&gt; &lt;/span&gt;links&lt;span class="w"&gt; &lt;/span&gt;with&lt;span class="w"&gt; &lt;/span&gt;anchors.
&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;Successfully&lt;span class="w"&gt; &lt;/span&gt;checked&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;internal&lt;span class="w"&gt; &lt;/span&gt;link&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;with&lt;span class="w"&gt; &lt;/span&gt;anchors.
-&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;Creating&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1031&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;pages&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;orphan&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;and&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;sections
Done&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;283ms.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Finally I experimented with a couple more themes.&lt;/p&gt;
&lt;p&gt;Linkita - &lt;a href="https://www.getzola.org/themes/linkita/" rel="noopener noreferrer" target="_blank"&gt;https://www.getzola.org/themes/linkita/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;BearBlog - &lt;a href="https://www.getzola.org/themes/bearblog/" rel="noopener noreferrer" target="_blank"&gt;https://www.getzola.org/themes/bearblog/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;PaperMod - &lt;a href="https://www.getzola.org/themes/papermod/" rel="noopener noreferrer" target="_blank"&gt;https://www.getzola.org/themes/papermod/&lt;/a&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Theme&lt;/th&gt;
&lt;th&gt;Time (secs)&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Serene&lt;/td&gt;
&lt;td&gt;0.35&lt;/td&gt;
&lt;td&gt;Full&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Serene&lt;/td&gt;
&lt;td&gt;0.28&lt;/td&gt;
&lt;td&gt;Incremental&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Linkita&lt;/td&gt;
&lt;td&gt;1.77&lt;/td&gt;
&lt;td&gt;Full&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Linkita&lt;/td&gt;
&lt;td&gt;1.70&lt;/td&gt;
&lt;td&gt;Incremental&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bearblog&lt;/td&gt;
&lt;td&gt;0.26&lt;/td&gt;
&lt;td&gt;Full&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bearblog&lt;/td&gt;
&lt;td&gt;0.25&lt;/td&gt;
&lt;td&gt;Incremental&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PaperMod&lt;/td&gt;
&lt;td&gt;20.70&lt;/td&gt;
&lt;td&gt;Full&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PaperMod&lt;/td&gt;
&lt;td&gt;20.51&lt;/td&gt;
&lt;td&gt;Incremental&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="nikola"&gt;Nikola&lt;/h2&gt;
&lt;p&gt;Nikola is a long established SSG (first released in 2012) written in
Python.&lt;/p&gt;
&lt;p&gt;Nikola - &lt;a href="https://getnikola.com/blog/" rel="noopener noreferrer" target="_blank"&gt;https://getnikola.com/blog/&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;python&lt;span class="w"&gt; &lt;/span&gt;-V
Python&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;.13.7
$&lt;span class="w"&gt; &lt;/span&gt;nikola&lt;span class="w"&gt; &lt;/span&gt;version
Nikola&lt;span class="w"&gt; &lt;/span&gt;v8.3.3
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Useful Nikola commands.&lt;/p&gt;
&lt;div class="highlight" data-lang="bash"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;nikola&lt;span class="w"&gt; &lt;/span&gt;build
nikola&lt;span class="w"&gt; &lt;/span&gt;serve&lt;span class="w"&gt; &lt;/span&gt;--browser
nikola&lt;span class="w"&gt; &lt;/span&gt;auto
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;To force a full rebuild in Nikola, you need to remove the 'output'
directory.&lt;/p&gt;
&lt;p&gt;You also need to use the Linux time command to get the elapsed timings
for the &lt;code&gt;nikola build&lt;/code&gt; command.&lt;/p&gt;
&lt;p&gt;Nikola includes the wonderful blog.txt theme (originally written for
Wordpress by Scott Wallick) so kudos to Nikola's author &lt;a href="https://ralsina.me/" rel="noopener noreferrer" target="_blank"&gt;Roberto
Alsina&lt;/a&gt; for that.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Theme&lt;/th&gt;
&lt;th&gt;Time (secs)&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Default&lt;/td&gt;
&lt;td&gt;44.86&lt;/td&gt;
&lt;td&gt;Full&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Default&lt;/td&gt;
&lt;td&gt;4.72&lt;/td&gt;
&lt;td&gt;Unchanged&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Default&lt;/td&gt;
&lt;td&gt;5.86&lt;/td&gt;
&lt;td&gt;Add new post (no tags).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Default&lt;/td&gt;
&lt;td&gt;5.75&lt;/td&gt;
&lt;td&gt;Add new post (existing tag).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Default&lt;/td&gt;
&lt;td&gt;5.98&lt;/td&gt;
&lt;td&gt;Modify existing post.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Default&lt;/td&gt;
&lt;td&gt;5.87&lt;/td&gt;
&lt;td&gt;Add existing tag to existing post.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Default&lt;/td&gt;
&lt;td&gt;5.70&lt;/td&gt;
&lt;td&gt;Add new tag to existing post.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;blogtxt&lt;/td&gt;
&lt;td&gt;47.34&lt;/td&gt;
&lt;td&gt;Full&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;blogtxt&lt;/td&gt;
&lt;td&gt;4.93&lt;/td&gt;
&lt;td&gt;Unchanged&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;blogtxt&lt;/td&gt;
&lt;td&gt;4.78&lt;/td&gt;
&lt;td&gt;Add new post (no tags).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;blogtxt&lt;/td&gt;
&lt;td&gt;4.82&lt;/td&gt;
&lt;td&gt;Add new post (existing tag).&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="pelican"&gt;Pelican&lt;/h2&gt;
&lt;p&gt;Pelican - &lt;a href="https://getpelican.com/" rel="noopener noreferrer" target="_blank"&gt;https://getpelican.com/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Create a dedicated &lt;a href="https://chriswarrick.com/blog/2018/09/04/python-virtual-environments/" rel="noopener noreferrer" target="_blank"&gt;virtual
environment&lt;/a&gt;
for Pelican.&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;workon&lt;span class="w"&gt; &lt;/span&gt;Pelican
&lt;span class="o"&gt;(&lt;/span&gt;Pelican&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;$&lt;span class="w"&gt; &lt;/span&gt;python&lt;span class="w"&gt; &lt;/span&gt;-V
Python&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;.13.7
&lt;span class="o"&gt;(&lt;/span&gt;Pelican&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;$&lt;span class="w"&gt; &lt;/span&gt;pelican&lt;span class="w"&gt; &lt;/span&gt;--version
&lt;span class="m"&gt;4&lt;/span&gt;.11.0
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Pelican doesn't have separate build and server commands. You simply
run the development server which builds the site and watches for any
changes.&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="o"&gt;(&lt;/span&gt;Pelican&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;$&lt;span class="w"&gt; &lt;/span&gt;pelican&lt;span class="w"&gt; &lt;/span&gt;--autoreload&lt;span class="w"&gt; &lt;/span&gt;--listen
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://127.0.0.1:8000&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;Tap&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
Done:&lt;span class="w"&gt; &lt;/span&gt;Processed&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1034&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;articles,&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;drafts,&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;hidden&lt;span class="w"&gt; &lt;/span&gt;articles,&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;pages,
&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;hidden&lt;span class="w"&gt; &lt;/span&gt;pages&lt;span class="w"&gt; &lt;/span&gt;and&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;draft&lt;span class="w"&gt; &lt;/span&gt;pages&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;3&lt;/span&gt;.65&lt;span class="w"&gt; &lt;/span&gt;seconds.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Add a new post (incremental build).&lt;/p&gt;
&lt;div class="highlight" data-lang="bash"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;-&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;Modified:&lt;span class="w"&gt; &lt;/span&gt;pelican-blog/content/my-pelican-post.md.
re-generating...
Done:&lt;span class="w"&gt; &lt;/span&gt;Processed&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1035&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;articles,&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;drafts,&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;hidden&lt;span class="w"&gt; &lt;/span&gt;articles,&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;pages,
&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;hidden&lt;span class="w"&gt; &lt;/span&gt;pages&lt;span class="w"&gt; &lt;/span&gt;and&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;draft&lt;span class="w"&gt; &lt;/span&gt;pages&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;2&lt;/span&gt;.96&lt;span class="w"&gt; &lt;/span&gt;seconds.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Summary&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Theme&lt;/th&gt;
&lt;th&gt;Time (secs)&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Default&lt;/td&gt;
&lt;td&gt;3.65&lt;/td&gt;
&lt;td&gt;Full&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Default&lt;/td&gt;
&lt;td&gt;2.96&lt;/td&gt;
&lt;td&gt;Incremental&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="jekyll"&gt;Jekyll&lt;/h2&gt;
&lt;p&gt;Ruby based blog.&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;ruby&lt;span class="w"&gt; &lt;/span&gt;-v
ruby&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;.4.6&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;2025&lt;/span&gt;-09-16&lt;span class="w"&gt; &lt;/span&gt;revision&lt;span class="w"&gt; &lt;/span&gt;dbd83256b1&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;+PRISM&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;x86_64-linux&lt;span class="o"&gt;]&lt;/span&gt;
$&lt;span class="w"&gt; &lt;/span&gt;bundle&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;exec&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;jekyll&lt;span class="w"&gt; &lt;/span&gt;-v
jekyll&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;4&lt;/span&gt;.4.1
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Jekyll base theme (minima) - &lt;a href="https://github.com/jekyll/minima" rel="noopener noreferrer" target="_blank"&gt;https://github.com/jekyll/minima&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Build the blog&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;bundle&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;exec&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;jekyll&lt;span class="w"&gt; &lt;/span&gt;serve
&amp;lt;snip&amp;gt;
Run&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;verbose&lt;span class="w"&gt; &lt;/span&gt;mode&lt;span class="w"&gt; &lt;/span&gt;to&lt;span class="w"&gt; &lt;/span&gt;see&lt;span class="w"&gt; &lt;/span&gt;all&lt;span class="w"&gt; &lt;/span&gt;warnings.
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="k"&gt;done&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;&lt;span class="m"&gt;2&lt;/span&gt;.788&lt;span class="w"&gt; &lt;/span&gt;seconds.
Auto-regeneration:&lt;span class="w"&gt; &lt;/span&gt;enabled&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;/home/andy/devel/my-jekyll-blog&amp;#39;&lt;/span&gt;
Server&lt;span class="w"&gt; &lt;/span&gt;address:&lt;span class="w"&gt; &lt;/span&gt;http://127.0.0.1:4000/
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Live reload uses a different command and port&lt;/p&gt;
&lt;div class="highlight" data-lang="bash"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;Run&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;verbose&lt;span class="w"&gt; &lt;/span&gt;mode&lt;span class="w"&gt; &lt;/span&gt;to&lt;span class="w"&gt; &lt;/span&gt;see&lt;span class="w"&gt; &lt;/span&gt;all&lt;span class="w"&gt; &lt;/span&gt;warnings.
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="k"&gt;done&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;&lt;span class="m"&gt;4&lt;/span&gt;.7&lt;span class="w"&gt; &lt;/span&gt;seconds.
&lt;span class="w"&gt; &lt;/span&gt;Auto-regeneration:&lt;span class="w"&gt; &lt;/span&gt;enabled&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;devel/my-jekyll-blog&amp;#39;&lt;/span&gt;
LiveReload&lt;span class="w"&gt; &lt;/span&gt;address:&lt;span class="w"&gt; &lt;/span&gt;http://127.0.0.1:35729
&lt;span class="w"&gt;    &lt;/span&gt;Server&lt;span class="w"&gt; &lt;/span&gt;address:&lt;span class="w"&gt; &lt;/span&gt;http://127.0.0.1:4000/
&lt;span class="w"&gt;  &lt;/span&gt;Server&lt;span class="w"&gt; &lt;/span&gt;running...&lt;span class="w"&gt; &lt;/span&gt;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;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Jekyll also produces a lot of warnings (deprecation) that clutter up
the display. This is surprising (and irritating) for the latest
version of Jekyll and the standard, bundled theme.&lt;/p&gt;
&lt;p&gt;There is a '--quiet' option for 'jekyll build' but this doesn't appear
to silence the warnings.&lt;/p&gt;
&lt;p&gt;Attempting to access the live development server on port 35729 fails.
However, the live reload is actually available on port 4000.&lt;/p&gt;
&lt;div class="highlight" data-lang="bash"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;This&lt;span class="w"&gt; &lt;/span&gt;port&lt;span class="w"&gt; &lt;/span&gt;only&lt;span class="w"&gt; &lt;/span&gt;serves&lt;span class="w"&gt; &lt;/span&gt;livereload.js&lt;span class="w"&gt; &lt;/span&gt;over&lt;span class="w"&gt; &lt;/span&gt;HTTP.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Given Jekyll was first released back in 2008, Jekyll feels rather
neglected and outdated to me. Tags didn't work properly. All tags were
processed and listed but the click through from an individual article
as '404 - Not Found' error.&lt;/p&gt;
&lt;p&gt;Also Jekyll insists on blog posts following a naming convention
('yyyy-mm-dd-title.md').&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Theme&lt;/th&gt;
&lt;th&gt;Time (secs)&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Default&lt;/td&gt;
&lt;td&gt;5.091&lt;/td&gt;
&lt;td&gt;Full&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Default&lt;/td&gt;
&lt;td&gt;1.029&lt;/td&gt;
&lt;td&gt;Incremental&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Default&lt;/td&gt;
&lt;td&gt;8.561&lt;/td&gt;
&lt;td&gt;Live reload&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="resources"&gt;Useful SSG performance resources&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://www.zachleat.com/" rel="noopener noreferrer" target="_blank"&gt;Zach Leatherman&lt;/a&gt; (Eleventy lead developer)
performed some performance benchmarks (in 2022) which are a useful
benchmark comparing SSG's for pure Markdown conversion throughput for
large sites.&lt;/p&gt;
&lt;p&gt;However, Zach's tests don't include meta-data (tags, categories,
dates) so aren't necessarily representative of a real-life blog or
site.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.zachleat.com/web/build-benchmark/" rel="noopener noreferrer" target="_blank"&gt;https://www.zachleat.com/web/build-benchmark/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Generating representative test data is difficult but this Bash script
scrapes a random Wikipedia page and generates Markdown (including tags
and categories).&lt;/p&gt;
&lt;p&gt;&lt;a href="https://gist.github.com/jgreely/2338c72c825d2a93713e4f0fc0025985" rel="noopener noreferrer" target="_blank"&gt;https://gist.github.com/jgreely/2338c72c825d2a93713e4f0fc0025985&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Each SSG has its own format for front-matter. There are even two
different formats for front matter; &lt;a href="https://toml.io/en/" rel="noopener noreferrer" target="_blank"&gt;TOML&lt;/a&gt; and
&lt;a href="https://yaml.org/" rel="noopener noreferrer" target="_blank"&gt;YAML&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Hugo has a very useful built-in conversion function to convert the Hugo
front matter an all posts between the formats (including JSON).&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;convert&lt;span class="w"&gt; &lt;/span&gt;--help
Usage:
&lt;span class="w"&gt;  &lt;/span&gt;hugo&lt;span class="w"&gt; &lt;/span&gt;convert&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;command&lt;span class="o"&gt;]&lt;/span&gt;

Available&lt;span class="w"&gt; &lt;/span&gt;Commands:
&lt;span class="w"&gt;  &lt;/span&gt;toJSON&lt;span class="w"&gt;      &lt;/span&gt;Convert&lt;span class="w"&gt; &lt;/span&gt;front&lt;span class="w"&gt; &lt;/span&gt;matter&lt;span class="w"&gt; &lt;/span&gt;to&lt;span class="w"&gt; &lt;/span&gt;JSON
&lt;span class="w"&gt;  &lt;/span&gt;toTOML&lt;span class="w"&gt;      &lt;/span&gt;Convert&lt;span class="w"&gt; &lt;/span&gt;front&lt;span class="w"&gt; &lt;/span&gt;matter&lt;span class="w"&gt; &lt;/span&gt;to&lt;span class="w"&gt; &lt;/span&gt;TOML
&lt;span class="w"&gt;  &lt;/span&gt;toYAML&lt;span class="w"&gt;      &lt;/span&gt;Convert&lt;span class="w"&gt; &lt;/span&gt;front&lt;span class="w"&gt; &lt;/span&gt;matter&lt;span class="w"&gt; &lt;/span&gt;to&lt;span class="w"&gt; &lt;/span&gt;YAML
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
      <guid isPermaLink="false">https://www.yakshaving.co.uk/posts/fun-with-static-site-generators/</guid>
      <category>software</category>
      <category>Hugo</category>
      <category>11ty</category>
      <category>BSSG</category>
      <category>Zola</category>
      <category>Nikola</category>
      <category>Pelican</category>
      <category>Jekyll</category>
      <pubDate>Thu, 16 Oct 2025 09:46:10 +0100</pubDate>
    </item>
    <item>
      <title>CommonMark test</title>
      <link>https://www.yakshaving.co.uk/posts/commonmark_test/</link>
      <description>&lt;p&gt;This is the famous ‘Hello world’ program written in Python
in colour using Markdown.&lt;/p&gt;
&lt;div class="highlight" data-lang="Python"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="ch"&gt;#!/usr/bin/env python&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;sys&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;hello&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;world&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;greeting&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;hello &amp;quot;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;
    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;greeting&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="vm"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;__main__&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;hello&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;This took me a long time to get working.&lt;/p&gt;
&lt;p&gt;The music video for Rihanna’s song &lt;strong&gt;American Oxygen&lt;/strong&gt; depicts various
moments from American history, including the inauguration of Barack
Obama.&lt;/p&gt;
&lt;p&gt;Why, sometimes I’ve believed as many as &lt;em&gt;six&lt;/em&gt; impossible things before
breakfast.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Everyone &lt;em&gt;must&lt;/em&gt; attend the meeting at 5 o’clock today.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I am totally awesome.*&lt;/p&gt;
&lt;p&gt;* for certain very small values of awesome&lt;/p&gt;
&lt;p&gt;I have eaten\
the plums\
that were in\
the icebox&lt;/p&gt;
&lt;h2 id="chapter-1"&gt;Chapter 1&lt;/h2&gt;
&lt;p&gt;Something about the room made him uneasy.&lt;/p&gt;
&lt;h2 id="chapter-2"&gt;Chapter 2&lt;/h2&gt;
&lt;p&gt;It's behind you! Hurry before it&lt;/p&gt;
&lt;h1 id="after-the-big-bang"&gt;After the Big Bang&lt;/h1&gt;
&lt;p&gt;A brief summary of time&lt;/p&gt;
&lt;h2 id="life-on-earth"&gt;Life on earth&lt;/h2&gt;
&lt;p&gt;10 billion years&lt;/p&gt;
&lt;h2 id="you-reading-this"&gt;You reading this&lt;/h2&gt;
&lt;p&gt;13.7 billion years&lt;/p&gt;
&lt;p&gt;The quote&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Somewhere, something incredible is waiting to be known&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;has been ascribed to Carl Sagan.&lt;/p&gt;
&lt;p&gt;My favourite Miss Manners quotes:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Allowing an unimportant mistake to pass without comment
is a wonderful social grace.&lt;/p&gt;
&lt;p&gt;Ideological differences are no excuse for rudeness.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Flour&lt;/li&gt;
&lt;li&gt;Cheese&lt;/li&gt;
&lt;li&gt;Tomatoes&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Four steps to better sleep:
1. Stick to a sleep schedule
2. Create a bedtime ritual
3. Get comfortable
4. Manage stress&lt;/p&gt;
&lt;p&gt;1986. What a great season. Arguably the finest season in the
history of the franchise.&lt;/p&gt;
&lt;p&gt;You can do anything at &lt;a href="https://html5zombo.com" rel="noopener noreferrer" target="_blank"&gt;https://html5zombo.com&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The &lt;a href="http://www.ur.ac.rw" rel="noopener noreferrer" target="_blank"&gt;University of Rwanda&lt;/a&gt; was formed in 2013
through the merger of Rwanda’s seven public institutions of higher education.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://w.wiki/qYn" rel="noopener noreferrer" target="_blank"&gt;Hurricane&lt;/a&gt; Erika was the strongest and longest-lasting
tropical cyclone in the 1997 Atlantic &lt;a href="https://w.wiki/qYn" rel="noopener noreferrer" target="_blank"&gt;hurricane&lt;/a&gt; season.&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="https://commonmark.org/help/images/favicon.png" title="favicon" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="Logo" src="https://commonmark.org/help/images/favicon.png" title="Creative Commons licensed" /&gt;&lt;/p&gt;
&lt;p&gt;When &lt;code&gt;x = 3&lt;/code&gt;, that means &lt;code&gt;x + 2 = 5&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Who ate the most donuts this week?&lt;/p&gt;
&lt;div class="highlight" data-lang="text"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;Jeff  15
Sam   11
Robin  6
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;Fruit&lt;/li&gt;
&lt;li&gt;Apple&lt;/li&gt;
&lt;li&gt;Orange&lt;/li&gt;
&lt;li&gt;Banana&lt;/li&gt;
&lt;li&gt;Dairy&lt;/li&gt;
&lt;li&gt;Milk&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Cheese&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;World Cup 2014&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;Germany&lt;/li&gt;
&lt;li&gt;Argentina&lt;/li&gt;
&lt;li&gt;Netherlands&lt;/li&gt;
&lt;li&gt;Rugby World Cup 2015&lt;/li&gt;
&lt;li&gt;New Zealand&lt;/li&gt;
&lt;li&gt;Australia&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;South Africa&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ingredients&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;spaghetti&lt;/li&gt;
&lt;li&gt;marinara sauce&lt;/li&gt;
&lt;li&gt;salt&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Cooking&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Bring water to boil, add a pinch of salt and spaghetti. Cook
   until pasta is &lt;strong&gt;tender&lt;/strong&gt;.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Serve&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Drain the pasta on a plate. Add heated sauce.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;No man is lonely eating spaghetti; it requires so much attention.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Bon appetit!&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Column Left&lt;/th&gt;
&lt;th style="text-align: right;"&gt;Column Right&lt;/th&gt;
&lt;th style="text-align: center;"&gt;Column Centre&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;row1&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td style="text-align: right;"&gt;1&lt;/td&gt;
&lt;td style="text-align: center;"&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;row2&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td style="text-align: right;"&gt;2&lt;/td&gt;
&lt;td style="text-align: center;"&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;row3&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td style="text-align: right;"&gt;3&lt;/td&gt;
&lt;td style="text-align: center;"&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;</description>
      <guid isPermaLink="false">https://www.yakshaving.co.uk/posts/commonmark_test/</guid>
      <category>software</category>
      <category>Markdown</category>
      <pubDate>Fri, 29 Aug 2025 15:16:24 +0100</pubDate>
    </item>
    <item>
      <title>Oracle SQLcl configuration</title>
      <link>https://www.yakshaving.co.uk/posts/oracle-sql-config/</link>
      <description>&lt;p&gt;I use &lt;a href="https://www.oracle.com/database/sqldeveloper/technologies/sqlcl/" rel="noopener noreferrer" target="_blank"&gt;SQLcl&lt;/a&gt; a lot and install it on every environment I work
on. Its fully compatible with SQL*Plus and has useful extensions to
interact with OCI, Autonomous Databases and Data Pump.&lt;/p&gt;
&lt;p&gt;My SQLcl configuration file is named 'login.sql' and located in the
'~/work' directory. I also keep my 'tnsnames.ora' file here.&lt;/p&gt;
&lt;p&gt;The location of these two Oracle configuration files is configured in
'~/.bashrc'.&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="c1"&gt;# Oracle TNS location&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;TNS_ADMIN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;/work

&lt;span class="c1"&gt;# SQLCL login file&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;SQLPATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;/work
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;This is my SQLcl configuration file.&lt;/p&gt;
&lt;div class="highlight" data-lang="text"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;set editor emacs
set statusbar on
set statusbar add timing
set sqlformat ansiconsole
set highlighting on
set highlighting keyword foreground green
set highlighting identifier foreground magenta
set highlighting string foreground yellow
set highlighting number foreground cyan
set highlighting comment background white
set highlighting comment foreground black
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Sample output&lt;/p&gt;
&lt;div class="highlight" data-lang="SQL"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;select&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;count&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;dba_objects&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;COUNT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;________&lt;/span&gt;
&lt;span class="mi"&gt;358710&lt;/span&gt;

&lt;span class="n"&gt;emacs&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="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&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="n"&gt;BILLY&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="n"&gt;EDA_DEMO&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="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;953&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
      <guid isPermaLink="false">https://www.yakshaving.co.uk/posts/oracle-sql-config/</guid>
      <category>software</category>
      <category>Oracle</category>
      <category>SQLcl</category>
      <pubDate>Mon, 03 Mar 2025 14:47:00 +0000</pubDate>
    </item>
    <item>
      <title>what I use</title>
      <link>https://www.yakshaving.co.uk/posts/what-i-use/</link>
      <description>&lt;p&gt;I like reading about the hardware and software various people
&lt;a href="https://usesthis.com/" rel="noopener noreferrer" target="_blank"&gt;use&lt;/a&gt; so here's my version.&lt;/p&gt;
&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;I work for Oracle as a technical consultant based in the UK (fully
remote). I'm old and evolved from a Unix/C developer to PL/SQL, Oracle
DBA and now work on database migrations and Oracle Cloud
Infrastructure (OCI).&lt;/p&gt;
&lt;h3 id="hardware"&gt;Hardware&lt;/h3&gt;
&lt;h4 id="lenovo-thinkcentre-m900"&gt;Lenovo ThinkCentre M900&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Intel i7-6700&lt;/li&gt;
&lt;li&gt;Memory 48GB (upgraded from 16GB)&lt;/li&gt;
&lt;li&gt;Disk 1TB&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="samsung-galaxy-s24"&gt;Samsung Galaxy S24&lt;/h4&gt;
&lt;p&gt;Expensive phone kindly provided by my employer. I don't use many apps
(Gmail, WhatsApp, BBC Sport, Tusky).&lt;/p&gt;
&lt;h4 id="macbook-pro"&gt;MacBook Pro&lt;/h4&gt;
&lt;p&gt;Expensive laptop kindly provided by my employer. I use it on the rare
occasions I need to attend an office or customer site.&lt;/p&gt;
&lt;h4 id="huawei-android-tablet"&gt;Huawei Android tablet&lt;/h4&gt;
&lt;p&gt;I don't have a personal laptop so I use this for idly wasting time.&lt;/p&gt;
&lt;h4 id="synology"&gt;Synology&lt;/h4&gt;
&lt;p&gt;Years ago, I acquired a FreeNAS unit after almost losing an essay (and
my marriage) my wife had written for a Masters course. I subsequently
replaced the FreeNAS with a Synology DS420+ which works fine (file
backups, Jellyfin music server). The NAS has saved my bacon on more
than one occasion and now I can't imagine being without it.&lt;/p&gt;
&lt;h3 id="software"&gt;Software&lt;/h3&gt;
&lt;h4 id="arch-linux"&gt;Arch Linux&lt;/h4&gt;
&lt;p&gt;Former serial distro hopper. Now happy with Arch and Gnome desktop.
Arch just works, has great documentation and provides a brilliant
development environment (comprehensive range of latest packages).&lt;/p&gt;
&lt;h4 id="gnu-emacs"&gt;GNU Emacs&lt;/h4&gt;
&lt;p&gt;I have used GNU Emacs for many years but am still learning about its
power daily. I try to use core packages and keep my configuration
minimal although I build the latest bleeding edge version (30.x).&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Theme - Used 'monokai' for ages and now adopted Prot's excellent
  'modus-vivendi-tinted'.&lt;/li&gt;
&lt;li&gt;Orgmode&lt;/li&gt;
&lt;li&gt;Org Roam&lt;/li&gt;
&lt;li&gt;Vertico, Consult, Maginalia, Orderless&lt;/li&gt;
&lt;li&gt;Magit&lt;/li&gt;
&lt;li&gt;Jinx (spell checker)&lt;/li&gt;
&lt;li&gt;Dashboard&lt;/li&gt;
&lt;li&gt;Undo Tree&lt;/li&gt;
&lt;li&gt;Pass&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="thunderbird"&gt;Thunderbird&lt;/h4&gt;
&lt;p&gt;My employer uses Outlook but we can run any email client so I run a
local Dovecot IMAP server and Thunderbird.&lt;/p&gt;
&lt;p&gt;I use Thunderbird to automatically fetch messages from Outlook and
filters in a vain attempt to try to reduce the size of INBOX.&lt;/p&gt;
&lt;h4 id="virtualbox"&gt;VirtualBox&lt;/h4&gt;
&lt;p&gt;I use VirtualBox a &lt;strong&gt;lot&lt;/strong&gt; for demo environments, testing new Oracle
features and experimenting.&lt;/p&gt;
&lt;p&gt;I've also used Docker/Podman but struggle to fully embrace it as I
prefer full control (and don't really understand Docker compose
files).&lt;/p&gt;
&lt;h3 id="corporate"&gt;Corporate&lt;/h3&gt;
&lt;p&gt;Standard list of tedious corporate applications I have to use. Most of
these work on Arch.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Zoom&lt;/li&gt;
&lt;li&gt;Teams&lt;/li&gt;
&lt;li&gt;Slack&lt;/li&gt;
&lt;li&gt;Confluence&lt;/li&gt;
&lt;li&gt;Jira&lt;/li&gt;
&lt;li&gt;VS-Code/SQL Developer (Oracle database client).&lt;/li&gt;
&lt;/ul&gt;</description>
      <guid isPermaLink="false">https://www.yakshaving.co.uk/posts/what-i-use/</guid>
      <category>software</category>
      <pubDate>Wed, 29 Jan 2025 13:43:00 +0000</pubDate>
    </item>
    <item>
      <title>remapping multiple tablespaces in Data Pump</title>
      <link>https://www.yakshaving.co.uk/posts/remapping_multiple_tablespaces_datapump/</link>
      <description>&lt;p&gt;Occasionally I find myself migrating Oracle databases between
environments using Data Pump.&lt;/p&gt;
&lt;p&gt;Enterprise applications tend to use multiple tablespaces for logical
separation (and historical reasons). However, this isn't possible when
the target database is Autonomous Database (ADB) hosted on Oracle
Cloud Infrastructure (OCI).&lt;/p&gt;
&lt;p&gt;ADB is a managed service so DBA's can't create tablespaces and are
limited to 'DATA'.&lt;/p&gt;
&lt;p&gt;However, Oracle 19c Data Pump supports wildcards for the
REMAP_TABLESPACE parameter which allows multiple tablespaces from the
existing application to be mapped to the ADB DATA tablespace.&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="ch"&gt;#!/bin/bash&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;SCHEMA&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;MYSCHEMA
&lt;span class="k"&gt;do&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nv"&gt;PARFILE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/tmp/dpexp_&lt;span class="nv"&gt;$$&lt;/span&gt;.par

&lt;span class="w"&gt;  &lt;/span&gt;cat&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;PARFILE&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;lt;&amp;lt;EOF&lt;/span&gt;
&lt;span class="s"&gt;schemas=${SCHEMA}&lt;/span&gt;
&lt;span class="s"&gt;logfile=imp_schema_${SCHEMA}.log&lt;/span&gt;
&lt;span class="s"&gt;directory=TEST_DIR&lt;/span&gt;
&lt;span class="s"&gt;dumpfile=exp_schema_${SCHEMA}.dmp&lt;/span&gt;
&lt;span class="s"&gt;transform=disable_archive_logging:Y&lt;/span&gt;
&lt;span class="s"&gt;table_exists_action=REPLACE&lt;/span&gt;
&lt;span class="s"&gt;remap_tablespace=%:DATA&lt;/span&gt;
&lt;span class="s"&gt;metrics=Y&lt;/span&gt;
&lt;span class="s"&gt;logtime=ALL&lt;/span&gt;
&lt;span class="s"&gt;EOF&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;cat&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;PARFILE&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;impdp&lt;span class="w"&gt; &lt;/span&gt;user/pass@DB&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;parfile&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;PARFILE&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;done&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;More info - &lt;a href="https://docs.oracle.com/en/database/oracle/oracle-database/19/sutil/datapump-import-utility.html#GUID-F467946E-50B3-4CC0-937A-CC8C18AAF8C1" rel="noopener noreferrer" target="_blank"&gt;Oracle 19C Data Pump
documentation&lt;/a&gt;&lt;/p&gt;</description>
      <guid isPermaLink="false">https://www.yakshaving.co.uk/posts/remapping_multiple_tablespaces_datapump/</guid>
      <category>Oracle</category>
      <category>datapump</category>
      <pubDate>Mon, 27 Jan 2025 14:42:00 +0000</pubDate>
    </item>
    <item>
      <title>blog questions challenge</title>
      <link>https://www.yakshaving.co.uk/posts/blog-questions-challenge/</link>
      <description>&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;</description>
      <guid isPermaLink="false">https://www.yakshaving.co.uk/posts/blog-questions-challenge/</guid>
      <category>blogging</category>
      <pubDate>Tue, 07 Jan 2025 15:35:23 +0000</pubDate>
    </item>
    <item>
      <title>improving the FWP APEX application</title>
      <link>https://www.yakshaving.co.uk/posts/improving_fwp_apex_app/</link>
      <description>&lt;p&gt;Stung by the criticism of our Football Web Pages APEX
&lt;a href="https://www.yakshaving.co.uk/posts/football-web-pages-apex-app/"&gt;application&lt;/a&gt;, we decide to try
to address the various issues raised by end users and peer code
review.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;When clicking ‘Fixtures’, I get ‘ORA-20999: REST Data Source
   returned an HTTP error: HTTP 400: Bad request’&lt;/li&gt;
&lt;li&gt;If you enter a Competition only, it works fine. If you enter a Team
   only, it works fine. If you enter both a ‘Competition’ and ‘Team’,
   the results look weird. Should ‘Team’ be a cascading LOV based on
   the ‘Competition’ ?&lt;/li&gt;
&lt;li&gt;The column names and labels need tidying up. There are a lot of
   meaningless ID fields displayed.&lt;/li&gt;
&lt;li&gt;It would be nice to have the option to review past results
   separately from fixtures in the future.&lt;/li&gt;
&lt;li&gt;Performance - the Popup LOV’s for Competition and Team are
   sluggish. Why are they so S L O W ?&lt;/li&gt;
&lt;li&gt;The navigation menu looks chaotic and ugly.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="http-400-error-entering-fixtures-report"&gt;HTTP 400 error entering Fixtures report&lt;/h2&gt;
&lt;p&gt;This error is because the REST parameter for 'Competition' or 'Teams'
is required. When we first run this page, there no values defined for
the 'Competition' or 'Teams' parameters which results in the error.&lt;/p&gt;
&lt;p&gt;A quick and easy solution is to simply default the competition to
'Premier League'.&lt;/p&gt;
&lt;p&gt;Edit the 'Fixtures' page. This is Page 8 in my example. The page
number may be different in your APEX environment.&lt;/p&gt;
&lt;p&gt;&lt;img alt="FWP Fixtures" src="https://www.yakshaving.co.uk/images/2025/fwp-fixtures-page.webp" title="Fixtures" /&gt;
&lt;em&gt;FWP Fixtures&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Edit the 'P8_COMPETITION' parameter.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Competition parameter" src="https://www.yakshaving.co.uk/images/2025/fwp-fixtures-competition-parameter.webp" title="Competition parameter" /&gt;
&lt;em&gt;Competition parameter&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Filter on 'Default' and configure a default value with 'Type' set to
'Static' with the value set to '1' (Premier League).&lt;/p&gt;
&lt;p&gt;&lt;img alt="Competition parameter default" src="https://www.yakshaving.co.uk/images/2025/fwp-fixtures-competition-parameter-default.webp" title="Competition parameter default" /&gt;
&lt;em&gt;Competition parameter default&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Save and test the changes. Now if you enter the 'Fixtures' page for
the first time, you should see data displayed for the Premier League
(instead of the HTTP 400 error).&lt;/p&gt;
&lt;p&gt;&lt;img alt="Competition defaulted" src="https://www.yakshaving.co.uk/images/2025/fwp-fixtures-competition-defaulted.webp" title="Competition defaulted" /&gt;
&lt;em&gt;Competition defaulted&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This may not necessarily be the best solution to this problem. For
example, I would like the 'Competition' to default to 'Isthmian
League - South Central' or the team to default to 'Kingstonian FC'.
This requirement could be implemented using a user profile page.&lt;/p&gt;
&lt;h2 id="parameter-validation"&gt;Parameter validation&lt;/h2&gt;
&lt;p&gt;Defaulting the 'Competition' to Premier League may appear to have
resolved the issue when neither of the 'Competition' and 'Team'
parameters are supplied. However, you can easily reproduce the
original issue by selecting the 'Select' value for each parameter
and clicking 'Go'.&lt;/p&gt;
&lt;p&gt;APEX provides a declarative solution for parameter validation which we
can use to resolve this issue.&lt;/p&gt;
&lt;p&gt;Navigate to the 'Fixtures' page in App Builder.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Fixtures validation" src="https://www.yakshaving.co.uk/images/2025/fwp-fixtures-validation.webp" title="Fixtures validation" /&gt;
&lt;em&gt;Fixtures validation&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Click the 'Processing' tab.&lt;/p&gt;
&lt;p&gt;Create a Validation called 'ValidateParams'.&lt;/p&gt;
&lt;p&gt;Click on 'Validating', then right-click and select 'Create
Validation'. Scroll down to the 'Validation' section with Type =
'Expression' and Language = 'PL/SQL'.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Create fixtures validation" src="https://www.yakshaving.co.uk/images/2025/fwp-fixtures-validation-create.webp" title="Fixtures validation create" /&gt;
&lt;em&gt;Fixtures validation create&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I always forget the semantics of the validation expression so I
normally click the 'Help' tab in the middle pane for a quick reminder.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;To pass the validation, and not raise an error message, when the
employee is in department 30 or is a manager:&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class="highlight" data-lang="SQL"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;P2_DEPTNO&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="mi"&gt;30&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;or&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;P2_JOB&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="s1"&gt;&amp;#39;MANAGER&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;In our case, the two parameters are an exclusive OR. The user must
either select a Competition or a Team but not both.&lt;/p&gt;
&lt;p&gt;Therefore, our validation expression (which specifies when the
parameters are valid) is:&lt;/p&gt;
&lt;div class="highlight" data-lang="SQL"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="p"&gt;(:&lt;/span&gt;&lt;span class="n"&gt;P4_TEAM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;is&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;and&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;P4_COMPETITION&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;is&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;not&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;or&lt;/span&gt;
&lt;span class="p"&gt;(:&lt;/span&gt;&lt;span class="n"&gt;P4_TEAM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;is&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;not&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;and&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;P4_COMPETITION&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;is&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;APEX insists you enter a meaningful error message to the displayed to
the end user if the validation fails.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;You must select a competition or team.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Test the changes and check the user now gets an error message
displayed.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Fixtures validation message" src="https://www.yakshaving.co.uk/images/2025/fwp-fixtures-validation-msg.webp" title="Fixtures validation message" /&gt;
&lt;em&gt;Fixtures validation message&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;A lot of the FWP API's require this identical combination of
parameters. Instead of copying and pasting this PL/SQL block, put it
into a stored procedure, so you can reuse this logic. Then, if this
logic subsequently changes in the future, you only have to change the
code in one place.&lt;/p&gt;
&lt;h2 id="summary"&gt;Summary&lt;/h2&gt;
&lt;p&gt;We have (finally) addressed a couple of issues originally raised in
October 2022.&lt;/p&gt;
&lt;p&gt;This is the antithesis of the Agile development methodology but we
will endeavour to address the remaining feedback during the course
of 2025.&lt;/p&gt;</description>
      <guid isPermaLink="false">https://www.yakshaving.co.uk/posts/improving_fwp_apex_app/</guid>
      <category>Oracle</category>
      <category>APEX</category>
      <pubDate>Mon, 06 Jan 2025 10:03:57 +0000</pubDate>
    </item>
    <item>
      <title>Your Amazing OrgMode Post</title>
      <link>https://www.yakshaving.co.uk/posts/post_using_orgmode/</link>
      <description>&lt;h2 id="your-main-content"&gt;Your Main Content&lt;/h2&gt;
&lt;p&gt;This is where the magic happens. Write your awesome content here!&lt;/p&gt;
&lt;p&gt;Here is the wonderful second paragraph.&lt;/p&gt;
&lt;h3 id="standard-text-markup"&gt;Standard text markup&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;bold&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;italic&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="underline"&gt;underline&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Verbatim&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;code&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;del&gt;StrikeThrough&lt;/del&gt;&lt;/p&gt;
&lt;h3 id="lists"&gt;Lists&lt;/h3&gt;
&lt;p&gt;Unordered list&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Apples&lt;/li&gt;
&lt;li&gt;Oranges&lt;/li&gt;
&lt;li&gt;Pears&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ordered list&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;First&lt;/li&gt;
&lt;li&gt;Second&lt;/li&gt;
&lt;li&gt;Third&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="blocks"&gt;Blocks&lt;/h3&gt;
&lt;p&gt;Sample quote&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Everything should be made as simple as possible, but not any simpler
--Albert Einstein&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Example code block&lt;/p&gt;
&lt;div class="highlight" data-lang="C"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="cp"&gt;#include&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cpf"&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;

&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;argc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[])&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Hello world&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3 id="tables"&gt;Tables&lt;/h3&gt;
&lt;p&gt;Sample table&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Language&lt;/td&gt;
&lt;td&gt;Python&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Server&lt;/td&gt;
&lt;td&gt;Dell&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;O/S&lt;/td&gt;
&lt;td&gt;Linux&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="hyperlinks"&gt;Hyperlinks&lt;/h3&gt;
&lt;p&gt;External&lt;/p&gt;
&lt;p&gt;&lt;a href="https://bbc.co.uk" rel="noopener noreferrer" target="_blank"&gt;BBC&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="images"&gt;Images&lt;/h3&gt;
&lt;p&gt;Example image&lt;/p&gt;
&lt;p&gt;&lt;img alt="Dugout" src="https://www.yakshaving.co.uk/images/2010/KFC.webp" title="Football dugout" /&gt;
&lt;em&gt;Non League football&lt;/em&gt;&lt;/p&gt;
&lt;h3 id="misc-rarely-used-niche-markup"&gt;Misc rarely used niche markup&lt;/h3&gt;
&lt;p&gt;Subscripts and Superscripts example. Superscripts need some additional
orgmode configuration but I don't care.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.gnu.org/software/emacs/manual/html_node/org/Subscripts-and-Superscripts.html" rel="noopener noreferrer" target="_blank"&gt;orgmode sub and
superscripts&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The radius of the sun is R_sun = 6.96 x 10^8 m. On the other hand, the
radius of Alpha Centauri is R&lt;sub&gt;Alpha Centauri&lt;/sub&gt; = 1.28 x
R&lt;sub&gt;sun&lt;/sub&gt;.&lt;/p&gt;
&lt;p&gt;Footnotes&lt;/p&gt;
&lt;p&gt;The Org website&lt;sup id="fnref:312-fn:1"&gt;&lt;a class="footnote-ref" href="#fn:312-fn:1"&gt;1&lt;/a&gt;&lt;/sup&gt; now looks a lot better than it used to.&lt;/p&gt;
&lt;div class="footnote"&gt;
&lt;hr /&gt;
&lt;ol&gt;
&lt;li id="fn:312-fn:1"&gt;
&lt;p&gt;The link is: &lt;a href="https://orgmode.org" rel="noopener noreferrer" target="_blank"&gt;https://orgmode.org&lt;/a&gt;&amp;#160;&lt;a class="footnote-backref" href="#fnref:312-fn:1" title="Jump back to footnote 1 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</description>
      <guid isPermaLink="false">https://www.yakshaving.co.uk/posts/post_using_orgmode/</guid>
      <category>Emacs</category>
      <category>orgmode</category>
      <pubDate>Mon, 09 Sep 2024 17:12:09 +0100</pubDate>
    </item>
  </channel>
</rss>
