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.3.tar.gz (24.8 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.3-py3-none-any.whl (31.8 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: boreddocs-0.1.3.tar.gz
  • Upload date:
  • Size: 24.8 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.3.tar.gz
Algorithm Hash digest
SHA256 86a4de5d34abbff94c3df8bdcafd16cf63c17638b25e6a1989688fa4d677acc9
MD5 40e9d3c4318b3b9baa0eb8a2a269c72c
BLAKE2b-256 7474db39e15976fb5e3d20c1a91d3f1da336d081af7a16a8223140305bfc24c2

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: boreddocs-0.1.3-py3-none-any.whl
  • Upload date:
  • Size: 31.8 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.3-py3-none-any.whl
Algorithm Hash digest
SHA256 7648077c0bf0a4cb09a97bdce200d3d85c25735132036ab73f5f011a264c06a9
MD5 3885b521df58523d51881b81c8a474a3
BLAKE2b-256 bce82c78deb818a03a760df06a6590e028cfcfffac81dafb012ed0ac5d5f9677

See more details on using hashes here.

Provenance

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