<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.4.1">Jekyll</generator><link href="/2013/feed.xml" rel="self" type="application/atom+xml" /><link href="/2013/" rel="alternate" type="text/html" /><updated>2026-06-12T06:02:56+00:00</updated><id>/2013/feed.xml</id><title type="html">Compiled Thoughts</title><subtitle>Olav Ringdal writes about software. No database was harmed in the rendering of this page.</subtitle><author><name>Olav Ringdal</name></author><entry><title type="html">How I migrated this blog from WordPress to Jekyll</title><link href="/2013/02/how-i-migrated-this-blog-from-wordpress-to-jekyll/" rel="alternate" type="text/html" title="How I migrated this blog from WordPress to Jekyll" /><published>2013-02-16T20:14:00+00:00</published><updated>2013-02-16T20:14:00+00:00</updated><id>/2013/02/how-i-migrated-this-blog-from-wordpress-to-jekyll</id><content type="html" xml:base="/2013/02/how-i-migrated-this-blog-from-wordpress-to-jekyll/"><![CDATA[<p>If you can read this, the DNS change went through, and this blog is now a static site. No more WordPress. I want to walk you through why, and how, partly because the process might help someone else, and partly because — let’s be honest — a new blog needs a first post, and the law says it has to be this one.</p>

<h2 id="why-i-left-wordpress">Why I left WordPress</h2>

<p>Two weeks ago I got an email from a stranger kindly informing me that <a href="/">my blog</a> was serving hidden links to a pharmacy in a country I will not name. Somewhere between a stale plugin and a theme I installed in 2009, wp-admin had quietly become a shared resource. I spent a weekend cleaning the database, changing every password, and reading about file permissions, and somewhere around hour eleven I asked the obvious question: <strong>why does my blog — twelve posts of text — need a PHP runtime, a MySQL database, and a security posture?</strong></p>

<p>It doesn’t. Nothing about a blog is dynamic. The comments were spam anyway.</p>

<h2 id="enter-jekyll">Enter Jekyll</h2>

<p><a href="https://jekyllrb.com/">Jekyll</a> renders plain text into a static site. The workflow is the kind of thing you describe to other developers slowly, so you can watch their faces:</p>

<ul>
  <li>Posts are <strong>Markdown files</strong>. In a folder. <strong>In git, like God intended.</strong></li>
  <li><code class="language-plaintext highlighter-rouge">jekyll build</code> turns them into HTML. There is nothing to hack, because there is nothing running.</li>
  <li>GitHub Pages hosts it <strong>for free</strong>, straight from the repository. Push to publish.</li>
</ul>

<div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$ </span>gem <span class="nb">install </span>jekyll
<span class="nv">$ </span>jekyll new blog <span class="o">&amp;&amp;</span> <span class="nb">cd </span>blog
<span class="nv">$ </span>jekyll serve
</code></pre></div></div>

<p>That’s the entire stack. Ruby felt like a perfectly stable foundation to build on, and I can’t imagine that opinion changing.</p>

<p>The migration: exported the WordPress XML, ran it through <code class="language-plaintext highlighter-rouge">jekyll-import</code>, fixed up a dozen posts by hand (mostly <code class="language-plaintext highlighter-rouge">&lt;pre&gt;</code> tags), and — crucially — configured the permalinks to keep WordPress’s <code class="language-plaintext highlighter-rouge">/year/month/title/</code> structure, so every existing URL keeps working. Whatever else changes about this blog, and I don’t expect much to, <strong>the URLs will never break</strong>. You can hold me to that.</p>

<h2 id="whats-next">What’s next</h2>

<p>Writing, mostly. That’s the point of all this: with no database to patch and no plugins to update, the only thing left to do with this blog is write in it. I’ve already got a queue: a post on Vim macros, one on why CoffeeScript is probably the future, and a long one about deployment scripts.</p>

<p>The friction is gone. See you next week.</p>

<p><em>— Olav</em></p>]]></content><author><name>Olav Ringdal</name></author><summary type="html"><![CDATA[If you can read this, the DNS change went through, and this blog is now a static site. No more WordPress. I want to walk you through why, and how, partly because the process might help someone else, and partly because — let’s be honest — a new blog needs a first post, and the law says it has to be this one.]]></summary></entry></feed>