Skip to main content

A high-performance static site generator with modular architecture

Project description

ᓚᘏᗢ Bengal

PyPI version Build Status Python 3.14+ License: MIT Status: Alpha

A high-performance static site generator for Python 3.14+

pip install bengal
bengal new site mysite && cd mysite && bengal serve

Why Bengal?

  • Fast — Parallel builds, incremental rebuilds, Zstandard-compressed caching
  • Modern — Python 3.14+ with free-threading support, fully typed
  • Batteries included — Auto-generated API docs, content validation, site analysis
  • Extensible — Pluggable engines for templates, Markdown, and syntax highlighting

Quick Commands

Command Description
bengal build Production build
bengal serve Dev server with live reload
bengal validate Health checks and validation
bengal fix Auto-fix common issues
bengal graph report Site structure analysis

Aliases: b (build), s (serve), v (validate)


Site Scaffolding

Interactive Wizard — Guided setup with presets

Run without arguments for a guided experience:

bengal new site

The wizard prompts for site name, base URL, and presents preset options:

🎯 What kind of site are you building?
  📝 Blog            - Personal or professional blog
  📚 Documentation   - Technical docs or guides
  💼 Portfolio       - Showcase your work
  🛒 Product         - Product site with listings and features
  📄 Resume          - Professional resume/CV site
  📦 Blank           - Empty site, no initial structure
  ⚙️  Custom         - Define your own structure

Each preset creates a complete site with appropriate sections, sample content, and configuration.

Direct Template Selection — Skip prompts with explicit options

Create sites non-interactively with --template:

bengal new site my-docs --template docs
bengal new site my-blog --template blog
bengal new site portfolio --template portfolio

Available templates:

Template Description Sections Created
default Basic site structure Home page only
blog Personal/professional blog blog, about
docs Technical documentation getting-started, guides, reference
portfolio Showcase work about, projects, blog, contact
product Product site with listings products, features, pricing, contact
resume Professional CV Single resume page
landing Single-page landing Home, privacy, terms
changelog Release notes timeline Changelog with versions
Add Sections to Existing Sites — Expand without recreating

Add new content sections to an existing Bengal site:

# Add multiple sections
bengal init --sections docs --sections tutorials

# Add sections with sample content
bengal init --sections blog --with-content --pages-per-section 5

# Preview without creating files
bengal init --sections api --dry-run

Section type inference:

Name Pattern Inferred Type Behavior
blog, posts, articles, news blog Date-sorted, post-style
docs, documentation, guides, tutorials doc Weight-sorted, doc-style
projects, portfolio section Standard section
about, contact section Standard section
Custom Skeleton Manifests — YAML-defined site structures

For complex or repeatable scaffolding, define structures in YAML manifests:

# Preview what would be created
bengal project skeleton apply my-structure.yaml --dry-run

# Apply the skeleton
bengal project skeleton apply my-structure.yaml

# Overwrite existing files
bengal project skeleton apply my-structure.yaml --force

Example manifest (docs-skeleton.yaml):

name: Documentation Site
description: Technical docs with navigation sections
version: "1.0"

cascade:
  type: doc  # Applied to all pages

structure:
  - path: _index.md
    props:
      title: Documentation
      description: Project documentation
      weight: 100
    content: |
      # Documentation
      Welcome! Start with our [Quick Start](getting-started/quickstart/).

  - path: getting-started/_index.md
    props:
      title: Getting Started
      weight: 10
    cascade:
      type: doc
    pages:
      - path: installation.md
        props:
          title: Installation
          weight: 20
        content: |
          # Installation
          ```bash
          pip install your-package
          ```

      - path: quickstart.md
        props:
          title: Quick Start
          weight: 30
        content: |
          # Quick Start
          Your first project in 5 minutes.

  - path: api/_index.md
    props:
      title: API Reference
      weight: 30
    content: |
      # API Reference
      Complete API documentation.

Component Model:

  • path — File or directory path
  • type — Component identity (blog, doc, landing)
  • variant — Visual style variant
  • props — Frontmatter data (title, weight, etc.)
  • content — Markdown body content
  • pages — Child components (makes this a section)
  • cascade — Values inherited by all descendants

Features

Feature Description Docs
Directives Tabs, admonitions, cards, dropdowns, code blocks Content →
Autodoc Generate API docs from Python, CLI, OpenAPI Autodoc →
Remote Sources Pull content from GitHub, Notion, REST APIs Sources →
Image Processing Resize, crop, format conversion (WebP/AVIF), srcset generation Images →
Content Collections Type-safe frontmatter with dataclass/Pydantic schemas Collections →
Theming Dark mode, responsive, syntax highlighting, search Theming →
Validation Health checks, broken link detection, auto-fix Building →
Performance Parallel builds, incremental rebuilds, streaming Large Sites →
Zero-Config Deploy Auto-detects GitHub Pages, Netlify, Vercel Deployment →

📚 Full documentation: lbliii.github.io/bengal


Configuration

Single-file — Simple projects
# bengal.toml
[site]
title = "My Site"
baseurl = "https://example.com"
Directory-based — Multi-environment projects
config/
├── _default/           # Base configuration
│   ├── site.yaml
│   └── build.yaml
├── environments/       # Environment overrides
│   └── production.yaml
└── profiles/           # Build profiles
    └── dev.yaml
bengal build -e production    # Production environment
bengal build --profile dev    # Development profile

📖 Configuration guide: Configuration →


Project Structure

mysite/
├── content/          # Markdown pages
├── templates/        # Custom templates (optional)
├── assets/           # Static files (CSS, JS, images)
├── data/             # YAML/JSON data files
├── config/           # Configuration directory
└── public/           # Build output

Theming

Bengal ships with a modern, accessible default theme:

  • Dark mode with system preference detection
  • Responsive design with mobile navigation
  • Syntax highlighting with copy buttons
  • Table of contents with scroll spy
  • Full-text search (Lunr.js)

Customize templates:

{# templates/page.html #}
{% extends "base.html" %}

{% block content %}
<article class="prose">
  <h1>{{ page.title }}</h1>
  {{ content | safe }}
</article>
{% endblock %}

Pluggable Engines

Bengal follows a "bring your own" pattern — swap engines without changing your content.

Template Engines
Engine Description Install
Kida (default) Bengal's native engine. 2-5x faster than Jinja2, free-threading safe, Jinja2-compatible syntax Built-in
Jinja2 Industry-standard with extensive ecosystem Built-in
# config/_default/site.yaml
template_engine: kida  # or jinja2
Markdown Parsers
Parser Description Best For
Patitas (default) Bengal's native parser. Typed AST, O(n) parsing, thread-safe Python 3.14+, large sites
Mistune Fast, modern parser General use
Python-Markdown Full-featured, extensive extensions Complex edge cases
# config/_default/content.yaml
markdown:
  parser: patitas  # default, or mistune (legacy), python-markdown
Syntax Highlighters
Backend Description Performance
Rosettes (default) Lock-free, 55+ languages, O(n) guaranteed 3.4x faster than Pygments
# config/_default/theme.yaml
highlighting:
  backend: rosettes

Rosettes is now a standalone package: pip install rosettes

Custom backends can be registered via register_backend().


Requirements

  • Python 3.14+ (uses free-threading and PEP 784 compression)
  • Linux, macOS, Windows

Philosophy

Bengal prioritizes correctness and clarity over backwards compatibility.

Each release represents the best solution we know how to deliver. When existing behavior no longer reflects the best design, it changes. Upgrades may require reading release notes and making adjustments.

  • Fail loudly — Breaking changes produce clear errors
  • User control — You choose when to upgrade; we choose what changes
  • No hidden layers — No compatibility shims or deprecated code paths

If you need multi-year stability, pin your version.


Documentation

📚 lbliii.github.io/bengal


Development

git clone https://github.com/lbliii/bengal.git
cd bengal
uv sync --group dev
pytest

The Bengal Cat Family

Bengal's core components are written in pure Python:

ᓚᘏᗢ Bengal Static site generator ← You are here
)彡 Kida Template engine
⌾⌾⌾ Rosettes Syntax highlighter
ฅᨐฅ Patitas Markdown parser

Python-native. Free-threading ready. No npm required.


License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

bengal-0.1.10.tar.gz (2.4 MB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

bengal-0.1.10-py3-none-any.whl (3.1 MB view details)

Uploaded Python 3

File details

Details for the file bengal-0.1.10.tar.gz.

File metadata

  • Download URL: bengal-0.1.10.tar.gz
  • Upload date:
  • Size: 2.4 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for bengal-0.1.10.tar.gz
Algorithm Hash digest
SHA256 7678d68fa136fc715e0bf4d8b7dc040fff385a3e5d162fdccba65569b6b5b32d
MD5 030da7a98b9d9354f961cdab04ceac46
BLAKE2b-256 6da356c86612eb8a6c1525f9870fa65011a8e312d08716b2fc5e86ef6aeb36bd

See more details on using hashes here.

Provenance

The following attestation bundles were made for bengal-0.1.10.tar.gz:

Publisher: python-publish.yml on lbliii/bengal

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file bengal-0.1.10-py3-none-any.whl.

File metadata

  • Download URL: bengal-0.1.10-py3-none-any.whl
  • Upload date:
  • Size: 3.1 MB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for bengal-0.1.10-py3-none-any.whl
Algorithm Hash digest
SHA256 18b2255e520c7f55871c437ce6fc0382c19d64bda48a62341d978a80d51446ea
MD5 c712cb01b8796a259c8a40a007cea84a
BLAKE2b-256 19c63e5366f153f0cd59a7ea7d5e5c28899fb1b74bd3e447ad8e6be2628bbfb9

See more details on using hashes here.

Provenance

The following attestation bundles were made for bengal-0.1.10-py3-none-any.whl:

Publisher: python-publish.yml on lbliii/bengal

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page