Minimal-Mistakes-Jekyll - Setup and Configuration

This guide should make it easier for contributors to understand how this site works. It should also be useful as a way to learn the basics of using Jekyll with the Minimal Mistakes theme, to publish a website via GitHub pages.

Granted, you don’t need to know all of this to simply add content to a page.

I’m just sharing this here, for anyone who is interested.

Why Minimal Mistakes?

Generally speaking, I like to use and learn a variety of static site generators and their themes.

However, I’ve used Minimal Mistakes to publish large websites and small web-sites. It really works. It works well. Even before you know how to use all of it’s features, its a really reliable framework.

It supports an incredible variety of functions that simply work. So for building public-domain educational resources, it makes sense for me to stick with what’s tried and true. I’ve tried to find other themes that offer a comprable feature set, and it’s not easy.

Much respect to Michael Rose!!

I’ve used a few of his themes; they are well put together, often ported to other SSGs besides Jekyll, and really a class of their own when it comes to Jekyll themes.

Getting Started

You shouldn’t need the above for our imediate purposes, but will likely find them useful at some point.


You must have installed Git,` and the Ruby Bundler.

I’ll also recommend using VSCode, because it’s fully integrated with git, so that you don’t have to worrying about learning git commands.

Also, I usually create a new repository on github, first. Then I clone it locally, again, avoiding the terminal. Meaning we can learn git in more depth, at our leisure.

Site Structure

Before we get started, here is a high-level view of the site-structure.

├── _data                      # data files for customizing the theme
|  ├── navigation.yml          # main navigation links
|  └── ui-text.yml             # text used throughout the theme's UI
├── _includes
|  ├── analytics-providers     # snippets for analytics (Google and custom)
|  ├── comments-providers      # snippets for comments
|  ├── footer                  # custom snippets to add to site footer
|  ├── head                    # custom snippets to add to site head
|  ├── feature_row             # feature row helper
|  ├── gallery                 # image gallery helper
|  ├── group-by-array          # group by array helper for archives
|  ├── nav_list                # navigation list helper
|  ├── toc                     # table of contents helper
|  └── ...
├── _layouts
|  ├── archive-taxonomy.html   # tag/category archive for Jekyll Archives plugin
|  ├── archive.html            # archive base
|  ├── categories.html         # archive listing posts grouped by category
|  ├── category.html           # archive listing posts grouped by specific category
|  ├── collection.html         # archive listing documents in a specific collection
|  ├── compress.html           # compresses HTML in pure Liquid
|  ├── default.html            # base for all other layouts
|  ├── home.html               # home page
|  ├── posts.html              # archive listing posts grouped by year
|  ├── search.html             # search page
|  ├── single.html             # single document (post/page/etc)
|  ├── tag.html                # archive listing posts grouped by specific tag
|  ├── tags.html               # archive listing posts grouped by tags
|  └── splash.html             # splash page
├── _sass                      # SCSS partials
├── assets
|  ├── css
|  |  └── main.scss            # main stylesheet, loads SCSS partials from _sass
|  ├── images                  # image assets for posts/pages/collections/etc.
|  ├── js
|  |  ├── plugins              # jQuery plugins
|  |  ├── vendor               # vendor scripts
|  |  ├── _main.js             # plugin settings and other scripts to load after jQuery
|  |  └── main.min.js          # optimized and concatenated script file loaded before </body>
├── _config.yml                # site configuration
├── Gemfile                    # gem file dependencies
├── index.html                 # paginated home page showing recent posts
└── package.json               # NPM build scripts

CSS - Stylesheets

At the moment, I’m quite CSS agnostic. One thing at a time.. However, if you wanted to add a little style to the page, the community might appreciate that.

The theme’s assets/css/main.css file is built from several SCSS partials located in _sass/ and is structured as follows:

├── _sass
|  └── minimal-mistakes
|     ├── vendor               # vendor SCSS partials
|     |   ├── breakpoint       # media query mixins
|     |   ├── magnific-popup   # Magnific Popup lightbox
|     |   └── susy             # Susy grid system
|     ├── _animations.scss     # animations
|     ├── _archive.scss        # archives (list, grid, feature views)
|     ├── _base.scss           # base HTML elements
|     ├── _buttons.scss        # buttons
|     ├── _footer.scss         # footer
|     ├── _masthead.scss       # masthead
|     ├── _mixins.scss         # mixins (em function, clearfix)
|     ├── _navigation.scss     # nav links (breadcrumb, priority+, toc, pagination, etc.)
|     ├── _notices.scss        # notices
|     ├── _page.scss           # pages
|     ├── _print.scss          # print styles
|     ├── _reset.scss          # reset
|     ├── _sidebar.scss        # sidebar
|     ├── _syntax.scss         # syntax highlighting
|     ├── _tables.scss         # tables
|     ├── _utilities.scss      # utility classes (text/image alignment)
|     └── _variables.scss      # theme defaults (fonts, colors, etc.)
├── assets
|  ├── css
|  |  └── main.scss            # main stylesheet, loads SCSS partials in _sass

To make basic tweaks to theme’s style Sass variables can be overridden by adding to <your_project>/assets/css/main.scss. For instance, to change the link color used throughout the theme add:

$link-color: red;


There are a number of other variables, you may find by following the link. These are the variables I have changed, so far. Before messing with CSS please check the variables, to be sure you aren’t doing too much work!

Changing the Font-Size

So what you can do is add any overriding/new CSS after the @import minimal-mistakes;, in your case:

@import "minimal-mistakes";

html {
  font-size: 16px; // change to whatever

  @include breakpoint($medium) {
    font-size: 18px; // change to whatever

  @include breakpoint($large) {
    font-size: 20px; // change to whatever

  @include breakpoint($x-large) {
    font-size: 22px; // change to whatever

Because this theme is entirely responsive, if you want to change the font-size, you should do it like so.

Minimal Mistakes Initial Setup

I clone minimal-mistakes into the same directory as whatever website I’m working on, so they are right next to eachother.

git clone

Then I copy over these files and directories to the folder that is linked to the github repository where I want to be able to publish it from.

According to the quickstart guide, when forking these can be safely deleted:


I’ve moved /docs and /test to /example-site, and added .git, since we’re cloning the project, but not forking it, we won’t be keeping them linked and can also remove the .git file, and then copied everything that’s left over to my project directory, that has its own history and .git files.

I might delete some of the layouts and includes, later. test push I’m pretty sure all I need is a gem-file and _config.yml. The Gem Install means that GitHub will use a Ruby Gem Package that contains everything needed to run the website. You only need the files that you want to customize or configure somehow. For me, I usually need to change the head, and footer, as well as the social share, but I also change the home layout.. well you see it’s easier to just have them all, if you want to customize, at all.

I’m just starting to get comfortable existing with CSS, I’ve even edited some _scss files, now and again, producing the desired effect. However, that’s not my strength.


The gem-file must be properly set up to build and test your changes locally. Not necessary for minor changes, but if you get very deep into working on a web-site, you’ll not want to depend on live testing every change ;)

I’m following instructions from Minimal-Mistakes Quick-Start Guide, but also I’ve figured some of this out as I go.

Change the Gemfile so it looks like so:

gem "github-pages", group: :jekyll_plugins

# To upgrade, run `bundle update`.

gem "github-pages", group: :jekyll_plugins

# If you have any plugins, put them here!

group :jekyll_plugins do
  gem "jekyll-paginate"
  gem "jekyll-sitemap"
  gem "jekyll-gist"
  gem "jekyll-feed"
  gem "jemoji"
  gem "jekyll-include-cache"
  gem "jekyll-redirect-from"
  gem "jekyll-mentions"
  gem "html-proofer"  

Every plugin listed in your _config.yml should be also listed in your gem-file, if you want it to work locally, and if your features depend on some of these plugins, then its best to put them in the gemfile as well.

Then, once saved, run the bundle command in the root directory of your project.

bundle install then bundle update then bundle exec jekyll serve

if all went well you should be looking at a screen like this:


We’ll aim to keep this page updated with whatever is the most recent configuration, with notes of explanation when necessary.

minimal_mistakes_skin    : "air" # "air", "aqua", "contrast", "dark", "dirt", "neon", "mint", "plum", "sunrise"

# Site Settings
locale                   : "en-US"
title                    : "Sovereign ID Curated"
title_separator          : "| "
name                     : "Infominer"
description              : "Creating a Vendor Agnostic, User-Controlled, Identity Layer for the Internet."
url                      : ""
baseurl                  : ""
repository               : "didecentral/"
github                   : [metadata]
teaser                   : /images/didecentral-tw.png
logo                     : ""
masthead_title           : "Identity Decentralized"
# breadcrumbs            : false # true, false (default)
words_per_minute         : 200
  provider               : # "staticman_v2"
  allowedFields          : ["name", "email", "url", "message"]
  repository             : didecentral/ 
  branch                 : "master"
  commitMessage          : "New comment by {}"
  filename               : comment-{@timestamp}
  format                 : "yml"
  moderation             : true
  path                   : "_data/comments/{options.slug}"
  requiredFields         : ["name", "email", "message"]

I don’t have comments on this site, I just tested them out on the ‘community site’. I will set this up for Algolia Search, soon, and provide the deets on that.

# Social Sharing
  username               : "infominer33"
  site: "didecentral"
#  description            : "Resources for Creating a Vendor Agnostic, User-Controlled, Identity Layer for the Internet."
#  image                  : ""
  username               :
  app_id                 :
  publisher              :
og_image                 :
# For specifying social profiles
# -
  type                   : # Person or Organization (defaults to Person)
  name                   : # If the user or organization name differs from the site's name
  links: # An array of links to social media profiles

# Analytics
  provider               : google # false (default), "google", "google-universal", "custom"
    tracking_id          : UA-132558656-3
    anonymize_ip         : true

# Site Author
  name             : "DIDecentral"
  avatar           : /images/did-square.png
  bio              : "Collaborative Curation, Community Research Initiative"
  location         : "Curating the Web"
    - label: "Email"
      icon: "fas fa-fw fa-envelope-square"
    - label: "Website"
      icon: "fas fa-fw fa-link"
      url: ""
    - label: "GitHub"
      icon: "fab fa-fw fa-github"
      url: ""
    - label: "Twitter"
      icon: "fab fa-fw fa-twitter-square"
      url: ""

# Site Footer
    - label: "Email"
      icon: "fas fa-fw fa-envelope-square"
    - label: "Website"
      icon: "fas fa-fw fa-link"
      url: ""
    - label: "Twitter"
      icon: "fab fa-fw fa-twitter-square"
      url: ""
    - label: "GitHub"
      icon: "fab fa-fw fa-github"
      url: ""

I just went to and it’s pretty simple to try and match above formula without thinking too deeply on the matter.

The permalink default defines permalinks, in the case that they are not defined within a post.

# Outputting
permalink: /:categories/:slug/  #
paginate: 5 # amount of posts to show
paginate_path: /page:num/
timezone: #

  type: liquid
  path: /categories/
  type: liquid
  path: /tags/

You also need a page for both categories and tags in _pages, if you want a page to show at that URL.

_config.yml - Frontmatter Defaults

You can over-ride these defaults on a page-by-page basis.

    output: true
    permalink: /how-to-contribute/:path/

# Defaults
  # _pages
  - scope:
      path: "_pages"
      type: pages
      layout: single
      author_profile: false
      read_time: false
      comments: # true
      share: true
      related: true
        title: DIDecentral
        nav: didnav
      toc: true
      toc_sticky  : true  
  # _posts
  - scope:
      path: "_posts"
      type: posts
      layout: single
      author_profile: false
      read_time: true
      comments: # true
      share: true
      classes: wide
      related: true
        title: DIDecentral
        nav: didnav
      toc: true
      toc_label   : "Contents"
      toc_icon    : "link"
      toc_sticky  : true
  # _HowToContribute
  - scope:
      path: "_HowToContribute"
      type: HowToContribute
      layout: single
      share: true
      related: true
        nav: "didnav"
      classes: wide


Then if you look up there in the front-matter defaults, you’ll see where the navigation is called as a part of the sidebar class.

# main links
  - title: "Our Aim"
    url: "/aim/"
  - title: "Posts by Tag"
    url: "/tags/"
  - title: "Sitemap"
    url: "/sitemap/"
  - title: "identitywoman/identity-commons"
    url: ""
  - title: "RebootingWebOfTrust - Archive"
    url: ""
  - title: "Decentralized Web - History"
    url: ""

# DID Nav
  - title: "History"
    url: "/history/"  
      - title: " Resources & Pre-History"
        url: "/history/"
      - title: " 2000-2009"
        url: "/history/2000-2009/"
      - title: " 2010-2014"
        url: /history/2010-2014/
      - title: " 2015-2019"
        url: /history/2015-2019/
  - title: Feature
      - title: " Web Standards"
        url: "/specs-standards/"
      - title: " - JSON-LD"
        url: "/specs-standards/JSON-LD/"
      - title: " GitHub Repositories"
        url: "/code/github/"
      - title: " - Identity Commons on Github"
        url: ""
      - title: " Literature"
        url: "/literature/" 
      - title: " - RWoT - Papers Index"
        url: "/literature/rebooting-web-of-trust/"
      - title: " - Microledgers and Edgechains"
        url: "/hyperledger/hgf-2018/Microledgers-Edgechains-Hardman-HGF/"
      - title: " #indieweb-dev on IIW RWoT and DID's"
        url: " /chatlog/indieweb-dev-on-did/"

Social Share

This is the code that makes social share and donation button on each page. The Bitcoin,, and DOGE addresses are specific for DIDecentral, and currently under @infominer33’s control.


<section class="page__share">
<h2><a href="{{ page.path }}" class="edit">Edit this page <i class="fa fa-pencil"></i></a></h2>
<h3>Social Share</h3>
<a href="{% if site.twitter.username %}via={{ site.twitter.username | url_encode }}&{% endif %}text={{ page.title | url_encode }}%20{{ page.url | absolute_url | url_encode }}" class="btn btn--twitter" onclick=", 'window', 'left=20,top=20,width=500,height=500,toolbar=1,resizable=0'); return false;" title="Share on Twitter"><i class="fab fa-fw fa-twitter" aria-hidden="true"></i><span> Twitter</span></a>
<a href="{{ page.url | absolute_url | url_encode }}" class="btn btn--facebook" onclick=", 'window', 'left=20,top=20,width=500,height=500,toolbar=1,resizable=0'); return false;" title="Share on Facebook"><i class="fab fa-fw fa-facebook" aria-hidden="true"></i><span> Facebook</span></a>
<a href="{{ page.url | absolute_url | url_encode }}" class="btn btn--linkedin" onclick=", 'window', 'left=20,top=20,width=500,height=500,toolbar=1,resizable=0'); return false;" title="Share on LinkedIn"><i class="fab fa-fw fa-linkedin" aria-hidden="true"></i><span> LinkedIn</span></a>
<a href="{{ page.url | absolute_url | url_encode }}&title={{ page.title | url_encode }}" class="btn btn--reddit" title="Share on Reddit"><i class="fab fa-fw fa-reddit" aria-hidden="true"></i><span> Reddit</span></a>
<h3>Tips Welcome</h3>
<table class="table table-bordered table-hover table-condensed">
      <th title="Field #1">Bitcoin</th>
      <th title="Field #2">DOGE</th>
      <td><img src="" width="150"></td>
      <td><img src="/images/doge-address.png" width="150"></td>
<!-- Beginning of Button -->
<div id="tippin-button" data-dest="didecentral"></div>
<script src="" type="text/javascript"></script>
<!-- End of Button -->

Reddit Button


If you copy that part to get the reddit button included with the others, you might find that you are missing the actual button.

just head over to buttons.css :rofl: (idk why that’s so funny to me)

  /* button colors */
  (primary, $primary-color),
  (inverse, #fff),
  (light-outline, transparent),
  (success, $success-color),
  (warning, $warning-color),
  (danger, $danger-color),
  (info, $info-color),
  (facebook, $facebook-color),
  (twitter, $twitter-color),
  (linkedin, $linkedin-color),
  (reddit, $reddit-color);

Because the Reddit Color is already defined in _variables.scss, all you need to do is reference it here.

Author vs Authors

There are two variables that must always be considered.

Author, is for the initial or primary author. Authors is for all the people who have contributed to that document.

So if you make a new post be sure to set both in your front-matter

title: "Your Awesome Post"
author: "AwesomeYou"
authors: ["AwesomeYou"]

Then if I came and touched up your post, I would add myself to the authors:

title: "Your Awesome Post"
author: "AwesomeYou"
authors: ["AwesomeYou","infominer33"]

Every post and page should have these, but I’m used to being the only author, so that will require some work, or maybe will leave old articles alone… not sure

Authors Code

This was really crudely hacked together from the other lists in this section.


<p class="page__taxonomy">
    <strong><i class="fas fa-fw fa-users" aria-hidden="true"></i> Authors:</strong>
    {% assign authorCount = page.authors | size %}
    {% if authorCount == 0 %}
        No author
    {% elsif authorCount == 1 %}
        {{ page.authors | first }}
    {% else %}
        {% for author in page.authors %}
            {% if forloop.first %}
            <a href="{{ author.url }}" rel="author">{{ author }}</a>
            {% elsif forloop.last %}
                and <a href="{{ author.url }}" rel="author">{{ author }}</a>
            {% else %}
                , <a href="{{ author.url }}" rel="author">{{ author }}</a>
            {% endif %}
        {% endfor %}
    {% endif %}


Also, I added this line to the page taxonomy:

{% if page.authors %}
  {% include authors-list.html %}
{% endif %}

To be continued….

There are a number of tweaks that I make to minimal-mistakes sites. All will be explained :D