Switching to Static
For those of you who frequently read this blog (n ≈ 0) you'll notice that it looks a bit different. I've moved it from my own hosted Wordpress instance to static pages generated by Nikola and hosted up on Github.
Why bother? I didn't like my blog being something I wouldn't be proud to write or operate myself. Wordpress was overkill and not worth the trouble:
-
Wordpress is database driven for dynamic sites. My little blog isn't dynamic at all. Once you buy into the static idea, lots of otehr things fall into place.
-
Comments and account spam are still is a nuisance. The nice people at Akismet have done a great job holding back the tide, but I still get at least one bogus registration a day. I expect a service like Disqus or Facebook or Google+ will be more likely to keep pace with the spammers.
-
I want to author in markdown; maybe even ReST someday. All this wysiwyg-ish stuff in browsers is for the birds.
-
I don't actually need to host anything. I'm not running my own IRC server or anything. Even though Dreamhost has been a perfectly good service, I just want something... well, less Wordpress-ey.
Choosing
So I need to pick a static web site hosting package, specifically one that is good for blogs. The big things I was looking for: static site generation, Markdown/ReST support, and ability to host on free services like Github Pages.
In additon I wanted these things (in no particular order):
-
active development
-
in real use on real sites
-
easy customization, ideally by theming
-
ability to move over posts and comments, probably via Wordpress's export function.
-
python, what I program in for fun
-
a bit extensible
I considered three options before settling on Nikola. There are a ton of static site generators, even when you limit them to Python. But the only alternatives I seriously looked at were Pelican and Hyde. Of these Nikola seems to have the most active development and the richest set of features. I ease especially drawn by their good documentation and theming.
Up and Running
Here are my notes of what it took. This isn't a nicely-written howto, but if you want to see the blow-by-blow, read on.
-
The software was easy to set up and get started
-
pip install nikola
did the right thing. Of course within a virtual environment, you have to keep the lab clean! -
Along the way I found a few other requirements, like request, phpserialize, and markdown. These were easy to find/fix because of helpful error messages.
-
This is all now captured in the project's
requirements.txt
.
-
-
Initial import from wordpress XML dump went ok but a fair bit of manual HTML prettification took some time.
-
The slugs aren't how I like them:
201311seven-things.wp
instead ofseven-things.wp
. I tried a bit to do mass rewrite of those, but couldn't easily do that without breaking everything, so just decided to let this go for now. I'll just do slugs without dates going forward. -
I considered html2text but figured I'd just let the HTML slide for now. Too much trouble to go back and clean all that up now.
-
The "wp" extension, by default, is mapped to markdown instead of html. Odd but easy to change.
-
Nikola has a nice simple redirect facility that the importer pre-populated for me.
-
-
Migrate threads to Disqus - clean and simple, worked right out of the box.
-
wordpress plugin has a nice import facility. Said it'd take a day, but didn't take that long at all. Aside from one thread with 75 comments, not much else that should cause them much heartache.
-
nice simple URL mapping utility
-
-
Publishing to github. Again, easy peasy. The way to make this work is to put all your static files in a repo titled
USERNAME.github.io
. In my case:sefk.github.io
. Just a couple of "tricks" were needed to make this work smoothly:-
So that it would correctly serve my own domain, you have to put a CNAME file in the root of the repo
-
I put my nikola themes and source files in the "src" subdirectory, and changed the
OUTPUT_DIR
configuration option to..
. Github Pages wants things in the root.
-
-
The final swich. I moved my domain from Dreamhost over to Gandi, which is the registrar I like to use. They throw in basic DNS with registration, which is sufficient for me.
So There You Have It
So far I am really pleased with the result. It's a bit more work to publish, but for me that's natural and what I want. I guess I wouldn't recommend this to someone who isn't adept with all these bits (virtual environments, DNS, github repos, etc.) but for me that's no problem.
Thanks to:
-
Using livereload with Nikola makes for a very nice workflow. Check out this blog post that describes how. Very helpful post, thanks to Joshua Barratt for sharing.