GitHub Classroom has retired

Run your course on GitHub, your way.

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.

After GitHub Classroom

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.

bedelClassroom 50GitHub 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

Pick Classroom 50 if…

you want autograding built in, and an app that does things for you, and your organization is on a Team plan.

Pick bedel if…

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.

What it does

Groups register themselves

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.

A repository per group, per assignment

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.

Deadlines enforced to the minute

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.

Work carries over

An assignment can start from each group's previous one, with the full history and the new starting files committed on top.

Evidence students can't rewrite

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.

Your students' data stays with you

Only student numbers ever reach GitHub, stored as encrypted secrets. Names, emails and the rest of your lists never leave your computer.

Everything is a file you can change

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.

course.json # name, group size, classes
.github/workflows/
  register.yml # when groups are processed
  deadlines.yml # when repos are locked
  assignment.yml # releasing an assignment
scripts/
  rules.py # who gets which soft deadline
  register.py # who may register, and how
  deadlines.py # locking and reports
web/ # your course's own page

Different deadline policy?

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.

Different schedule?

Every workflow is ordinary GitHub Actions YAML. Lock at a different time, add an autograder, send a report somewhere — edit the workflow.

And still get updates

A course keeps bedel as its upstream, so later fixes arrive with one git pull. Your course's own files never conflict.

Setting up, and your tokens

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.

The organization comes first

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.

Checked before it's used

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.

Sent only to GitHub

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.

Short-lived, or sealed

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.

Then, your course's own page

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.

Or no browser at all

Clone bedel and run ./scripts/setup.sh. It does the same with your gh login, and the same scripts release assignments.