How to Build a Static Site with Free-Threaded Python (Bengal + 3.14t)

Step-by-step tutorial: build a static site with Bengal on Python 3.14t. Prerequisites, create site, add content, dev server, production build.

A short tutorial. From zero to a built site in a few minutes.

flowchart LR A[uv + 3.14t] --> B[bengal new] B --> C[Add content] C --> D[Dev server] D --> E[bengal build]

Prerequisites

You need uv and Python 3.14t. Install uv if you don't have it:

curl -LsSf https://astral.sh/uv/install.sh | sh

Install the free-threaded Python build:

uv python install 3.14t

Create a Bengal site

uv run --python=3.14t bengal new site my-site
cd my-site

Or use a preset:

uv run --python=3.14t bengal new site my-blog --template blog
uv run --python=3.14t bengal new site my-docs --template docs

Presets create sections, sample content, and config. blog gives you a blog and about section. docs gives you getting-started, guides, and reference.


Add content

Content lives in content/. Each section is a directory with an _index.md and Markdown files.

---
title: My First Post
date: '2026-03-15'
tags:
- python
- bengal
---

# My First Post

Hello, world.

Save as content/blog/my-first-post.md. Bengal picks it up automatically.


Run the dev server

uv run --python=3.14t bengal serve

Or the short alias:

uv run --python=3.14t bengal s

Open http://localhost:8000. Live reload is on by default. Edit a file and the browser refreshes.


Build for production

uv run --python=3.14t bengal build

Output goes to public/. Deploy that directory to any static host — Netlify, Vercel, S3, GitHub Pages.


Why free-threading matters here

On Python 3.14t, Bengal uses parallel rendering. A 1,000-page site builds in ~2.5 s with 8 workers instead of ~9 s single-threaded. The bigger win is incremental builds: change one page and only that page rebuilds. See Bengal — Built for Python's Free-Threaded Future for the architecture.