Since 2017-02-01 I've been working on a big change to Sweetroll, the engine that powers this website, and today it's finally live, right here! (Also it's now on my newer VPS, hosted at prgmr and running HardenedBSD 11. The old one was FreeBSD 10 at DigitalOcean.)

tl;dr about the change: from one Haskell app powered by a Git+JSON store and embedded Duktape templates (lol) to two services (Haskell + Node.js) backed by Postgres. It's really cool. I'll be writing more documentation for it soon.

(This post contains Haskell.)

Landed a couple pull requests (jwt, wai-app-static) that replace the deprecated cryptohash package with cryptonite, because having both as dependencies in sweetroll was terrible.

Also, turns out highlighting-kate has a pcre-light option, so now regex-pcre-builtin isn’t compiled into sweetroll as well. I wish pandoc had a build option to disable Lua script integration. Oh, and build options to disable formats! That would be great. I don’t need docx and epub support in my website.

“Why is my app saying it can’t load my templates because it’s not valid UTF-8?!??!”

It’s been reading .DS_Store. Facepalm.

Accidentally reposted something from Tantek using Monocle. Reposts aren’t supported in Sweetroll yet, so I deleted that post, but not before looking at the JSON and noticing that my parser didn’t understand the publishing date…

<span class="dt-published published dt-updated updated">
  <time class="value" datetime="05:55-0700">05:55</time> on <time class="value">2015-08-28</time>
</span>

Turns out I missed the whole “Date and time parsing” section of the value-class-pattern! Fixed.

Webmention endpoint discovery in Haskell. Probably the best function ever written :-)

This is how I search for it in HTML.

listToMaybe $ unsafePerformIO $ runX $ htmlDoc //> hasAttrValue "rel" isWebmentionRel >>> getAttrValue "href"

Why unsafePerformIO? Because there’s no reason for HTML parsing to depend on IO, but they’ve implemented parsing strings as parsing files with the string protocol.