Bored Docs
Project site: www.boreddocs.com · install: pip install boreddocs
A free, fast, SEO- and AI-friendly static site for school board documents — agendas, minutes, and policies authored in Markdown. Modeled after mkdocs, but specialized for the way school boards actually publish information.
Bored Docs exists because the dominant paid board-portal product is expensive, hostile to search engines, and unfriendly to AI assistants. School board agendas are public records — they should look, feel, and read like the open web.
Quickstart
pip install boreddocs
boreddocs new my-district
cd my-district
boreddocs serve # preview at http://localhost:8000
When you're ready to publish, push the repo to GitHub and the bundled GitHub Actions workflow deploys to GitHub Pages.
Repo layout (consumer side)
my-district/
├── boreddocs.yml # site config
├── content/
│ ├── meetings/
│ │ └── 2026-04-15-regular.md
│ └── policies/
│ └── AA-school-district-legal-status.md
├── data/
│ └── policy-categories.yml
├── overrides/ # optional: shadow the default theme
│ ├── static/img/logo.svg
│ └── templates/partials/header.html
├── requirements.txt # boreddocs>=0.1,<0.2
└── .github/workflows/deploy.yml
A complete working example lives at examples/sample-district/.
What boreddocs build does
(The package and CLI are spelled boreddocs, one word; the project name in prose is Bored Docs.)
- Reads
boreddocs.ymland validates it. - Walks
content/meetings/*.mdandcontent/policies/*.md. Each file has YAML frontmatter (metadata) followed by Markdown body. - Parses meeting bodies into a structured outline using heading conventions:
# 1. Section→ numbered section,## A. Item→ lettered sub-item. - Renders each item's body through
python-markdownwith a custom::motionextension that turns voting blocks into styled aside elements. - Renders each page through Jinja2 templates from the active theme. If
overrides/templates/<path>exists, it shadows the default. - Copies
static/from the theme (and anyoverrides/static/) into_site/static/. - Output lands in
_site/— fully pre-rendered HTML, ready for GitHub Pages.
The ::motion directive
Used inside meeting minutes:
## A. Approval of the April 15, 2026 Regular Meeting agenda
::motion
text: I move to approve the April 15, 2026 regular meeting agenda as presented.
made_by: Stephan Abrams
seconded_by: Bill Scarlett IV
result: Unanimously approved
votes:
- { vote: Yes, name: Betsy Carlin }
- { vote: Yes, name: Stephan Abrams }
::
Renders as a styled voting block.
CLI
| Command | What it does |
|---|---|
boreddocs build |
Render the site to _site/. |
boreddocs serve |
Build, then serve _site/ on localhost with auto-rebuild on file changes. |
boreddocs new <dir> |
Scaffold a new district repo. |
boreddocs check |
Validate every content file's frontmatter; non-zero exit on any error. |
All commands accept --config <path> (defaults to ./boreddocs.yml).
Why a separate package
- Independent versioning — districts pin to a major version; renderer changes don't accidentally break their site.
- Single editor mental model — a district's repo is just markdown + a config file. No Python, no templates.
- Reusability — every other district can adopt it for free.
- Themability — districts can shadow individual partial templates without forking the package.
Status
Pre-1.0. Schema is stable for the duration of 0.x (breakage requires major bump + a documented schema_version migration).
License
MIT — see LICENSE.
Release files for boreddocs 0.1.4
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| boreddocs-0.1.4.tar.gz | 25.2 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| boreddocs-0.1.4-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 57.2 kB
Release files / boreddocs-0.1.4.tar.gz
| Download URL | boreddocs-0.1.4.tar.gz |
|---|---|
| Size | 25.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
4c7ea69a64741d169e3025474b1f3670bf801b895294461b11f8f06b080d241c
|
|
BLAKE2b-256 checksum How to use checksums |
b35e1e202b7a5ee9de5fe9cbb49f901a69e343210ecb39e883b227ee3182717b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
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 May 4, 2026.
Transparency logRelease files / boreddocs-0.1.4-py3-none-any.whl
| Download URL | boreddocs-0.1.4-py3-none-any.whl |
|---|---|
| Size | 32.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
d5abf825de23e6abe665d2e1543e0671c2461be4ce9cc329620d65f6b8710035
|
|
BLAKE2b-256 checksum How to use checksums |
696bf12c19e3ff6af01d0f29ac70710af431ef2951b08239ff3c6a550499481c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
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 May 4, 2026.
Transparency log