Define typed schemas for your content to ensure consistency and catch errors early.
Do I Need This?
No. Collections are optional. Your site works fine without them.
Use collections when:
- You want typos caught at build time, not in production
- Multiple people edit content and need guardrails
- You want consistent frontmatter across content types
Quick Setup
bengal collections init
This createscollections.pyat your project root. Edit it to uncomment what you need:
1 2 3 4 5 6 | |
Done. Build as normal—validation happens automatically.
Built-in Schemas
Bengal provides schemas for common content types:
| Schema | Required Fields | Optional Fields |
|---|---|---|
BlogPost |
title, date | author, tags, draft, description, image |
DocPage |
title | weight, category, tags, toc, deprecated |
APIReference |
title, endpoint | method, version, auth_required, rate_limit |
Tutorial |
title | difficulty, duration, prerequisites, series |
Changelog |
title, date | version, breaking, summary |
Import any of these:
from bengal.collections import BlogPost, DocPage, APIReference
Custom Schemas
Define your own using Python dataclasses:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | |
Validation Modes
By default, validation warns but doesn't fail builds:
⚠ content/blog/my-post.md
└─ date: Required field 'date' is missing
Strict Mode
To fail builds on validation errors, add tobengal.toml:
1 2 | |
Lenient Mode (Extra Fields)
To allow fields not in your schema:
1 2 3 4 5 | |
CLI Commands
1 2 3 4 5 6 7 8 | |
Migration Tips
Existing site with inconsistent frontmatter?
- Start with
strict=Falseto allow extra fields - Run
bengal collections validateto find issues - Fix content or adjust schema
- Switch to
strict=Truewhen ready
Transform legacy field names:
1 2 3 4 5 6 7 8 9 10 11 12 | |
Remote Content
Collections work with remote content too. Use a loader instead of a directory:
1 2 3 4 5 6 7 8 9 | |
See Content Sources for GitHub, Notion, REST API loaders.
Seealso
- Content Sources — GitHub, Notion, REST API loaders