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