Pelican CMS
Jekyll
Originally, I had decided to locally host a Jekyll install instead of running through Github Pages. This was actually a pretty bad idea. Not only did I have the added complexity of patching the VPS, but I also had to maintain things like SSL certificates. I also had to run a reverse proxy from NGINX in order to serve SSL. This was pretty bonkers for a static content blog so I decided to go with another CMS.
Porting Jekyll content to Pelican
I love markdown. Content migration was a breeze. I realistically only needed to make a couple of small edits for how the content was classified.
Theme
I really like bootstrap. It’s fairly easy to use and allows for easier design. I used the “pelican-bootstrap3 theme.”
Images
I wanted to add colorbox to all my images. There was actually a guide online that was very helpful and I can guarantee that it does a better job of explaining the steps. You can find the link here.
pelicanconf.py
If you’re curious about what my pelicanconf.py looks like, it is as follows. I apologize for the lack of any order.
#!/usr/bin/env python
# -*- coding: utf-8 -*- #
from __future__ import unicode_literals
AUTHOR = 'Colin Murray'
SITENAME = 'Web Security'
SITESUBTITLE = 'Web Security Blog by Colin Murray.'
BANNER_SUBTITLE = 'A blog by Colin Murray'
SITEURL = 'https://murraycolin.org'
DEFAULT_CATEGORY = 'Tech'
TWITTER_USERNAME = 'murraycolinc'
TYPOGRIFY = True
SLUGIFY_SOURCE = 'title'
DISPLAY_CATEGORIES_ON_SIDEBAR = True
DISPLAY_CATEGORIES_ON_MENU = None
GZIP_CACHE = True
SHOW_SERIES = True
DISPLAY_TAGS_ON_SIDEBAR = True
TAG_CLOUD_MAX_ITEMS = 5
DIRECT_TEMPLATES = ['index', 'categories', 'authors', 'archives']
MENUITEMS = [
('About Me', 'https://murraycolin.com'),
('You\'re Being Reported', 'https://yourebeingreported.com'),
('Emulated Security', 'https://emulatedsecurity.com'),
('Thrifty Under Thirty', 'https://thriftyunderthirty.com'),
]
ABOUT_ME = ("Colin Murray is a cyber security analyst at Distil Networks.\n
He focuses on web application security,\n
but has a tendency to dabble in programming\n
and networking. For fun,\n
he enjoys music, aviation, and breaking web apps.")
AVATAR = 'static/avatar.jpg'
PATH = 'content'
TIMEZONE = 'America/Los_Angeles'
DEFAULT_LANG = 'en'
# Feed generation is usually not desired when developing
FEED_DOMAIN = SITEURL
FEED_ALL_ATOM = 'feeds/all.atom.xml'
CATEGORY_FEED_ATOM = 'feeds/%s.atom.xml'
TRANSLATION_FEED_ATOM = None
AUTHOR_FEED_ATOM = None
AUTHOR_FEED_RSS = None
GOOGLE_ANALYTICS = N/A
# Blogroll
SOCIAL = (
('About Me', 'https://murraycolin.com', 'user'),
('Twitter', 'http://twitter.com/murraycolinc'),
('Github', 'https://github.com/murraycolin'),
('Linkedin', 'https://linkedin.com/in/murraycolinc='),
('Email', 'mailto:colin@murraycolin.com', 'envelope'),
)
DEFAULT_PAGINATION = 10
# Uncomment following line if you want document-relative URLs when developing
RELATIVE_URLS = True
DISPLAY_TAGS_INLINE = None
BANNER = 'static/banner.jpg'
FAVICON = 'static/favicon.jpg'
# path-specific metadata
EXTRA_PATH_METADATA = {
'static/robots.txt': {'path': 'static/robots.txt'},
'static/favicon.jpg': {'path': 'static/favicon.jpg'},
}
# static paths will be copied without parsing their contents
STATIC_PATHS = [
'static',
'static/robots.txt',
'static/favicon.ico',
'images',
'pdfs',
]
THEME = 'pelican-themes/pelican-bootstrap3'
JINJA_ENVIRONMENT = {'extensions': ['jinja2.ext.i18n']}
PLUGIN_PATHS = ['pelican-plugins/']
PLUGINS = ['i18n_subsites', 'related_posts',
'tipue_search', 'optimize_images', 'yuicompressor', 'series', 'tag_cloud']
BOOTSTRAP_THEME = 'flatly'
SHOW_ARTICLE_CATEGORY = True
DISPLAY_BREADCRUMBS = True
This configuration is still undergoing some major changes.