Stupidly simple static site generator.


Table of contents

Installation options

Via pip from PyPI

Just run:

pip install Peji

Via setup.py

You should already have the Python setuptools package installed.

Clone repo:

git clone https://gitea.nixhacks.net/ge/peji.git
cd peji/


pip install .

pip automatically runs setup.py and install all dependencies.

Command line interface

Pēji provides small command line interface.

App supports only two commands:

create SITE

Create new site in directory SITE. For example:

peji create mysite

In mysite/ dir will be created standard file structure. See Site structure below.


Render HTML pages and place it with other static content into mysite/build/ directory.

You can choose specific directory instead of build/ if pass -d (or --dir) option. For example, build site into my_static_site/:

peji build -d my_static_site/

Site structure

After creating site you have this site structure:

├── config.yaml
├── layouts
│   ├── base.j2
│   └── index.j2
├── pages
└── themes
    └── default
        ├── css
        │   └── main.css
        ├── images
        └── js

There is:

Site configuration file. See more here.
This folder contains Jinja2 templates. By default base.j2 and index.j2 is used.
Place your markdown files here.
Contains CSS, JS and images that need for page design.
Generated HTML files. Creates after running peji build.


Page metadata.

Like many other static site generators and flat-file CMS, in Pēji metadata is required for Markdown files.

Metadata must be appended to the beginning of the markdown file and is surrounded by a triple minus sign at the beginning and end. Data are presented in YAML format. Example:

title: My page title
layout: index.j2
theme: my_theme

# Your markdown text here

At the moment the application only supports these three properties. Consider each:


Page title. Is appended in HTML <title></title>.

Default: No default value. This property is required.


You can set custom template for specific page. Template file must be placed into layouts/ directory.

Default: index.j2


Custom theme (CSS) for page. By default themes are placed into themes/<theme_name>/. In this property you only need to specify the <theme_name>, you don't need to specify the path.

Default: default

Templates (Layouts)

Page variables

Page variables are passed to Jinja2 templates. Below is a description of each variable. A colon separated from the name of a variable indicates its type (see Python Data Types, [Docs]).

theme: str
Page theme. Can be specified in page metadata. Otherwise, the value from config.yaml is used.
title: str
Required property, set in the page metadata.
site_title: str
Site title. Optional, set in config.yaml (named title). See Configuration.
description: str
See. Configuration.
menu: dict
Contains a dictionary where the key is the title of the link and the key value is the URL of the link. The data is filled from config.yaml's menu.
content: str

This is a string containing HTML-converted Markdown text. In the template, this variable must be used with safe to avoid escaping HTML tags. Usage example:

{{ content | safe }}