{"id":45436167,"url":"https://github.com/bseverns/classhub","last_synced_at":"2026-04-12T06:04:30.338Z","repository":{"id":335547165,"uuid":"1135929070","full_name":"bseverns/classhub","owner":"bseverns","description":"A self-hosted program container for cohort-based learning.","archived":false,"fork":false,"pushed_at":"2026-04-03T01:44:08.000Z","size":14658,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-03T08:51:51.435Z","etag":null,"topics":["cohort-based-learning","data-minimization","education","full-stack","k-12-education","learning-management-system","learning-platform","nonprofit","open-source","privacy-first","self-hosted","stem"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/bseverns.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"docs/SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-01-16T19:47:14.000Z","updated_at":"2026-04-03T01:44:12.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/bseverns/classhub","commit_stats":null,"previous_names":["bseverns/selfhosted-classhub","bseverns/classhub"],"tags_count":6,"template":false,"template_full_name":null,"purl":"pkg:github/bseverns/classhub","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bseverns%2Fclasshub","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bseverns%2Fclasshub/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bseverns%2Fclasshub/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bseverns%2Fclasshub/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/bseverns","download_url":"https://codeload.github.com/bseverns/classhub/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bseverns%2Fclasshub/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31494177,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-06T17:22:55.647Z","status":"ssl_error","status_checked_at":"2026-04-06T17:22:54.741Z","response_time":112,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cohort-based-learning","data-minimization","education","full-stack","k-12-education","learning-management-system","learning-platform","nonprofit","open-source","privacy-first","self-hosted","stem"],"created_at":"2026-02-22T03:03:18.797Z","updated_at":"2026-04-12T06:04:30.332Z","avatar_url":"https://github.com/bseverns.png","language":"Python","readme":"# Class Hub\n[![test-suite](https://github.com/bseverns/ClassHub/actions/workflows/test-suite.yml/badge.svg)](https://github.com/bseverns/ClassHub/actions/workflows/test-suite.yml)\n[![security](https://github.com/bseverns/ClassHub/actions/workflows/security.yml/badge.svg)](https://github.com/bseverns/ClassHub/actions/workflows/security.yml)\n[![docs](https://github.com/bseverns/ClassHub/actions/workflows/docs.yml/badge.svg)](https://github.com/bseverns/ClassHub/actions/workflows/docs.yml)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)\n\nClass Hub is classroom-first, self-hosted learning infrastructure built for reliable operations, inspectable behavior, and privacy-forward defaults.\n\nThe repo’s current infrastructure claim is narrow on purpose: ClassHub treats AI as leased infrastructure rather than ambient platform logic, so the public classroom experience can stay calm while private compute remains bounded, accountable, and replaceable.\n\n## Front-door map\n\nUse these four docs as the canonical entrypoints, each with one job:\n\n- `README.md` (this file): repository front door and quick operator/developer start.\n- [`docs/START_HERE.md`](docs/START_HERE.md): role-based docs router.\n- [`docs/PUBLIC_OVERVIEW.md`](docs/PUBLIC_OVERVIEW.md): external evaluator/funder overview.\n- [`docs/CURRENT_STATE.md`](docs/CURRENT_STATE.md): what is live on `main` right now.\n\n## What it is\n\n- Cohort-based learning container.\n- Organization-scoped access boundaries.\n- Invite-only enrollment with seat controls.\n- Outcome tracking and export.\n- Certificate eligibility and issuance.\n\n## What it is not\n\n- Not a marketing website.\n- Not a payment processor.\n- Not a CRM.\n- Not a behavioral analytics system.\n- Not a surveillance-based LMS.\n\n## Architecture at a glance\n\n- `Class Hub` (Django): student join/session flows, class views, `/teach`, `/admin`.\n- `Homework Helper` (Django): separate tutor service under `/helper/*`.\n- Homework Helper is the only runtime component that crosses the private compute boundary.\n- `Caddy`: reverse proxy and TLS termination.\n- `Postgres`: primary data store.\n- `Redis`: cache/rate-limit/queue state.\n- `MinIO`: optional backup/ops component.\n\nDetailed architecture: [`docs/ARCHITECTURE.md`](docs/ARCHITECTURE.md)\n\n```mermaid\nflowchart LR\n  You[\"Browser or operator terminal\"]\n  Edge[\"Public LMS edge\u003cbr/\u003elms.creatempls.org\"]\n  Hub[\"Class Hub app\"]\n  Helper[\"Homework Helper app (/helper/*)\"]\n  Data[\"Postgres + Redis + uploads\"]\n  Model[\"Private model host\u003cbr/\u003etailnet-only\"]\n  Control[\"Headscale VPS\u003cbr/\u003econtrol plane only\"]\n\n  You --\u003e Edge\n  Edge --\u003e Hub\n  Edge --\u003e Helper\n  Hub --\u003e Data\n  Helper --\u003e Data\n  Helper --\u003e Model\n  Control -. coordinates LMS/GPU tailnet nodes .- Helper\n  Control -. control plane only .- Model\n```\n\n## Quickstart (local)\n\n```bash\nbash scripts/quickstart_stack.sh --yes --mode local --with-admin \\\n  --admin-username admin --admin-email admin@example.org --admin-password 'CHANGE_ME'\n```\n\nThen open:\n\n- Student join: `http://localhost/`\n- Teacher login: `http://localhost/teach/login` (or `http://localhost/admin/login/` for admin console access)\n\nThe quickstart and deploy scripts now default to a bundled CPU-local helper smoke path via Ollama. That local path is intentionally small and bounded so operators can validate the LMS stack on modest hardware without turning the LMS host into the serious production inference node. If you later move the helper to a private remote model host, the serious production path is a public LMS plus a private tailnet-only model endpoint that only Homework Helper can reach. For createMPLS-style deployments, the recommended control plane for that private path is a self-hosted Headscale server on a tiny Ubuntu VPS. A Gemma-family model on the remote private host is now the recommended open-model example, while the ClassHub runtime remains provider-neutral (`LLM_BACKEND`, `LLM_BASE_URL`, `LLM_API_KEY`).\n\n## Production posture (important)\n\n- Domain/TLS deployments should start from `compose/.env.example.domain`.\n- Production default is strict org boundary: `REQUIRE_ORG_MEMBERSHIP_FOR_STAFF=1`.\n- Local/dev and migration scenarios may temporarily use `REQUIRE_ORG_MEMBERSHIP_FOR_STAFF=0`.\n- Serious private-LLM production path: keep `lms.creatempls.org` public, keep the model host private, and route only Homework Helper server-to-server traffic over the tailnet.\n- For createMPLS-style deployments, Headscale on a tiny Ubuntu VPS is the recommended tailnet control plane; the ClassHub runtime itself stays control-plane-agnostic and uses `LLM_BASE_URL` + `LLM_API_KEY`.\n\n## Next docs\n\n- Local demo and first run: [`docs/TRY_IT_LOCAL.md`](docs/TRY_IT_LOCAL.md)\n- Security baseline: [`docs/SECURITY.md`](docs/SECURITY.md)\n- Day-1 deployment checklist: [`docs/DAY1_DEPLOY_CHECKLIST.md`](docs/DAY1_DEPLOY_CHECKLIST.md)\n- Runbook and operations: [`docs/RUNBOOK.md`](docs/RUNBOOK.md)\n- Private LLM topology: [`docs/PRIVATE_LLM_BACKEND.md`](docs/PRIVATE_LLM_BACKEND.md)\n- Headscale operator guide: [`docs/HEADSCALE_CONTROL_PLANE.md`](docs/HEADSCALE_CONTROL_PLANE.md)\n- Remote compute lease control: [`docs/REMOTE_HELPER_COMPUTE_CONTROL.md`](docs/REMOTE_HELPER_COMPUTE_CONTROL.md)\n- Remote compute evidence: [`docs/EVIDENCE_REMOTE_COMPUTE.md`](docs/EVIDENCE_REMOTE_COMPUTE.md)\n- Infrastructure hardening roadmap: [`docs/INFRASTRUCTURE_HARDENING_ROADMAP.md`](docs/INFRASTRUCTURE_HARDENING_ROADMAP.md)\n- Feature flags and maturity: [`docs/FEATURE_MATURITY.md`](docs/FEATURE_MATURITY.md)\n\n## Repository links\n\n- Contributing: [`CONTRIBUTING.md`](CONTRIBUTING.md)\n- Changelog: [`CHANGELOG.md`](CHANGELOG.md)\n- Service docs: [`services/classhub/README.md`](services/classhub/README.md), [`services/homework_helper/README.md`](services/homework_helper/README.md)\n- Press kit: [`press/README.md`](press/README.md)\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbseverns%2Fclasshub","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbseverns%2Fclasshub","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbseverns%2Fclasshub/lists"}