bedel signs up your students' groups, gives each group its own repository for every assignment, and enforces your deadlines to the minute. It all runs from one repository in your own organization, so every workflow, rule and form is a file you can read and change.
GitHub retired GitHub Classroom on 28 August 2026 and deleted its data a week later, pointing teachers to partner tools such as Classroom 50. So the choice now is mostly between Classroom 50, an app that runs your classroom for you, and bedel, a repository you own.
| bedel | Classroom 50 | GitHub Classroom | |
|---|---|---|---|
| Available | Yes, free | Yes, free and open source (GPL-3.0), from the Fifty Foundation | Retired 28 August 2026; its data was deleted on 4 September |
| GitHub plan | A free organization is enough | An organization on the Team or Enterprise plan (free for verified teachers) | — |
| Where it runs | GitHub Actions, in one repository in your organization. No app, no server. | The classroom50.org web app or gh extensions, run as you while you're signed in, plus GitHub Actions in a classroom50 repository in your organization |
GitHub's hosted service |
| Changing how it works | Edit any workflow, script, rule or form, including the course's page: the whole of it is your copy | Grading is yours: declarative tests or your own scripts. The rest is how the app works, which is open source, so you could fork it. | The options the service offered |
| Groups | Students register through a form, checked against your roster and confirmed by every member | The first student creates the group and adds teammates, or you assign the groups | An invitation link per assignment |
| Deadlines | A soft deadline marks work late, and can follow each class's weekly session. The hard deadline makes the repositories read-only, on the minute, by itself. | A due date marks work late but doesn't stop pushes. You close an assignment by hand to make its repositories read-only. | A deadline per assignment |
| Autograding | Not built in: add your own grader as a workflow | Built in: declarative tests or your own scripts | Built in |
| Your student list | Stays on your computer. Only student numbers go to GitHub, encrypted. | Students are linked by GitHub username or email, in your organization | The Classroom roster, now deleted |
you want autograding built in, and an app that does things for you, and your organization is on a Team plan.
you want groups to sign themselves up against your roster, deadlines that lock on time without you, a free organization, and the freedom to change anything about how it all works.
Students fill in a form with their student numbers and GitHub usernames. bedel checks every number against your roster, waits for each member to confirm, then creates their team and invites them.
Release an assignment and every group gets a private repository with your starting files, plus an issue that emails them. Groups that register later get theirs automatically.
Work pushed after the soft deadline counts but is marked late. At the hard deadline, the repositories become read-only. Soft deadlines can follow each class's own weekly session.
An assignment can start from each group's previous one, with the full history and the new starting files committed on top.
Every push is archived to a private repository, so a force-push can't hide when something happened. Reports show who pushed what, before which deadline.
Only student numbers ever reach GitHub, stored as encrypted secrets. Names, emails and the rest of your lists never leave your computer.
Hosted classroom tools give you the settings their makers chose. bedel is a repository: the workflows that run it, the rules that decide deadlines and the form students fill in are all plain files in your organization. Change one and push, and that's how your course works now.
Soft deadlines come from one short Python function in rules.py. Give one class an extra week, count from the latest member's session instead of the earliest — it's a few lines.
Every workflow is ordinary GitHub Actions YAML. Lock at a different time, add an autograder, send a report somewhere — edit the workflow.
A course keeps bedel as its upstream, so later fixes arrive with one git pull. Your course's own files never conflict.
Setup is six short steps in your browser, about fifteen minutes. GitHub doesn't let a website act for you without a token, so you make two, on GitHub, and paste them in. You shouldn't paste a token anywhere without knowing exactly what it can reach, so here is how the setup handles them.
You create the course's organization on GitHub before any token. Each token is then made for that organization alone, and fine-grained tokens can't reach past their one owner. Your own repositories and other organizations stay out of reach.
The setup refuses classic tokens, which reach everything you can. It also proves each token belongs to the course's organization before doing anything with it.
There's no bedel server. The page's Content-Security-Policy lets it connect only to api.github.com, and your browser enforces that. Tokens stay in the tab's memory and are never saved.
The setup token lasts 7 days, and you can delete it as soon as you're done. The bot's token is encrypted in your browser and stored as a secret that only your course's workflows can read.
Setup publishes a page from your course's own repository. You run the course from there: releasing assignments, changing deadlines, updating the roster, and seeing who's registered. The code it runs is your copy, which changes only when you pull bedel's updates.
Clone bedel and run ./scripts/setup.sh. It does the same with your gh login, and the same scripts release assignments.