Skip to main content
Pre-release

This release is a pre-release and may not be stable for production use.

Jamstack logo

A small static site generator built on Python and Jinja.

CI Python 3.11+

2.0 is under development. This branch contains the rewrite and is not published on PyPI yet. The stable branch holds the current 1.x release.

Documentation

The full documentation lives in docs/ and is built with Zensical. Preview it locally with zensical serve; it is published at https://jamstackpy.github.io/.

Jamstack turns a folder of Markdown and Jinja templates into a static site. There is no database, no runtime, and no network access during a build: you write content, run one command, and deploy the generated dist/ folder anywhere.

Features

  • Markdown pages with TOML front matter, or raw Jinja templates when you need full control.
  • Themes as plain folders: bundled ones, your own, or a per-project override.
  • A development server that rebuilds on change and keeps the last good build when something fails.
  • sitemap.xml, an Atom feed, and a themed 404.html generated for you.
  • Deterministic output: the same sources always produce the same bytes.
  • Three runtime dependencies: click, jinja2, markdown-it-py.

Installation

Until 2.0 is published:

python -m pip install "jamstack @ git+https://github.com/jamstackpy/jamstack@2.0"

After the release:

python -m pip install jamstack

Python 3.11 or newer is required.

Quick start

jamstack init my-site --theme blog
cd my-site
jamstack build
jamstack serve

jamstack init scaffolds site.toml, a starter page, and the files the chosen theme needs. jamstack build writes the site to dist/. jamstack serve serves it at http://127.0.0.1:8000 and rebuilds when a source changes.

Project layout

my-site/
  site.toml          # site configuration
  content/           # pages (.md or .html)
  static/            # files copied as-is to the output root
  templates/         # optional overrides of the theme's templates
  themes/            # optional local themes
  dist/              # build output (do not edit)

Writing content

A page is a file under content/. Its path becomes its URL:

Source URL Output
content/index.md / dist/index.html
content/about.md /about/ dist/about/index.html
content/posts/hello.md /posts/hello/ dist/posts/hello/index.html

Markdown files may start with TOML front matter delimited by +++:

+++
title = "Hello, world"
date = 2026-11-06
summary = "The first post."
+++

This is **Markdown**.

Recognised keys:

Key Type Meaning
title string Page title. Defaults to the file name.
date ISO date Publication date. Feeds and listings order by it.
template string Template to render the page with.
draft boolean Excluded from builds unless --drafts is passed.
summary string Short description used by feeds and the blog theme.

Any other key is available to templates as page.meta. Files ending in .html are rendered as Jinja templates instead of Markdown, which makes it easy to build landing pages with custom markup.

Configuration

[site]
title = "My Site"                 # required
description = ""
author = ""
base_url = "https://example.com"  # required for sitemap.xml and feed.xml
language = "en"

[build]
output = "dist"

[theme]
name = "blog"

base_url must be the public, absolute URL of the site. When it is set, Jamstack writes sitemap.xml with every page and feed.xml with every dated page. When it is empty, both files are skipped rather than emitting relative URLs.

Themes

List the available themes with:

jamstack themes

Two themes ship with the package: minimal for small sites and blog for dated posts. A project can override a bundled theme by creating themes/<name>/ inside the project; local themes take precedence.

Themes are plain folders, so a custom theme is just a directory with a theme.toml, templates/, and optionally static/ and scaffold/. See docs/themes.md for the full specification.

Command reference

Command Description
jamstack init [PATH] [--theme NAME] [--force] Create a new site.
jamstack build [--clean] [--drafts] Build the site into dist/.
jamstack serve [--port PORT] [--drafts] Build, serve, and rebuild on change.
jamstack themes List available themes.
jamstack --version Print the installed version.

python -m jamstack behaves like the jamstack command.

Migrating from 1.x

The 1.x engine (settings.py, posts.json, static.py, html5up themes) is replaced entirely in 2.0. See docs/migration.md for a step-by-step conversion guide, or keep using 1.x with:

python -m pip install "jamstack<2"

Development

git clone git@github.com:jamstackpy/jamstack.git
cd jamstack
git switch 2.0
python -m venv .venv
. .venv/bin/activate
pip install -e ".[dev]"
pre-commit install --hook-type pre-commit --hook-type commit-msg
pytest

Commits follow Conventional Commits; see CONTRIBUTING.md.

License

MIT. The 1.x html5up templates were distributed under CC BY 3.0 and are no longer part of this branch.

Metadata

Release files for jamstack 2.0.0rc1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for jamstack 2.0.0rc1
File Size Uploaded Provenance Actions
jamstack-2.0.0rc1.tar.gz 154.3 kB With provenance Details for jamstack-2.0.0rc1.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for jamstack 2.0.0rc1
File Interpreter ABI Platform Actions
jamstack-2.0.0rc1-py3-none-any.whl Python 3 none any Details for jamstack-2.0.0rc1-py3-none-any.whl

Total release size: 178.9 kB

Release files / jamstack-2.0.0rc1.tar.gz

Download URL jamstack-2.0.0rc1.tar.gz
Size 154.3 kB
Tags Source
SHA-256 checksum
How to use checksums
fcba1a7de4af982f2732566963f222848307fcfb15f1472d8c52bb542ea1d68e
BLAKE2b-256 checksum
How to use checksums
ca88fc91e9d896646763718dce0b02f81bf2e9e6c0ccf06e4340ff58ffab154e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 7, 2026.

Transparency log

Release files / jamstack-2.0.0rc1-py3-none-any.whl

Download URL jamstack-2.0.0rc1-py3-none-any.whl
Size 24.6 kB
Tags Python 3
SHA-256 checksum
How to use checksums
fc842e6a2940d16e1a22b1b3b5293fd244620d06be8e2da84c575a9ccf4490fe
BLAKE2b-256 checksum
How to use checksums
edf5745215cdf3f4e06e84bfb2286903e2a584a7f70c34cdc0d4e8e6b1a1ece1
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 7, 2026.

Transparency log

Security for jamstack 2.0.0rc1

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

Both files in this release have been uploaded with provenance metadata.

Select from 2 files

Attestation for jamstack-2.0.0rc1.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 7, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page