The Blog recipe is probably the best way to get an experience similar to other blog-based static site generators like Jekyll. It will pick up all Markdown and Razor files in the /posts directory as blog posts, and all Markdown and Razor files in the root site directory as additional information pages. It will also generate Atom and RSS feeds for your posts, as well as create archives by date and by tags.

Key Features

  • Content pages in addition to blog posts.
  • Posts and pages can be in Markdown or Razor.
  • Tag engine, including a tag archive and tag lists on every post.
  • Automatic archive page.
  • Meta-refresh redirects and/or a Netlify redirect file.
  • RSS, Atom, and/or RDF feeds.


To scaffold the recipe, run:

wyam new -r Blog

This generates a skeleton set of input files that includes a blog post and a content page. You can use this as a starting point for your own site.


To build a site with this recipe, run:

wyam -r Blog


To select a specific theme, run:

wyam -r Blog -t CleanBlog

Usage Notes

Blog Post Published Dates

To find the published date for blog posts, the metadata will first be searched for a Published value. If one cannot be found (or it can't be converted to a DateTime) then the filename of the input file for the post will be checked for a date that appears in the beginning of the file name of the format YYYY-MM-DD-.

Index and Archive Pages

The Blog recipe is very flexible in terms of how your posts are presented. You can display them on the index page, on an archive page, with or without excerpts, and control things like page counts. This is all managed using the following settings:

  • BlogKeys.IndexPageSize
  • BlogKeys.IndexPaging
  • BlogKeys.IndexFullPosts
  • BlogKeys.ArchivePageSize
  • BlogKeys.ArchiveExcerpts
  • BlogKeys.GenerateArchive

You can display your posts on either the index, a separate archive, or both.

For example, to display the full content of your most recent post on the index and the remaining posts in the archive in pages of 10, add the following to your configuration file:

Settings[BlogKeys.IndexPageSize] = 1;
Settings[BlogKeys.IndexFullPosts] = true;
Settings[BlogKeys.ArchivePageSize] = 10;

Alternatively, to display all of your posts on the index page in groups of 5 and turn off the archive section, add the following:

Settings[BlogKeys.IndexPageSize] = 5;
Settings[BlogKeys.IndexPaging] = true;
Settings[BlogKeys.GenerateArchive] = false;

For more information about these settings including their types and default values, see the settings page.


If migrating your site from another generator, the paths may not match up exactly. This recipe supports multiple styles of redirects. To activate, add RedirectFrom metadata to the front matter of each page that should be the endpoint of a redirection. You can control what gets generated to support redirection with the MetaRefreshRedirects and NetlifyRedirects global metadata values. By default, meta refresh redirects are generated. These are small HTML files that contain a <meta> header tag redirecting the client. They are also supported by Google and other search engines.

The recipe includes the ability to validate both relative (internal) and absolute (external) links. Both features are opt-in given that they add additional time to the generation process. To activate them add Settings[BlogKeys.ValidateRelativeLinks] = true; for relative link validation and/or Settings[BlogKeys.ValidateAbsoluteLinks] = true; for absolute link validation to your configuration file.

By default validation failures output a warning with details on the link, why it failed, and which files it's in. You can switch to outputting errors (which will usually break the build) by using Settings[BlogKeys.ValidateLinksAsError] = true; in your configuration file.

Note that turning on validation for absolute links typically results in a number of falsely reported failures which will need to be checked manually (so it's not recommended to validate absolute links and output errors).