<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Matt's Notes</title><link>https://mattarnster.co.uk/</link><description>Recent content on Matt's Notes</description><generator>Hugo</generator><language>en-gb</language><lastBuildDate>Tue, 03 Feb 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://mattarnster.co.uk/index.xml" rel="self" type="application/rss+xml"/><item><title>The Stack Belongs to One Man</title><link>https://mattarnster.co.uk/posts/the-stack-belongs-to-one-man/</link><pubDate>Tue, 03 Feb 2026 00:00:00 +0000</pubDate><guid>https://mattarnster.co.uk/posts/the-stack-belongs-to-one-man/</guid><description>&lt;p&gt;SpaceX has acquired xAI. Rockets, satellites, and frontier AI models now share a single corporate parent.&lt;/p&gt;
&lt;p&gt;This isn&amp;rsquo;t just another tech acquisition. It&amp;rsquo;s the completion of a stack.&lt;/p&gt;
&lt;h2 id="what-the-stack-looks-like"&gt;What the Stack Looks Like&lt;/h2&gt;
&lt;p&gt;Consider what Musk now controls:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Launch capacity.&lt;/strong&gt; SpaceX is the dominant commercial launch provider. If you want something in orbit, you probably go through them.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Global connectivity.&lt;/strong&gt; Starlink provides satellite internet to millions, with coverage in places traditional infrastructure doesn&amp;rsquo;t reach.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Frontier AI.&lt;/strong&gt; xAI was already moving fast. Now it has captive infrastructure.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Each layer feeds the others. Satellites generate data. Data trains models. Models run on compute. Compute needs power and connectivity. Rockets put up more satellites.&lt;/p&gt;</description></item><item><title>Cozy Wiff</title><link>https://mattarnster.co.uk/posts/photoblog/a-day-in-the-mountains/</link><pubDate>Tue, 27 Jan 2026 09:50:00 -0500</pubDate><guid>https://mattarnster.co.uk/posts/photoblog/a-day-in-the-mountains/</guid><description>&lt;p&gt;This is the first post in my new photoblog series. I&amp;rsquo;m excited to share my favorite photos and the stories behind them.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s my cat Waffles, enjoying being tucked under a blanket whilst a snowstorm rages outside.&lt;/p&gt;
&lt;p&gt;&lt;img src="image.png" alt="A comfy grey and white cat snuggled under a blanket"&gt;&lt;/p&gt;</description></item><item><title>Redesigning My Personal Site with Claude Code</title><link>https://mattarnster.co.uk/posts/claude-log-001-personal-site-redesign/</link><pubDate>Fri, 23 Jan 2026 00:00:00 +0000</pubDate><guid>https://mattarnster.co.uk/posts/claude-log-001-personal-site-redesign/</guid><description>&lt;p&gt;This is the first entry in &lt;strong&gt;claude.log&lt;/strong&gt;, a series documenting my experiments using Claude Code to build interesting apps, websites, and utilities.&lt;/p&gt;
&lt;h2 id="the-setup"&gt;The Setup&lt;/h2&gt;
&lt;p&gt;I&amp;rsquo;ve been meaning to redesign my personal site for a while. The old one worked, but it felt stale. Instead of spending a weekend bikeshedding over static site generators and CSS frameworks, I decided to pair with Claude Code and see what we could build in a single session.&lt;/p&gt;</description></item><item><title>RadarrApp - My First UWP Application</title><link>https://mattarnster.co.uk/posts/radarrapp-my-first-uwp-application/</link><pubDate>Thu, 28 May 2020 00:00:00 +0000</pubDate><guid>https://mattarnster.co.uk/posts/radarrapp-my-first-uwp-application/</guid><description>&lt;p&gt;I recently decided to build my first Universal Windows Platform (UWP) application. The result is RadarrApp, a Windows Store application that provides desktop access to my Radarr media library without needing a web browser.&lt;/p&gt;
&lt;h2 id="data-binding"&gt;Data Binding&lt;/h2&gt;
&lt;p&gt;One of the first fundamental XAML questions I had to address was choosing between &lt;code&gt;{ Binding }&lt;/code&gt; and &lt;code&gt;{ x:Bind }&lt;/code&gt;. I discovered that the latter option compiles type information at build time and binds to code-behind, offering advantages over the older binding methodology.&lt;/p&gt;</description></item><item><title>Finding and Replacing Text in a Word Document Using python-docx</title><link>https://mattarnster.co.uk/posts/finding-and-replacing-content-in-a-word-document-using-python-docx/</link><pubDate>Sun, 15 Dec 2019 00:00:00 +0000</pubDate><guid>https://mattarnster.co.uk/posts/finding-and-replacing-content-in-a-word-document-using-python-docx/</guid><description>&lt;p&gt;I recently needed to automate dividend slip generation through a Python solution. The project required reading shareholder data from CSV, locating a Word template, substituting placeholder text with specific details, and saving customized documents without altering the original.&lt;/p&gt;
&lt;h2 id="the-challenge"&gt;The Challenge&lt;/h2&gt;
&lt;p&gt;I needed to accomplish five key tasks:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Extract amounts, dates, and addresses from a CSV file&lt;/li&gt;
&lt;li&gt;Verify that output files didn&amp;rsquo;t already exist&lt;/li&gt;
&lt;li&gt;Load a Word document template&lt;/li&gt;
&lt;li&gt;Replace placeholder &amp;ldquo;trigger words&amp;rdquo; with actual data&lt;/li&gt;
&lt;li&gt;Save generated documents separately from the template&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="solution-approach"&gt;Solution Approach&lt;/h2&gt;
&lt;p&gt;Rather than relying on built-in find-and-replace functionality, I leveraged &lt;code&gt;python-docx&lt;/code&gt; to iterate through document paragraphs and apply Python&amp;rsquo;s string replacement methods to swap placeholder values for actual data.&lt;/p&gt;</description></item><item><title>Participating in ReactRiot 2017</title><link>https://mattarnster.co.uk/posts/participating-in-reactriot-2017/</link><pubDate>Thu, 07 Dec 2017 00:00:00 +0000</pubDate><guid>https://mattarnster.co.uk/posts/participating-in-reactriot-2017/</guid><description>&lt;p&gt;Our team recently participated in ReactRiot 2017, a 48-hour online hackathon centered on building applications with React. We developed MGMT, a time-tracking tool designed for freelancers, emphasizing clean design with a simple navigation journey.&lt;/p&gt;
&lt;h2 id="technical-stack"&gt;Technical Stack&lt;/h2&gt;
&lt;p&gt;The project incorporated a variety of tools and libraries:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;React-Router for navigation&lt;/li&gt;
&lt;li&gt;Redux and Redux-Thunk for state management&lt;/li&gt;
&lt;li&gt;Reselect for memoized selectors&lt;/li&gt;
&lt;li&gt;SweetAlert for notifications&lt;/li&gt;
&lt;li&gt;IcoMoon and Feather for icons&lt;/li&gt;
&lt;li&gt;Photoshop for design work&lt;/li&gt;
&lt;li&gt;GitHub for version control&lt;/li&gt;
&lt;li&gt;Browserstack for cross-browser testing&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="development-experience"&gt;Development Experience&lt;/h2&gt;
&lt;p&gt;My teammate Toby and I were deepening our Redux knowledge during development. Despite encountering challenges with state management integration, we persevered and completed the project. Sleep was minimal during the competition, sustained primarily by energy drinks.&lt;/p&gt;</description></item><item><title>Create a Webform Handler in Drupal 8</title><link>https://mattarnster.co.uk/posts/create-a-webform-handler-in-drupal-8/</link><pubDate>Fri, 10 Mar 2017 00:00:00 +0000</pubDate><guid>https://mattarnster.co.uk/posts/create-a-webform-handler-in-drupal-8/</guid><description>&lt;p&gt;This tutorial explains how to develop a custom webform handler for Drupal 8&amp;rsquo;s Webform module. The guide demonstrates the process of creating a handler to transmit form submissions to third-party services.&lt;/p&gt;
&lt;h2 id="module-structure"&gt;Module Structure&lt;/h2&gt;
&lt;p&gt;Start by establishing this directory hierarchy:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;modules/
 custom/
 my_custom_form_handler/
 src/
 Plugin/
 WebformHandler/
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="basic-handler-template"&gt;Basic Handler Template&lt;/h2&gt;
&lt;p&gt;The handler file (&lt;code&gt;ExampleFormHandler.php&lt;/code&gt;) requires these use statements and class definition:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;&amp;lt;?&lt;/span&gt;&lt;span class="nx"&gt;php&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;namespace&lt;/span&gt; &lt;span class="nx"&gt;Drupal\my_custom_form_handler\Plugin\WebformHandler&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nx"&gt;Drupal\Core\Session\AccountInterface&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nx"&gt;Drupal\Core\Serialization\Yaml&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nx"&gt;Drupal\Core\Form\FormStateInterface&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nx"&gt;Drupal\webform\Plugin\WebformHandlerBase&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nx"&gt;Drupal\webform\WebformSubmissionInterface&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nx"&gt;GuzzleHttp\Client&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nx"&gt;GuzzleHttp\Exception\RequestException&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt;/**
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; * @WebformHandler(
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; * id = &amp;#34;example_form_handler&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; * label = @Translation(&amp;#34;Example form handler&amp;#34;),
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; * category = @Translation(&amp;#34;Examples&amp;#34;),
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; * description = @Translation(&amp;#34;An example form handler&amp;#34;),
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; * )
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ExampleFormHandler&lt;/span&gt; &lt;span class="k"&gt;extends&lt;/span&gt; &lt;span class="nx"&gt;WebformHandlerBase&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;submitForm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;array&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nv"&gt;$form&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;FormStateInterface&lt;/span&gt; &lt;span class="nv"&gt;$form_state&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;WebformSubmissionInterface&lt;/span&gt; &lt;span class="nv"&gt;$webform_submission&lt;/span&gt;
&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="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// Implementation here
&lt;/span&gt;&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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="sending-data-to-third-parties"&gt;Sending Data to Third Parties&lt;/h2&gt;
&lt;p&gt;The implementation uses Guzzle HTTP client to post submission data:&lt;/p&gt;</description></item><item><title>About</title><link>https://mattarnster.co.uk/about/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://mattarnster.co.uk/about/</guid><description>&lt;p&gt;Software developer based in the USA.&lt;/p&gt;
&lt;h2 id="elsewhere"&gt;Elsewhere&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/mattarnster"&gt;GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/mattarnster"&gt;Twitter&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="this-site"&gt;This Site&lt;/h2&gt;
&lt;p&gt;Built with &lt;a href="https://gohugo.io"&gt;Hugo&lt;/a&gt; and &lt;a href="https://claude.ai/code"&gt;Claude Code&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="contact"&gt;Contact&lt;/h2&gt;
&lt;p&gt;matt at mattarnster dot co dot uk&lt;/p&gt;</description></item><item><title>Projects</title><link>https://mattarnster.co.uk/projects/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://mattarnster.co.uk/projects/</guid><description>&lt;h2 id="radarrapp"&gt;RadarrApp&lt;/h2&gt;
&lt;p&gt;A way to view your Radarr library and queue from your desktop.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/mattarnster/radarrapp"&gt;GitHub&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="job-tracker"&gt;job-tracker&lt;/h2&gt;
&lt;p&gt;A Laravel application written for a local welding shop to track customer projects and provide communication to the customers.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/mattarnster/job-tracker"&gt;GitHub&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="sud"&gt;sud&lt;/h2&gt;
&lt;p&gt;A small application written in Go to download files from remote servers via SFTP.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/mattarnster/sud"&gt;GitHub&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="scss-compiler"&gt;SCSS Compiler&lt;/h2&gt;
&lt;p&gt;Tiny Sublime Text plugin to compile the selected CSS to SCSS. 39k+ installs.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://packagecontrol.io/packages/SCSS%20Compiler"&gt;Package Control&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="releasetrackr"&gt;releasetrackr&lt;/h2&gt;
&lt;p&gt;A way to subscribe to release notifications on GitHub repos with email delivery, built using Go and MongoDB.&lt;/p&gt;</description></item></channel></rss>