Skip to content


Folders and files

Last commit message
Last commit date

Latest commit


Repository files navigation



A minimalist static blog generator.

  • Super simple
  • Write pages in Markdown
  • Generates valid RSS 2.0 feed
  • Supports code highlighting (using Chroma)

Basic example

echo 'Some `cool` _arbitrary_ **Markdown**!' | pt

Which prints:

<!DOCTYPE html>
<html lang="">
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <p>Some <code>cool</code> <em>arbitrary</em> <strong>Markdown</strong>!</p>


go install

Or check releases for the latest binaries.


Usage of pt:
  -base-url string
    	base URL
  -dir string
    	where to save generated files (default ".")
  -feed string
    	feed target path (default "feed.xml")
  -feed-template string
    	feed template path
  -highlight string
    	code highlight style
  -template string
    	page template path

Pass the list of Markdown files to convert at the end.

Front matter

Each page can contain a YAML front matter. It must be placed at the top within --- delimiters:

title: Hello, world!
date: 2019-02-11

This is an example page!

Valid variables are:

  • title: page title
  • date: page creation date
  • exclude: if yes, the page will be excluded from .Pages and the RSS feed
  • .Title: page title
  • .Date: page creation date
  • .Path: path to the generated HTML file
  • .Content: content of the generated HTML file
  • .URL: URL of the generated HTML file prefixed by the value of -base-url
  • .Exclude: boolean specifying whether this page is in .Pages
  • .Pages: array of all non-excluded pages sorted by date

See templates/page.html and templates/feed.xml for the default templates.

Longer example

Create a page template as template.html:

<!DOCTYPE html>
    <title>{{ .Title }}</title>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    {{ if eq .Path "index.html" }}
      {{ .Content }}
        {{ range .Pages }}
          <li><a href="{{ .URL }}">{{ .Title }}</a> ({{ .Date.Format "January 2, 2006" }})</li>
        {{ end }}
    {{ else }}
      {{ .Content }}
    {{ end }}

Create the index page as

title: Jane Doe
exclude: yes

Subscribe via [RSS](/feed.xml).

And a post within a file called

title: My first post
date: 2019-04-20

This is an example **Markdown** _post_.
I like `turtles`.


Finally, build:

pt -base-url -template template.html -highlight monokailight *.md

See the Chroma Playground for available syntax highlighting styles.