Free, SEO- and AI-friendly static site for school board documents — agendas, minutes, and policies authored in Markdown.
Project description
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.
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
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file boreddocs-0.1.4.tar.gz.
File metadata
- Download URL: boreddocs-0.1.4.tar.gz
- Upload date:
- Size: 25.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4c7ea69a64741d169e3025474b1f3670bf801b895294461b11f8f06b080d241c
|
|
| MD5 |
f7d9de30bd45d24c2defa266f26dea93
|
|
| BLAKE2b-256 |
b35e1e202b7a5ee9de5fe9cbb49f901a69e343210ecb39e883b227ee3182717b
|
Provenance
The following attestation bundles were made for boreddocs-0.1.4.tar.gz:
Publisher:
release.yml on wroscoe/boreddocs
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
boreddocs-0.1.4.tar.gz -
Subject digest:
4c7ea69a64741d169e3025474b1f3670bf801b895294461b11f8f06b080d241c - Sigstore transparency entry: 1436914818
- Sigstore integration time:
-
Permalink:
wroscoe/boreddocs@b5d47989301c588dd1acd862df5c7458cd73e355 -
Branch / Tag:
refs/tags/v0.1.4 - Owner: https://github.com/wroscoe
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@b5d47989301c588dd1acd862df5c7458cd73e355 -
Trigger Event:
push
-
Statement type:
File details
Details for the file boreddocs-0.1.4-py3-none-any.whl.
File metadata
- Download URL: boreddocs-0.1.4-py3-none-any.whl
- Upload date:
- Size: 32.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d5abf825de23e6abe665d2e1543e0671c2461be4ce9cc329620d65f6b8710035
|
|
| MD5 |
eb9518f7f7313b8d3244d6804688bf77
|
|
| BLAKE2b-256 |
696bf12c19e3ff6af01d0f29ac70710af431ef2951b08239ff3c6a550499481c
|
Provenance
The following attestation bundles were made for boreddocs-0.1.4-py3-none-any.whl:
Publisher:
release.yml on wroscoe/boreddocs
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
boreddocs-0.1.4-py3-none-any.whl -
Subject digest:
d5abf825de23e6abe665d2e1543e0671c2461be4ce9cc329620d65f6b8710035 - Sigstore transparency entry: 1436914826
- Sigstore integration time:
-
Permalink:
wroscoe/boreddocs@b5d47989301c588dd1acd862df5c7458cd73e355 -
Branch / Tag:
refs/tags/v0.1.4 - Owner: https://github.com/wroscoe
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@b5d47989301c588dd1acd862df5c7458cd73e355 -
Trigger Event:
push
-
Statement type: