<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>ps4bp</title>
    <link>https://ps4bp.pages.dev/</link>
    <description>Recent content on ps4bp</description>
    <generator>Hugo</generator>
    <language>en</language>
    <lastBuildDate>Wed, 28 Oct 2026 13:17:35 +1100</lastBuildDate>
    <atom:link href="https://ps4bp.pages.dev/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Hugo upgrade</title>
      <link>https://ps4bp.pages.dev/posts/hugo-upgrade/</link>
      <pubDate>Wed, 28 Oct 2026 13:17:35 +1100</pubDate>
      <guid>https://ps4bp.pages.dev/posts/hugo-upgrade/</guid>
      <description>&lt;p&gt;Time to upgrade Hugo today&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-console&#34; data-lang=&#34;console&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;PS&amp;gt; winget update --purge|grep -i hugo&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;Hugo (Extended) Hugo.Hugo.Extended 0.168.0        0.169.0        winget&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;PS&amp;gt; winget upgrade Hugo.Hugo.Extended&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;Found Hugo (Extended) [Hugo.Hugo.Extended] Version 0.169.0&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;This application is licensed to you by its owner.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;Microsoft is not responsible for, nor does it grant any licenses to, third-party packages.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;Downloading https://github.com/gohugoio/hugo/releases/download/v0.169.0/hugo_extended_0.169.0_windows-amd64.zip&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;  ██████████████████████████████  22.5 MB / 22.5 MB&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;Successfully verified installer hash&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;Extracting archive...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;Successfully extracted archive&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;Starting package install...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;Command line alias added: &amp;#34;hugo&amp;#34;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;Successfully installed&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;PS&amp;gt; hugo version&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;hugo v0.169.0-1da10fc44701c566b1669cdb2d12638f155138bd+extended windows/amd64 BuildDate=2026-10-27T14:52:20Z VendorInfo=gohugoio&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Update &lt;code&gt;netlify.toml&lt;/code&gt; accordingly.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Auto-publish on commit</title>
      <link>https://ps4bp.pages.dev/posts/netlify-2/</link>
      <pubDate>Tue, 27 Oct 2026 19:29:36 +1100</pubDate>
      <guid>https://ps4bp.pages.dev/posts/netlify-2/</guid>
      <description>&lt;h1 id=&#34;problem&#34;&gt;&#xA;  Problem&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#problem&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h1&gt;&#xA;&lt;p&gt;When a Hugo content file contains:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;title&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;My New Blog Post&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;date&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;ld&#34;&gt;2026-10-27&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;draft&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Hugo treats the content as unpublished.&#xA;Running a standard build &lt;code&gt;hugo&lt;/code&gt; will &lt;em&gt;exclude&lt;/em&gt; all draft content from the generated site.&#xA;This behavior is intentional and helps prevent unfinished articles from being published accidentally.&lt;/p&gt;&#xA;&lt;p&gt;To preview, &lt;code&gt;hugo server -D&lt;/code&gt;.&#xA;The -D (or &amp;ndash;buildDrafts) flag tells Hugo to include draft content during local development.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Hosted by Netlify</title>
      <link>https://ps4bp.pages.dev/posts/hosted-by-netlify/</link>
      <pubDate>Tue, 27 Oct 2026 16:41:01 +1100</pubDate>
      <guid>https://ps4bp.pages.dev/posts/hosted-by-netlify/</guid>
      <description>&lt;h1 id=&#34;how-to-deploy-to-netlify&#34;&gt;&#xA;  How to deploy to Netlify&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#how-to-deploy-to-netlify&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h1&gt;&#xA;&lt;p&gt;I&amp;rsquo;m practicing multicloud deployments and want to host this blog on Netlify.&lt;/p&gt;&#xA;&lt;h2 id=&#34;create-netlifytoml-in-blog-repo-on-gitlab&#34;&gt;&#xA;  Create netlify.toml in blog repo on GitLab&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#create-netlifytoml-in-blog-repo-on-gitlab&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-toml&#34; data-lang=&#34;toml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;build&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;environment&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;DART_SASS_VERSION&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;1.105.1&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;GO_VERSION&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;1.27.2&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;HUGO_VERSION&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;0.168.0&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;NODE_VERSION&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;24.21.0&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;TZ&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;Europe/Oslo&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;build&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;publish&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;public&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;command&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&amp;#34;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;  curl -sfLO &amp;#34;&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;https&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;://&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;github&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;com&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;sass&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;dart-sass&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;releases&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;download&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;/$&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;DART_SASS_VERSION&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;dart-sass-&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;$&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;DART_SASS_VERSION&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;-linux-x64&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;tar&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;gz&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34; &amp;amp;&amp;amp; \&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;  tar -C &amp;#34;&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;$&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;HOME&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;local&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34; -xf &amp;#34;&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;dart-sass-&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;$&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;DART_SASS_VERSION&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;-linux-x64&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;tar&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;gz&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34; &amp;amp;&amp;amp; \&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;  rm &amp;#34;&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;dart-sass-&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;$&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;DART_SASS_VERSION&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;-linux-x64&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;tar&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;gz&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34; &amp;amp;&amp;amp; \&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;  export PATH=&amp;#34;&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;$&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;HOME&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;local&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;dart-sass&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;:$&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;PATH&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34; &amp;amp;&amp;amp; \&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;  git config --global core.quotepath false &amp;amp;&amp;amp; \&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;  hugo build --gc --minify --baseURL &amp;#34;&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;$&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;URL&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;  &amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;configure-netlify&#34;&gt;&#xA;  Configure Netlify&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#configure-netlify&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Create a project by importing from GitLab&lt;/li&gt;&#xA;&lt;li&gt;Name the project ps4b→blog URL becomes &lt;a href=&#34;https://ps4bp.netlify.app&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://ps4bp.netlify.app&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h2 id=&#34;references&#34;&gt;&#xA;  References&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#references&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://docs.netlify.com/build/frameworks/framework-setup-guides/hugo/&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Hugo on Netlify&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://gohugo.io/host-and-deploy/deploy-to-netlify/&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Deploy to Netlify&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;</description>
    </item>
    <item>
      <title>Cloudflare Turnstile</title>
      <link>https://ps4bp.pages.dev/posts/cloudflare-turnstile/</link>
      <pubDate>Tue, 27 Oct 2026 11:45:01 +1100</pubDate>
      <guid>https://ps4bp.pages.dev/posts/cloudflare-turnstile/</guid>
      <description>&lt;h1 id=&#34;put-a-gate-in-a-worker&#34;&gt;&#xA;  Put a gate in a worker&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#put-a-gate-in-a-worker&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h1&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Create a Turnstile widget.&#xA;&lt;img src=&#34;https://ps4bp.pages.dev/images/cloudflare-turnstile-1.png&#34; alt=&#34;Cloudflare Turnstile 1 &#34;&gt;&#xA;&#xA;In the Cloudflare dashboard, open Turnstile → Add &lt;code&gt;worker-captcha&lt;/code&gt; &lt;em&gt;manually&lt;/em&gt;. Add &lt;a href=&#34;https://forex-proxy.ps4bp.workers.dev&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;forex-proxy.ps4bp.workers.dev&lt;/a&gt; as an allowed hostname and copy the sitekey and secret key. The sitekey is public; keep the secret private.&lt;/li&gt;&#xA;&lt;li&gt;Store the keys as Worker variables.&#xA;&lt;img src=&#34;https://ps4bp.pages.dev/images/cloudflare-turnstile-2.png&#34; alt=&#34;Cloudflare Turnstile 2&#34;&gt;&#xA;&#xA;In Workers &amp;amp; Pages → forex-proxy → Settings → Runtime variables and Secrets, add:&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;TURNSTILE_SITE_KEY&lt;/code&gt; as a regular text variable.&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;TURNSTILE_SECRET_KEY&lt;/code&gt; as a secret.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Make the Worker handle requests before serving the page.&#xA;Have it:&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Check for a valid pass cookie on each page request.&lt;/li&gt;&#xA;&lt;li&gt;If there isn’t one, return a small HTML verification page containing the Turnstile widget.&lt;/li&gt;&#xA;&lt;li&gt;Accept the widget token at a verification endpoint and send it to &lt;a href=&#34;https://challenges.cloudflare.com/turnstile/v0/siteverify&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://challenges.cloudflare.com/turnstile/v0/siteverify&lt;/a&gt;.&lt;/li&gt;&#xA;&lt;li&gt;Only after Siteverify returns success: true, issue a short-lived, signed pass cookie and redirect back to /.&lt;/li&gt;&#xA;&lt;li&gt;Serve index.html when the cookie is valid.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Protect every route that should be gated.&#xA;If only the landing page needs protection, gate /. If API routes also need protection, gate those separately so the verification endpoint stays reachable.&lt;/li&gt;&#xA;&lt;li&gt;Deploy and check both paths.&#xA;Test that a fresh browser sees the challenge, a successful verification reaches the page, and a request without a valid cookie cannot fetch the protected content directly.&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>About</title>
      <link>https://ps4bp.pages.dev/about/</link>
      <pubDate>Sun, 25 Oct 2026 20:47:08 -0400</pubDate>
      <guid>https://ps4bp.pages.dev/about/</guid>
      <description>&lt;p&gt;I&amp;rsquo;m a developer versed in Python, JavaScript, and PowerShell. I enjoy exploring technology, automating processes, and documenting both successes and failures. This blog is where I share my journey, lessons learned, project write-ups, and the occasional debugging adventure.&lt;/p&gt;&#xA;&lt;p&gt;PS4BP is short for Practical Software for Better Productivity.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Hello World</title>
      <link>https://ps4bp.pages.dev/posts/first-post/</link>
      <pubDate>Sun, 25 Oct 2026 20:43:54 -0400</pubDate>
      <guid>https://ps4bp.pages.dev/posts/first-post/</guid>
      <description>&lt;p&gt;Welcome to my new blog.&lt;/p&gt;&#xA;&lt;p&gt;This site is built with Hugo, themed with Coder, and hosted on GitLab Pages.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Projects</title>
      <link>https://ps4bp.pages.dev/projects/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://ps4bp.pages.dev/projects/</guid>
      <description>&lt;p&gt;An eclectic playground of tiny projects to learn by doing:&lt;/p&gt;&#xA;&lt;h2 id=&#34;-my-first-swa&#34;&gt;&#xA;  🚀 My First SWA&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#-my-first-swa&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Stopped developing, but learned&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Deploying a &lt;strong&gt;free&lt;/strong&gt; &lt;a href=&#34;https://happy-island-003234c00.5.azurestaticapps.net/&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Azure Static Web App&lt;/a&gt; with GitHub Actions&lt;/li&gt;&#xA;&lt;li&gt;Sourcing a &lt;a href=&#34;https://www.timeanddate.com/&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;timeanddate.com&lt;/a&gt; clock in an &lt;code&gt;iframe&lt;/code&gt;, inspired by &lt;a href=&#34;https://www.youtube.com/watch?v=pO-WN8kvkos&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Amy Kapernick&amp;rsquo;s talk&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;Using the &lt;code&gt;title&lt;/code&gt; attribute to provide simple tooltips&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;-yada-spa&#34;&gt;&#xA;  🛠️ YADa (SPA)&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#-yada-spa&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Actively developing and learning&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Using GitHub Actions to deploy across multiple cloud platforms&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://smartmouse714.github.io/dashboard201&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;GitHub Pages&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://mtidashboard.pages.dev&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Cloudflare Pages&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://agreeable-ground-069a5e600.5.azurestaticapps.net/&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Azure SWA&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Working around CORS limitations with a Worker-based proxy&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://forex-proxy.ps4bp.workers.dev&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;a Python worker&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://webex-status-proxy.ps4bp.workers.dev&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;a JavaScript worker&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Using semantic HTML to improve accessibility and document structure&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;work-in-progress&#34;&gt;&#xA;  Work in progress&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#work-in-progress&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;</description>
    </item>
  </channel>
</rss>
