Skip to main content

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.)

  1. Reads boreddocs.yml and validates it.
  2. Walks content/meetings/*.md and content/policies/*.md. Each file has YAML frontmatter (metadata) followed by Markdown body.
  3. Parses meeting bodies into a structured outline using heading conventions: # 1. Section → numbered section, ## A. Item → lettered sub-item.
  4. Renders each item's body through python-markdown with a custom ::motion extension that turns voting blocks into styled aside elements.
  5. Renders each page through Jinja2 templates from the active theme. If overrides/templates/<path> exists, it shadows the default.
  6. Copies static/ from the theme (and any overrides/static/) into _site/static/.
  7. 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

boreddocs-0.1.4.tar.gz (25.2 kB view details)

Uploaded Source

Built Distribution

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

boreddocs-0.1.4-py3-none-any.whl (32.0 kB view details)

Uploaded Python 3

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

Hashes for boreddocs-0.1.4.tar.gz
Algorithm Hash digest
SHA256 4c7ea69a64741d169e3025474b1f3670bf801b895294461b11f8f06b080d241c
MD5 f7d9de30bd45d24c2defa266f26dea93
BLAKE2b-256 b35e1e202b7a5ee9de5fe9cbb49f901a69e343210ecb39e883b227ee3182717b

See more details on using hashes here.

Provenance

The following attestation bundles were made for boreddocs-0.1.4.tar.gz:

Publisher: release.yml on wroscoe/boreddocs

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

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

Hashes for boreddocs-0.1.4-py3-none-any.whl
Algorithm Hash digest
SHA256 d5abf825de23e6abe665d2e1543e0671c2461be4ce9cc329620d65f6b8710035
MD5 eb9518f7f7313b8d3244d6804688bf77
BLAKE2b-256 696bf12c19e3ff6af01d0f29ac70710af431ef2951b08239ff3c6a550499481c

See more details on using hashes here.

Provenance

The following attestation bundles were made for boreddocs-0.1.4-py3-none-any.whl:

Publisher: release.yml on wroscoe/boreddocs

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