Skip to main content

Free, SEO- and AI-friendly static site for school board documents — agendas, minutes, and policies authored in Markdown.

Project description

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.

boreddocs 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

  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.2.tar.gz (23.7 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.2-py3-none-any.whl (31.1 kB view details)

Uploaded Python 3

File details

Details for the file boreddocs-0.1.2.tar.gz.

File metadata

  • Download URL: boreddocs-0.1.2.tar.gz
  • Upload date:
  • Size: 23.7 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.2.tar.gz
Algorithm Hash digest
SHA256 c15439faee7db868808f0f6b125c59dde0a8cc4cd402a09f89bc75fcaf69b374
MD5 cf20cd95a4e8aa79c3edfe6f19a6e0cc
BLAKE2b-256 2c5030a5cedf559007b2a901fc1389e46921416339fafd3f170274e73df06cea

See more details on using hashes here.

Provenance

The following attestation bundles were made for boreddocs-0.1.2.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.2-py3-none-any.whl.

File metadata

  • Download URL: boreddocs-0.1.2-py3-none-any.whl
  • Upload date:
  • Size: 31.1 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.2-py3-none-any.whl
Algorithm Hash digest
SHA256 88ac21b38dcdcdf9bf1c496ace560d2c9df7977665041ba5a9c7f666c1181461
MD5 72ed4e6b14afb1f861de1ad6ee4feaeb
BLAKE2b-256 83f583bb8e2fe1741a96ef80102ca3b332c4fa57c1eeb54a0e59ba9c7afaebae

See more details on using hashes here.

Provenance

The following attestation bundles were made for boreddocs-0.1.2-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