One of the main reasons to use a static site generator like Jekyll is the automation it provides for repetitive tasks and page generation. In Jekyll many of those automations are driven by the configuration file _config.yml. In order to harness the true power of Jekyll it’s important to understand how this file works and what your options are when using it.

The _config.yml sits in the root of your source directory and, as the name suggests, controls the configuration options for your site. Let’s break down the options in the sample _config.yml that’s created when you generate a new Jekyll site before moving on to covering the Global config options.

# Site settings

title: Your awesome site
email: your-email@domain.com
description: > # this means to ignore newlines until "baseurl:"
    Write an awesome description for your new site here.
    You can edit this line in _config.yml. It will appear
    in your document head meta (for Google search results)
    and in your feed.xml site description.
baseurl: "" # the subpath of your site, e.g. /blog/
url: "http://yourdomain.com" # the base hostname & protocol for your site
twitter_username: jekyllrb
github_username:  jekyll

# Build settings

markdown: kramdown

The important thing to note here is that they’ve split the configuration options into two sections, site settings and build settings. All of the site settings other than baseurl and url are basically site variables that can be reused throughout the site. As such, they are all optional. Storing the title of the site in a variable, for instance, makes it easy to set the title element for pages, or to use it in a heading element on a page. By setting these variables in the _config.yml file they are available to any page throughout the site. You could access the title, for example, by using the Liquid tag {{site.title}}.

There is a difference between the site.url and site.baseurl objects and when you need them. By default, the site.url variable is used in the page head for things like canonical links and links to the RSS feed that are accessed by external systems, although it can be used to create absolute links within your site.

The site.baseurl variable indicates the root folder of your site. By default it is set to “ “ (empty string), which indicates your site is hosted at the root of http://yourdomain.com. However, if your site is located in http://yourdomain.com/blog, you have to set site.baseurl to /blog (note the slash). This will allow you to create relative links to assets that load correctly.

When creating your own site, you should give careful consideration to what type of information to store in your _config.yml file. Being able to access this data at any time throughout your site is a powerful option.

Below the site settings the default config file contains a section for “build settings.” Even though they only include a single option here, this section hints at the fact that you can use the _config.yml file to control much of the site’s serve and build options. The lone option here instructs Jekyll to use Kramdown as its Markdown converter. Here are a few other options you can use when controlling the serve and build processes:

###local port

port: PORT

Listen to the given port. 4000 is the default.

###base URL

baseurl: URL

Serves the website from the given base URL, for example /blog would serve the home page from the blog subdirectory. Can be used to construct URLs throughout the site as well.

###source

source: <directory>

Sets the directory Jekyll uses as the root directory for building files. By default it’s the current directory that the build command is run in.

###destination

destination: <directory>

Sets the directory where Jekyll writes the built site. By default Jekyll creates a _site directory in the source directory.

###exclude

exclude: [DIR, FILE, ...]

Lists files and directories to exclude from the build process. Useful for source asset files like .psd files and other files that are not part of the build process or final site.

###include

include: [DIR, FILE, ...]

Lists files and directories that are copied over to the finished site regardless of their filetype or extension. Dotfiles, for example, are excluded from the build, so you could force the inclusion of a .gitignore or .htaccess file. The default value for include contains .htacess.

###keep

keep_files: [DIR, FILE, ...]

During the build process the destination folder is wiped clean before the site is regenerated. If you have files or directories in the destination folder that are not part of the build process this setting can preserve those files. Useful for favicon files or other site assets that are unlikely to change and not controlled by Jekyll.

###encoding

encoding: ENCODING

Sets the encoding used for files. The default is utf-8.

###permalink

permalink: [options]

Specifies the permalink style used for posts and controls the directory structure for generated posts. The default, date, results in the permalink /YEAR/MO/DATE/name.html. Therefore a post titled 2015-01-29-first-post.md would have the permalink of /2015/01/29/first-post.html, and would be generated using that directory structure. For a full list of permalink options, see the Jekyll documentation on permalinks.

###pagination

paginate: [num]

Allows you to set the number of blog posts to display on the index.html page. This allows you to break your posts up and display them over a number of pages. For an overview of how pagination works, and how to also set the paginate_path option, see the Jekyll documentation on pagination.

###More information

This is a brief look at some of the configuration options available for your _confing.yml file. For more information on configuration, and how to set global default options for pages, check the full Jekyll documentation on site configuration.