Open Source School Software(OSSS)
Project description
!!! warning "Project status: active development" OSSS is still being developed. Community input and assistance are very welcome! - Share feedback and ideas via issues or discussions. - Open PRs for bug fixes and small improvements.
Open Source School Software (OSSS)
A community-driven, modular suite of applications for K-12 districts.
📚 Live documentation: https://rubelw.github.io/OSSS/
This repository is a polyglot monorepo with a Next.js frontend (src/osss-web) and a FastAPI
backend (src/OSSS). Documentation is built with MkDocs Material, with API references
generated from source:
- Frontend (TypeScript) → TypeDoc → Markdown (
docs/api/web/*) - Backend (Python) → mkdocstrings renders code objects from
src/OSSS - REST (OpenAPI) → exported JSON rendered with ReDoc
The static site is output to ./documentation/.
Why This Is Important
When Artificial General Intelligence (AGI) starts to emerge—potentially by 2030—districts will need to adjust governance, safety filters, and curricula rapidly. That kind of agility is exactly what community-maintained, open-source software delivers—without waiting on a vendor roadmap. Today, many incumbent systems are tied to legacy architectures and slow release cycles. While AI is already reshaping mainstream apps, most school platforms haven’t meaningfully evolved to leverage it.
I’m building the next generation of school software as an open, participatory project. Administrators, staff, students, and families will be able to propose enhancements, contribute code, and ship improvements together—so the platform keeps pace with classroom needs and policy changes.
📖 Documentation Quick Start
Run all commands from the repo root. Create and activate a Python venv first.
Live docs are published at https://rubelw.github.io/OSSS/.
Quick start
# clone
git clone https://github.com/rubelw/OSSS.git
cd OSSS
# (optional) copy environment examples
cp .env.example .env || true
# create a venv in a folder named .venv (inside your project)
python3 -m venv .venv
source .venv/bin/activate
# build + run local stack (database, API, web)
./start_osss.sh
# to run the cli
osss <TAB>
# Keycloak http://localhost:8085 with username 'admin' and password 'admin'
# FastApi http://localhost:8081/docs# username 'activities_director@osss.local' and password 'password'
# Web: http://localhost:3000 username 'activities_director@osss.local' and password 'password'
Build the static site to ./documentation/:
# Optional: regenerate TypeDoc first if code changed
npx typedoc --options typedoc.frontend.json
mkdocs build --clean
📁 Docs Layout (MkDocs)
docs/
├─ index.md # Landing page
├─ frontend/
│ └─ overview.md # Next.js app overview
├─ backend/
│ └─ overview.md # FastAPI app overview
├─ api/
│ ├─ web/ # (generated) TypeDoc markdown for Next.js
│ └─ openapi/ # (generated) openapi.json for ReDoc
└─ api/python/
├─ index.md # (generated) landing for Python API
└─ OSSS.md # (generated) mkdocstrings page for OSSS package
The pages under
docs/api/python/anddocs/api/openapi/are created during the MkDocs build by small helper scripts (see below). TypeDoc output is generated before the build runs.
Demo
⚙️ MkDocs Configuration
mkdocs.yml at the repo root glues everything together. Key bits:
site_name: OSSS Developer Documentation
site_url: https://rubelw.github.io/OSSS/
docs_dir: docs
site_dir: documentation
nav:
- Overview: index.md
- Frontend (Next.js):
- Overview: frontend/overview.md
- API (TypeScript): api/web/modules.md # <-- match what TypeDoc emits (modules.md or index.md)
- Backend (Python):
- Overview: backend/overview.md
- API (Python): api/python/OSSS.md
- OpenAPI: backend/openapi.md
plugins:
- search
- mkdocstrings:
handlers:
python:
paths: ["src"] # import OSSS from ./src/OSSS
options:
show_source: false
docstring_style: google
members_order: source
- gen-files:
scripts:
- tooling/generate_docs.py
- tooling/export_openapi.py
# Optional: make pages wider site-wide, or include a page-class-based override
extra_css:
- overrides/wide.css
# Load ReDoc globally so the OpenAPI page can initialize it
extra_javascript:
- https://cdn.redoc.ly/redoc/latest/bundles/redoc.standalone.js
Helper scripts (run during mkdocs serve/build)
-
tooling/generate_docs.py— generatesdocs/api/python/OSSS.mdthat contains the::: OSSSdirective; mkdocstrings renders it into API docs.# tooling/generate_docs.py from pathlib import Path import mkdocs_gen_files as gen with gen.open("api/python/index.md", "w") as f: f.write("# Python API\n\n- [OSSS package](./OSSS.md)\n") with gen.open("api/python/OSSS.md", "w") as f: f.write("# `OSSS` package\n\n") f.write("::: OSSS\n") f.write(" handler: python\n") f.write(" options:\n") f.write(" show_root_heading: true\n") f.write(" show_source: false\n") f.write(" docstring_style: google\n") f.write(" members_order: source\n") f.write(" show_signature: true\n")
-
tooling/export_openapi.py— writesdocs/api/openapi/openapi.jsonfrom the FastAPI app.# tooling/export_openapi.py import json import mkdocs_gen_files as gen from OSSS.main import app # adjust if your FastAPI app lives elsewhere with gen.open("api/openapi/openapi.json", "w") as f: json.dump(app.openapi(), f, indent=2)
ReDoc page (docs/backend/openapi.md)
---
title: OSSS API (OpenAPI)
hide:
- toc
class: full-width
---
> If the panel below stays blank, verify the JSON exists:
> **[OpenAPI JSON](../../api/openapi/openapi.json)**
<div id="redoc-container"></div>
<script>
(function () {
function init() {
var el = document.getElementById('redoc-container');
if (window.Redoc && el) {
// NOTE: two ".." segments from /backend/openapi → /api/openapi/openapi.json
window.Redoc.init('../../api/openapi/openapi.json', {}, el);
} else {
setTimeout(init, 50);
}
}
init();
})();
</script>
<noscript>
JavaScript is required to render the ReDoc UI. You can still download the
<a href="../../api/openapi/openapi.json">OpenAPI JSON</a>.
</noscript>
Optional: widen pages
docs/overrides/wide.css (site-wide) or docs/overrides/redoc-wide.css (only OpenAPI page):
/* Site-wide wider grid */
.md-grid { max-width: 1440px; }
/* Only pages with class: full-width */
.md-content__inner.full-width { max-width: none; padding-left: 0; padding-right: 0; }
#redoc-container { margin: 0; padding: 0; }
Reference in mkdocs.yml via extra_css.
🔐 Environment Notes
- Python imports for docs: run
mkdocswithPYTHONPATH=srcso mkdocstrings and the OpenAPI export can importOSSSfromsrc/OSSS. - Frontend generator: TypeDoc runs with your Next.js
tsconfig. If the app declares "packageManager" insrc/osss-web/package.json, use npm (not pnpm) for consistency.
🧪 CI Example (GitHub Actions)
.github/workflows/docs.yml
name: Build Docs
on:
push:
branches: [ main ]
workflow_dispatch:
jobs:
docs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 20
- uses: actions/setup-python@v5
with:
python-version: "3.11"
- name: Install deps
run: |
python -m pip install --upgrade pip
pip install -r requirements-docs.txt
npm ci || npm i
- name: Generate TypeScript API (TypeDoc → Markdown)
run: npx typedoc --options typedoc.frontend.json
- name: Build MkDocs site → ./documentation
env:
PYTHONPATH: src
run: mkdocs build --clean
- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: osss-docs
path: documentation
📜 License
Apache-2.0 (see LICENSE).
Project details
Release history Release notifications | RSS feed
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 open_schools-0.0.0.dev2.tar.gz.
File metadata
- Download URL: open_schools-0.0.0.dev2.tar.gz
- Upload date:
- Size: 174.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
174c2c81dee8d66190a122dc1142dafba987efb6b798e0ffede5ab5ff1241f04
|
|
| MD5 |
2a28b09e679caa3c1f9b4614eb5cc4fe
|
|
| BLAKE2b-256 |
20ebcbdd42ef1e23bb438ec54e550ce407a1919535843562a8988fce56d8e1fa
|
Provenance
The following attestation bundles were made for open_schools-0.0.0.dev2.tar.gz:
Publisher:
publish.yml on rubelw/OSSS
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
open_schools-0.0.0.dev2.tar.gz -
Subject digest:
174c2c81dee8d66190a122dc1142dafba987efb6b798e0ffede5ab5ff1241f04 - Sigstore transparency entry: 444448679
- Sigstore integration time:
-
Permalink:
rubelw/OSSS@843aec66fa9a6efe1e26049cafe8b936bc1123df -
Branch / Tag:
refs/heads/main - Owner: https://github.com/rubelw
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@843aec66fa9a6efe1e26049cafe8b936bc1123df -
Trigger Event:
push
-
Statement type:
File details
Details for the file open_schools-0.0.0.dev2-py3-none-any.whl.
File metadata
- Download URL: open_schools-0.0.0.dev2-py3-none-any.whl
- Upload date:
- Size: 405.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d12897f76ae1cda801aa8ea97103097ed244ad2d09060a0f88f8741ce29f4df5
|
|
| MD5 |
2b4496b51e9eeae0bc097bb58a88744a
|
|
| BLAKE2b-256 |
3d5e79a0bff0276eaef96f9fc49ad99cf6fb1b93263e1d33a72ba5d9bbd6d362
|
Provenance
The following attestation bundles were made for open_schools-0.0.0.dev2-py3-none-any.whl:
Publisher:
publish.yml on rubelw/OSSS
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
open_schools-0.0.0.dev2-py3-none-any.whl -
Subject digest:
d12897f76ae1cda801aa8ea97103097ed244ad2d09060a0f88f8741ce29f4df5 - Sigstore transparency entry: 444448693
- Sigstore integration time:
-
Permalink:
rubelw/OSSS@843aec66fa9a6efe1e26049cafe8b936bc1123df -
Branch / Tag:
refs/heads/main - Owner: https://github.com/rubelw
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@843aec66fa9a6efe1e26049cafe8b936bc1123df -
Trigger Event:
push
-
Statement type: