<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Programming on Sumner Evans</title><link>https://sumnerevans.com/tags/programming/</link><description>Recent content in Programming on Sumner Evans</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Thu, 15 Oct 2026 12:05:24 -0600</lastBuildDate><atom:link href="https://sumnerevans.com/tags/programming/index.xml" rel="self" type="application/rss+xml"/><item><title>How I Want to Use AI</title><link>https://sumnerevans.com/posts/software-engineering/sgil/</link><pubDate>Fri, 25 Sep 2026 06:25:00 -0600</pubDate><guid>https://sumnerevans.com/posts/software-engineering/sgil/</guid><description>&lt;div class="admonition abstract"&gt;&#10; &lt;div class="admonition-header"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512"&gt;&lt;path d="M64 0C28.7 0 0 28.7 0 64L0 448c0 35.3 28.7 64 64 64l256 0c35.3 0 64-28.7 64-64l0-288-128 0c-17.7 0-32-14.3-32-32L224 0 64 0zM256 0l0 128 128 0L256 0zM112 256l160 0c8.8 0 16 7.2 16 16s-7.2 16-16 16l-160 0c-8.8 0-16-7.2-16-16s7.2-16 16-16zm0 64l160 0c8.8 0 16 7.2 16 16s-7.2 16-16 16l-160 0c-8.8 0-16-7.2-16-16s7.2-16 16-16zm0 64l160 0c8.8 0 16 7.2 16 16s-7.2 16-16 16l-160 0c-8.8 0-16-7.2-16-16s7.2-16 16-16z"/&gt;&lt;/svg&gt;&#10; &lt;span&gt;TL;DR&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="admonition-content"&gt;&#10; &lt;p&gt;The chat-based workflow encouraged by existing AI harnesses results in a&#10;fragmented source of truth for the desired functionality of the software.&lt;/p&gt;&#10;&lt;p&gt;To centralise the source of truth, we should use Markdown as Source (MaS). We&#10;should adopt a Specify, Generate, Inspect, Loop (SGIL) workflow which puts&#10;human-written Markdown files stored in source control front-and-centre.&lt;/p&gt;&#10; &lt;/div&gt;&#10; &lt;/div&gt;&lt;h2 id="my-current-ai-workflow"&gt;&#10; My Current AI Workflow&#10; &lt;a&#10; class="permalink"&#10; href="#my-current-ai-workflow"&#10; aria-label="Permalink to My Current AI Workflow"&#10; &gt;&lt;!--&#10;tags: [zoom-filled, link, url, connection, hyperlink, reference, attach, join, typography, writing]&#10;category: Text&#10;version: "1.0"&#10;unicode: "eade"&#10;--&gt;&#10;&lt;svg aria-hidden="true" class="hi-svg-inline" fill="none" height="1em" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" viewBox="0 0 24 24" width="1em" xmlns="http://www.w3.org/2000/svg"&gt;&#10; &lt;path d="M9 15l6 -6" /&gt;&#10; &lt;path d="M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464" /&gt;&#10; &lt;path d="M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463" /&gt;&#10;&lt;/svg&gt;&#10;&lt;/a&gt;&#10;&lt;/h2&gt;&#10;&lt;p&gt;I &lt;em&gt;hate&lt;/em&gt; my AI workflow. I don&amp;rsquo;t know how everyone else is using AI, but&#10;currently my workflow looks something like:&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Open Claude and type a chat message indicating what I want it to do.&lt;/li&gt;&#10;&lt;li&gt;Look at the code or plans it generates and test the functionality of the code&#10;it produced.&lt;/li&gt;&#10;&lt;li&gt;Type a chat message clarifying my ask or correcting the AI&amp;rsquo;s assumptions.&#10;Normally this involves telling it what I dislike about the code it generated.&lt;/li&gt;&#10;&lt;li&gt;Go to 2.&lt;/li&gt;&#10;&lt;/ol&gt;</description></item><item><title>Forget MCP, Write CLI Apps</title><link>https://sumnerevans.com/posts/software-engineering/forget-mcp-write-cli-apps/</link><pubDate>Tue, 02 Dec 2025 06:25:00 -0600</pubDate><guid>https://sumnerevans.com/posts/software-engineering/forget-mcp-write-cli-apps/</guid><description>&lt;p&gt;Over the last month or so, I&amp;rsquo;ve been using&#10;&lt;a&#10; href="https://claude.com/code"&#10; title="(opens in new tab)"&#10; rel="external" target="_blank"&#10; &gt;Claude Code&lt;/a&gt; for assisting with development tasks&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;.&#10;One of the things that has confused me the most about the LLM-assisted&#10;programming ecosystem is the&#10;&lt;a&#10; href="https://modelcontextprotocol.io/docs/getting-started/intro"&#10; title="(opens in new tab)"&#10; rel="external" target="_blank"&#10; &gt;Model Context Protocol (MCP)&lt;/a&gt;&#10;landscape. In theory, MCP is a way to provide the LLM with data from an external&#10;system through a structured protocol. However,&#10;&lt;a&#10; href="https://youtu.be/1piFEKA9XL0"&#10; title="(opens in new tab)"&#10; rel="external" target="_blank"&#10; &gt;it&lt;/a&gt; &lt;a&#10; href="https://youtu.be/hPPTrsUzLA8"&#10; title="(opens in new tab)"&#10; rel="external" target="_blank"&#10; &gt;sucks&lt;/a&gt;. It&#10;turns out that it is more efficient to have the AI just write code to analyse&#10;and manipulate the data from the external system directly. Rather than piping&#10;the data from the external system into the LLM&amp;rsquo;s context window and letting the&#10;LLM muddle through it, the LLM-written code can just do the necessary data&#10;processing. Computers have been good at running instructions on large datasets&#10;for a very long time and AI is not going to be a substitute for that.&lt;/p&gt;</description></item><item><title>Learning Typst</title><link>https://sumnerevans.com/posts/programming/learning-typst/</link><pubDate>Sat, 11 Oct 2025 06:25:00 -0600</pubDate><guid>https://sumnerevans.com/posts/programming/learning-typst/</guid><description>&lt;p&gt;A few weeks ago, &lt;a&#10; href="https://typst.app/"&#10; title="(opens in new tab)"&#10; rel="external" target="_blank"&#10; &gt;Typst&lt;/a&gt; came back on my radar because&#10;&lt;a&#10; href="https://www.youtube.com/@sylvanfranklin"&#10; title="(opens in new tab)"&#10; rel="external" target="_blank"&#10; &gt;Sylvan Franklin&lt;/a&gt;&amp;rsquo;s videos on the topic&#10;came into my YouTube feed. In particular,&#10;&lt;a&#10; href="https://www.youtube.com/watch?v=Bwo1oX4wapE"&#10; title="(opens in new tab)"&#10; rel="external" target="_blank"&#10; &gt;&lt;em&gt;Rewriting my resume in Typst&lt;/em&gt;&lt;/a&gt; in&#10;which he rewrites his resume from \(\LaTeX\) to Typst piqued my interest. I have&#10;maintained &lt;a&#10; href="https://github.com/sumnerevans/resume"&#10; title="(opens in new tab)"&#10; rel="external" target="_blank"&#10; &gt;my resume&lt;/a&gt; in \(\LaTeX\)&#10;since I started at Mines in 2016, and so I figured this would be an opportunity&#10;for me to learn something new.&lt;/p&gt;</description></item><item><title>Vibe Coding Doesn't Require LLMs</title><link>https://sumnerevans.com/posts/software-engineering/vibe-coding-doesnt-require-llms/</link><pubDate>Sun, 10 Aug 2025 06:25:00 -0600</pubDate><guid>https://sumnerevans.com/posts/software-engineering/vibe-coding-doesnt-require-llms/</guid><description>&lt;p&gt;I recently read&#10;&lt;a&#10; href="https://alexkondov.com/i-know-when-youre-vibe-coding/"&#10; title="(opens in new tab)"&#10; rel="external" target="_blank"&#10; &gt;&lt;em&gt;I Know When You&amp;rsquo;re Vibe Coding&lt;/em&gt;&lt;/a&gt;&#10;by &lt;a&#10; href="https://alexkondov.com/"&#10; title="(opens in new tab)"&#10; rel="external" target="_blank"&#10; &gt;Alex Kondov&lt;/a&gt; in which he described certain&#10;characteristic &amp;ldquo;smells&amp;rdquo; of vibe-coded software. For example, he points to LLMs&#10;proclivity to pave their own path and go against established patterns within a&#10;project.&lt;/p&gt;&#10;&lt;p&gt;The article resonated with me, but I realized that it resonated with me at a&#10;deeper level than just explaining my interactions with LLM-written software. I&#10;realized that &lt;em&gt;I&amp;rsquo;ve seen these &amp;ldquo;smells&amp;rdquo; before in pre-LLM software (especially&#10;that written by students).&lt;/em&gt;&lt;/p&gt;</description></item><item><title>Matrix Cryptographic Key Infrastructure</title><link>https://sumnerevans.com/posts/matrix/cryptographic-key-infrastructure/</link><pubDate>Sat, 21 Sep 2024 10:00:00 +0200</pubDate><guid>https://sumnerevans.com/posts/matrix/cryptographic-key-infrastructure/</guid><description>&lt;p&gt;End-to-end encryption is one of the things which brought me to Matrix, and I&amp;rsquo;m&#10;sure that it&amp;rsquo;s one of the factors that brought many of you to Matrix as well.&lt;/p&gt;&#10;&lt;p&gt;However, Matrix&amp;rsquo;s user experience with cryptography is often confusing. I&#10;mainly blame the other chat networks for their incompetence. Most other chat&#10;networks don&amp;rsquo;t even provide any cryptographically-guaranteed security and&#10;privacy. Some networks provide encryption in a way that does not truly leave&#10;the user in control of their keys. Only a few networks (Signal) truly leave&#10;the user in control, and their UX is arguably worse than Matrix.&lt;/p&gt;&#10;</description></item><item><title>Message Security in Matrix</title><link>https://sumnerevans.com/posts/matrix/megolm/</link><pubDate>Fri, 09 Aug 2024 06:00:00 -0600</pubDate><guid>https://sumnerevans.com/posts/matrix/megolm/</guid><description>&lt;p&gt;In Matrix, message security is provided by Megolm. The goal of message security&#10;is twofold. We (a) want messages to be encrypted on the sender&amp;rsquo;s device and (b)&#10;only be able to be decrypted on devices of users who are a part of the&#10;conversation. As a corollary, we want to prevent other parties (rogue&#10;homeservers, man-in-the-middle attackers, etc.) from decrypting the messages.&lt;/p&gt;</description></item><item><title>Matrix Cryptography Prerequisites</title><link>https://sumnerevans.com/posts/matrix/cryptography-prerequisites/</link><pubDate>Fri, 09 Aug 2024 05:00:00 -0600</pubDate><guid>https://sumnerevans.com/posts/matrix/cryptography-prerequisites/</guid><description>&lt;p&gt;Understanding Matrix cryptography requires understanding some basic cryptography&#10;primitives. This article intends to explain those prerequisites in simple terms.&#10;This article is &lt;em&gt;not&lt;/em&gt; a rigorous, mathematical description of the cryptosystems&#10;in use. Rather, it is a practical guide to what &lt;em&gt;functionality&lt;/em&gt; each of the&#10;cryptography primitives provides. I&amp;rsquo;ve tried to include links to external&#10;resources if you are interested in learning more about a specific topic.&lt;/p&gt;</description></item><item><title>Differential Fuzzing Libolm and Goolm</title><link>https://sumnerevans.com/posts/matrix/differential-fuzzing-libolm-goolm/</link><pubDate>Sat, 01 Jun 2024 06:25:00 -0600</pubDate><guid>https://sumnerevans.com/posts/matrix/differential-fuzzing-libolm-goolm/</guid><description>&lt;h2 id="background"&gt;&#10; Background&#10; &lt;a&#10; class="permalink"&#10; href="#background"&#10; aria-label="Permalink to Background"&#10; &gt;&lt;!--&#10;tags: [zoom-filled, link, url, connection, hyperlink, reference, attach, join, typography, writing]&#10;category: Text&#10;version: "1.0"&#10;unicode: "eade"&#10;--&gt;&#10;&lt;svg aria-hidden="true" class="hi-svg-inline" fill="none" height="1em" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" viewBox="0 0 24 24" width="1em" xmlns="http://www.w3.org/2000/svg"&gt;&#10; &lt;path d="M9 15l6 -6" /&gt;&#10; &lt;path d="M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464" /&gt;&#10; &lt;path d="M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463" /&gt;&#10;&lt;/svg&gt;&#10;&lt;/a&gt;&#10;&lt;/h2&gt;&#10;&lt;p&gt;When we at Beeper started working on the&#10;&lt;a&#10; href="https://blog.beeper.com/2024/04/09/how-beeper-android-works/"&#10; title="(opens in new tab)"&#10; rel="external" target="_blank"&#10; &gt;new Android app&lt;/a&gt;,&#10;based on &lt;a&#10; href="https://github.com/mautrix/go"&#10; title="(opens in new tab)"&#10; rel="external" target="_blank"&#10; &gt;mautrix-go&lt;/a&gt;, we initially tried using&#10;&lt;a&#10; href="https://github.com/mautrix/go/tree/master/crypto/goolm"&#10; title="(opens in new tab)"&#10; rel="external" target="_blank"&#10; &gt;goolm&lt;/a&gt; as the crypto&#10;implementation instead of &lt;a&#10; href="https://gitlab.matrix.org/matrix-org/olm"&#10; title="(opens in new tab)"&#10; rel="external" target="_blank"&#10; &gt;libolm&lt;/a&gt;. We&#10;almost immediately ran into issues for unknown reasons, and rather than fighting&#10;with cryptography, we decided to just put in the work to get libolm working in&#10;the Android app.&lt;/p&gt;</description></item><item><title>Advent of Code 2023</title><link>https://sumnerevans.com/posts/programming/2023-advent-of-code/</link><pubDate>Thu, 30 Nov 2023 09:00:00 -0600</pubDate><guid>https://sumnerevans.com/posts/programming/2023-advent-of-code/</guid><description>&lt;p&gt;Every year since 2015, &lt;a&#10; href="https://twitter.com/ericwastl"&#10; title="(opens in new tab)"&#10; rel="external" target="_blank"&#10; &gt;Eric Wastl&lt;/a&gt; creates a two-part programming problem&#10;for each of the 25 days of Advent. He publishes a new problem every day at&#10;&lt;a&#10; href="https://adventofcode.com"&#10; title="(opens in new tab)"&#10; rel="external" target="_blank"&#10; &gt;adventofcode.com&lt;/a&gt; at exactly midnight EST which is&#10;22:00 the day before for me in MST. The last two years, I decided to do the&#10;problems as soon as they came out and streamed my problem solving sessions on my&#10;&lt;a&#10; href="https://twitch.tv/sumnerevans"&#10; title="(opens in new tab)"&#10; rel="external" target="_blank"&#10; &gt;Twitch channel&lt;/a&gt; and uploaded them to &lt;a&#10; href="https://www.youtube.com/@sumnerevans"&#10; title="(opens in new tab)"&#10; rel="external" target="_blank"&#10; &gt;my Youtube channel&lt;/a&gt;. The last&#10;&lt;a&#10; href="https://sumnerevans.com/posts/programming/2021-advent-of-code/"&gt;two&lt;/a&gt;&#10;&lt;a&#10; href="https://sumnerevans.com/posts/programming/2022-advent-of-code/"&gt;years&lt;/a&gt;&#10;I updated a blog post about each of the days, and I will try and do that this&#10;year as well.&lt;/p&gt;</description></item><item><title>Advent of Code 2022</title><link>https://sumnerevans.com/posts/programming/2022-advent-of-code/</link><pubDate>Thu, 01 Dec 2022 09:00:00 -0600</pubDate><guid>https://sumnerevans.com/posts/programming/2022-advent-of-code/</guid><description>&lt;p&gt;Every year since 2015, &lt;a&#10; href="https://twitter.com/ericwastl"&#10; title="(opens in new tab)"&#10; rel="external" target="_blank"&#10; &gt;Eric Wastl&lt;/a&gt; creates a two-part programming problem&#10;for each of the 25 days of Advent. He publishes a new problem every day at&#10;&lt;a&#10; href="https://adventofcode.com"&#10; title="(opens in new tab)"&#10; rel="external" target="_blank"&#10; &gt;adventofcode.com&lt;/a&gt; at exactly midnight EST which is&#10;22:00 the day before for me in MST. The last two years, I decided to do the&#10;problems as soon as they came out and streamed my problem solving sessions on my&#10;&lt;a&#10; href="https://twitch.tv/sumnerevans"&#10; title="(opens in new tab)"&#10; rel="external" target="_blank"&#10; &gt;Twitch channel&lt;/a&gt; and uploaded them to &lt;a&#10; href="https://www.youtube.com/@sumnerevans"&#10; title="(opens in new tab)"&#10; rel="external" target="_blank"&#10; &gt;my Youtube channel&lt;/a&gt;. Last year, I&#10;also updated a&#10;&lt;a&#10; href="https://sumnerevans.com/posts/programming/2021-advent-of-code/"&gt;blog post after each day&lt;/a&gt;&#10;which I intend to do again this year.&lt;/p&gt;</description></item><item><title>Advent of Code 2021</title><link>https://sumnerevans.com/posts/programming/2021-advent-of-code/</link><pubDate>Wed, 01 Dec 2021 09:00:00 -0600</pubDate><guid>https://sumnerevans.com/posts/programming/2021-advent-of-code/</guid><description>&lt;p&gt;Every year since 2015, &lt;a&#10; href="https://twitter.com/ericwastl"&#10; title="(opens in new tab)"&#10; rel="external" target="_blank"&#10; &gt;Eric Wastl&lt;/a&gt; creates a two-part programming problem&#10;for each of the 25 days of Advent. He publishes a new problem every day at&#10;&lt;a&#10; href="https://adventofcode.com"&#10; title="(opens in new tab)"&#10; rel="external" target="_blank"&#10; &gt;adventofcode.com&lt;/a&gt; at exactly midnight EST which is&#10;22:00 the day before for me in MST. Last year, I decided to do the problems as&#10;soon as they came out and streamed my problem solving sessions on my &lt;a&#10; href="https://twitch.tv/sumnerevans"&#10; title="(opens in new tab)"&#10; rel="external" target="_blank"&#10; &gt;Twitch&#10;channel&lt;/a&gt; and uploaded them to &lt;a&#10; href="https://www.youtube.com/channel/UCyrdRO4oJRpszr0ovN1FwBA"&#10; title="(opens in new tab)"&#10; rel="external" target="_blank"&#10; &gt;my Youtube channel&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Respecting Theme Preferences on Your Website</title><link>https://sumnerevans.com/posts/technology/respecting-theme-preferences/</link><pubDate>Tue, 07 Apr 2020 15:00:00 -0600</pubDate><guid>https://sumnerevans.com/posts/technology/respecting-theme-preferences/</guid><description>&lt;p&gt;You may have noticed that dark themes are becoming more and more common across&#10;the computing landscape. Everything from&#10;&lt;a&#10; href="https://www.cnet.com/how-to/windows-10-dark-mode-is-here-turn-it-on-now/"&#10; title="(opens in new tab)"&#10; rel="external" target="_blank"&#10; &gt;Windows 10&lt;/a&gt;,&#10;&lt;a&#10; href="https://support.apple.com/en-us/HT208976"&#10; title="(opens in new tab)"&#10; rel="external" target="_blank"&#10; &gt;macOS Mojave and later&lt;/a&gt;,&#10;&lt;a&#10; href="https://support.apple.com/en-us/HT210332"&#10; title="(opens in new tab)"&#10; rel="external" target="_blank"&#10; &gt;iOS 13+&lt;/a&gt;,&#10;and &lt;a&#10; href="https://www.digitaltrends.com/mobile/how-to-use-dark-mode-in-android/"&#10; title="(opens in new tab)"&#10; rel="external" target="_blank"&#10; &gt;Android 10+&lt;/a&gt;&#10;to&#10;&lt;a&#10; href="https://github.com/elementary-tweaks/elementary-tweaks"&#10; title="(opens in new tab)"&#10; rel="external" target="_blank"&#10; &gt;many&lt;/a&gt;&#10;&lt;a&#10; href="https://wiki.gnome.org/Apps/Tweaks"&#10; title="(opens in new tab)"&#10; rel="external" target="_blank"&#10; &gt;Linux&lt;/a&gt;&#10;&lt;a&#10; href="https://www.tecrobust.com/how-to-enable-dark-theme-dark-mode-in-manjaro-linux-kde/"&#10; title="(opens in new tab)"&#10; rel="external" target="_blank"&#10; &gt;desktop&lt;/a&gt;&#10;&lt;a&#10; href="https://itsfoss.com/dark-mode-ubuntu/"&#10; title="(opens in new tab)"&#10; rel="external" target="_blank"&#10; &gt;environments&lt;/a&gt;&#10;and many&#10;&lt;a&#10; href="https://www.addictivetips.com/web/enable-the-dark-mode-on-chrome/"&#10; title="(opens in new tab)"&#10; rel="external" target="_blank"&#10; &gt;individual&lt;/a&gt;&#10;&lt;a&#10; href="https://www.howtogeek.com/359033/how-to-enable-dark-mode-in-firefox/"&#10; title="(opens in new tab)"&#10; rel="external" target="_blank"&#10; &gt;browsers&lt;/a&gt;&#10;are including dark/light theme toggle settings.&lt;/p&gt;</description></item><item><title>Setting up Pelican to Automatically Deploy to GitLab Pages</title><link>https://sumnerevans.com/posts/technology/pelican-on-gitlab-pages/</link><pubDate>Tue, 27 Aug 2019 23:58:00 -0600</pubDate><guid>https://sumnerevans.com/posts/technology/pelican-on-gitlab-pages/</guid><description>&lt;link rel="stylesheet" href="https://sumnerevans.com/css/vendors/admonitions.53cd9f8afa9d9a8ac09093f668df057bc6d0f4bbd0886f39991a7b99934a7432.css" integrity="sha256-U82fivqdmorAkJP2aN8Fe8bQ9LvQiG85mRp7mZNKdDI=" crossorigin="anonymous"&gt;&#10; &lt;div class="admonition warning"&gt;&#10; &lt;div class="admonition-header"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"&gt;&lt;path d="M256 32c14.2 0 27.3 7.5 34.5 19.8l216 368c7.3 12.4 7.3 27.7 .2 40.1S486.3 480 472 480L40 480c-14.3 0-27.6-7.7-34.7-20.1s-7-27.8 .2-40.1l216-368C228.7 39.5 241.8 32 256 32zm0 128c-13.3 0-24 10.7-24 24l0 112c0 13.3 10.7 24 24 24s24-10.7 24-24l0-112c0-13.3-10.7-24-24-24zm32 224a32 32 0 1 0 -64 0 32 32 0 1 0 64 0z"/&gt;&lt;/svg&gt;&#10; &lt;span&gt;Warning&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="admonition-content"&gt;&#10; &lt;p&gt;This article is out of date, and may contain outdated information.&lt;/p&gt;&#10;&lt;p&gt;Since writing this article, I have made a few major shifts in my personal&#10;website infrastructure. I migrated from GitHub to GitLab and subsequently from&#10;GitLab to sourcehut. Then I migrated from Pelican to &lt;a&#10; href="https://gohugo.io"&#10; title="(opens in new tab)"&#10; rel="external" target="_blank"&#10; &gt;Hugo&lt;/a&gt;&#10;and hosted my website on a Linode VPS for a while before migrating back to&#10;GitHub and GitHub Pages.&lt;/p&gt;&#10; &lt;/div&gt;&#10; &lt;/div&gt;&lt;p&gt;I posted last year about my switch from WordPress to a statically generated site&#10;generated by Pelican by GitHub Pages in a&#10;&lt;a&#10; href="https://sumnerevans.com/posts/technology/pelican-on-github-pages/"&gt;blog post&lt;/a&gt;. Since then, my hosting&#10;situation has changed a couple of times. I first migrated to deploy straight to&#10;a DigitalOcean Droplet from Travis CI. Then, I migrated to GitLab and used&#10;GitLab CI/CD to do the same thing. Now that GitLab Pages has support for&#10;automatically handling the Let&amp;rsquo;s Encrypt SSL Certificate on custom domains, I&amp;rsquo;ve&#10;moved to GitLab Pages for hosting as well.&lt;/p&gt;</description></item><item><title>Setting up Pelican to Automatically Deploy to GitHub Pages</title><link>https://sumnerevans.com/posts/technology/pelican-on-github-pages/</link><pubDate>Mon, 11 Sep 2017 09:02:00 -0600</pubDate><guid>https://sumnerevans.com/posts/technology/pelican-on-github-pages/</guid><description>&lt;link rel="stylesheet" href="https://sumnerevans.com/css/vendors/admonitions.53cd9f8afa9d9a8ac09093f668df057bc6d0f4bbd0886f39991a7b99934a7432.css" integrity="sha256-U82fivqdmorAkJP2aN8Fe8bQ9LvQiG85mRp7mZNKdDI=" crossorigin="anonymous"&gt;&#10; &lt;div class="admonition warning"&gt;&#10; &lt;div class="admonition-header"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"&gt;&lt;path d="M256 32c14.2 0 27.3 7.5 34.5 19.8l216 368c7.3 12.4 7.3 27.7 .2 40.1S486.3 480 472 480L40 480c-14.3 0-27.6-7.7-34.7-20.1s-7-27.8 .2-40.1l216-368C228.7 39.5 241.8 32 256 32zm0 128c-13.3 0-24 10.7-24 24l0 112c0 13.3 10.7 24 24 24s24-10.7 24-24l0-112c0-13.3-10.7-24-24-24zm32 224a32 32 0 1 0 -64 0 32 32 0 1 0 64 0z"/&gt;&lt;/svg&gt;&#10; &lt;span&gt;Warning&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="admonition-content"&gt;&#10; &lt;p&gt;This article is out of date, and may contain outdated information.&lt;/p&gt;&#10;&lt;p&gt;Since writing this article, I have made a few major shifts in my personal&#10;website infrastructure. I migrated from GitHub to GitLab and subsequently from&#10;GitLab to sourcehut. Then I migrated from Pelican to &lt;a&#10; href="https://gohugo.io"&#10; title="(opens in new tab)"&#10; rel="external" target="_blank"&#10; &gt;Hugo&lt;/a&gt;&#10;and hosted my website on a Linode VPS for a while before migrating back to&#10;GitHub and GitHub Pages.&lt;/p&gt;&#10; &lt;/div&gt;&#10; &lt;/div&gt;&lt;p&gt;I recently converted my site from WordPress to a statically generated&#10;&lt;a&#10; href="https://blog.getpelican.com/"&#10; title="(opens in new tab)"&#10; rel="external" target="_blank"&#10; &gt;Pelican&lt;/a&gt; site hosted on GitHub Pages. One of the&#10;most difficult parts of the transition was setting it up to automatically deploy&#10;to GitHub Pages. In this article, I will describe how I set this up.&lt;/p&gt;</description></item></channel></rss>