Coding assignments, after GitHub Classroom

GitHub retired GitHub Classroom on 28 August 2026. Uppcoder runs coding courses from start to finish: assignments with starter code and tests, a ready lab in the browser for every student, marking by tests and by people, and the courses and every hand-in kept in git, in your own GitHub organisation if you want. For teachers moving from GitHub Classroom, we move one course across for you and it runs free until 30 June 2027: the first 20 courses, one per teacher, up to 40 students, apply by 15 December 2026.

What GitHub retired, and what it kept

GitHub closed new sign-ups to GitHub Classroom on 26 May 2026 and retired it on 28 August 2026. The Classroom website, its APIs and related services have been decommissioned. GitHub accounts, repositories and organisations are not affected, so the code your classes wrote is still where it was.

  • 26 May 2026: new sign-ups to GitHub Classroom closed
  • 28 August 2026: the Classroom website, APIs and related services decommissioned
  • Not affected: GitHub accounts, repositories and organisations
  • Being permanently deleted under GitHub's retention policies: classroom and assignment names, tests defined outside repositories, and LTI-integrated rosters

Assignments that carry their own tests

An assignment in Uppcoder is an ordinary git repository with a README.md for the brief and starter/, tests/ and solution/ folders. It is tested before students get it: the solution must pass and the starter code must fail. A repository with that layout can be taken in from GitHub by its URL, so starter code and tests from an existing template repository can move across.

  • Brief, starter code, tests and solution in one repository
  • Hidden tests that students never see
  • Tested before it is published: the solution passes, the starter fails
  • Taken in from a GitHub repository by URL, if it has the assignment layout
  • Published with a version label, a git tag, so last term's version stays as it was
  • Shared in a library and reused in the next course

A lab in the browser, for every student

The class works in one course lab, built from the stack the course needs. Each student opens their own folder in it from a browser, with the editor and terminal already set up. There is nothing for a student to install, and nothing that depends on the machine they happen to be using.

  • VS Code, a terminal or JupyterLab, whichever the course chose
  • The same environment for every student, the one the course was tested in
  • Students can run their own app on a private link
  • They can install packages from PyPI or npm in their own space, without root
  • No GitHub account needed for students
  • Started by the educator or a teaching assistant, not by each student

Run the tests, then hand in

Students can run the tests on their work as often as they like, and that is not a hand-in. Submit freezes the work as it is at that moment and the tests mark the frozen copy, so typing after Submit cannot change a result. The educator or a teaching assistant marks the rest against a rubric, and the student sees the tests' part, the manual part and the final grade.

  • Run the tests as often as needed, without handing in
  • Submit freezes the work, and the frozen copy is what is marked
  • Every hand-in is an attempt, with its time and its result
  • Rubrics, inline code review and written feedback
  • Teaching assistants with their own permissions
  • Grades returned to the LMS gradebook when the course runs inside one

Your git, if you want it

A school chooses where its courses and assignments are kept: in Uppcoder's own git storage, with nothing to set up, or in its own GitHub organisation or Forgejo/Gitea server. Every Submit is pushed to a private repository for the course in that storage, one branch per student and one tag per submission. Closing a course writes a manifest of who handed in what and what it was marked, so the archive can be read without Uppcoder.

  • Uppcoder's git storage, your GitHub organisation, or your own Forgejo or Gitea
  • A private repository per course, one branch per student
  • One tag per submission, never moved
  • A manifest.json when the course closes: who, what, when, and the mark
  • Plain git: clone it with no tools of ours

Inside the LMS, over LTI 1.3

Uppcoder is an LTI 1.3 tool, the standard Moodle, Canvas, Blackboard and Brightspace speak. The school connects it once; teachers add a lab like any other activity; students open it inside the course with no second password, and grades go to the gradebook. Uppcoder also runs on its own, with students invited by email.

  • Moodle, Canvas, Blackboard and Brightspace, over the standard
  • The class list comes from the LMS
  • Grades go to the LMS gradebook
  • A written setup guide for whoever administers the LMS
  • Or on its own: invite students by email or CSV

Priced by course, not per student seat

Plans are set by courses and students per course, from one educator to a whole campus, and a free trial tier is enough to run one module before anybody commits a budget. The labs and the work run on our own infrastructure.

  • Plans for a single educator, a department or a campus
  • A free trial tier for a pilot
  • Runs on our own infrastructure

What you used in GitHub Classroom, and where it is in Uppcoder

  • An assignment made from a template repository — An assignment with its own repository: brief, starter code, tests and a solution, tested before students get it
  • A repository for each student — Each student works in their own folder and branch in the course lab, as their own user, and never sees anybody else's work, the solution or the hidden tests
  • Autograding with GitHub Actions — Run the tests as often as they like; Submit freezes the work and the tests mark the frozen copy
  • Feedback on the code — Inline code review, written feedback and a rubric for the part that needs a person
  • Codespaces or a set-up laptop — A lab in our cloud, opened from a browser, with the tools the course chose: VS Code, a terminal, JupyterLab
  • Linking a roster from the LMS — LTI 1.3: the class list comes from the LMS and grades go back to its gradebook
  • Student repositories in your organisation — Every hand-in pushed to a private repository per course in your storage, with one tag per submission

Questions about moving from GitHub Classroom

Has GitHub Classroom really closed?

Yes. GitHub's changelog of 27 August 2026 says GitHub Classroom is deprecated as of 28 August 2026 and that its website, APIs and related services have been decommissioned.

What happened to our student repositories?

According to GitHub, accounts, repositories and organisations created to work with Classroom are not affected. Classroom's own data, such as classroom and assignment names, tests defined outside repositories and LTI-integrated rosters, is being permanently deleted.

Can we keep our courses on GitHub?

Yes. Uppcoder can keep courses, assignments and every hand-in in your own GitHub organisation, or in our own git storage if you would rather not run that yourself.

Can we bring our existing assignments?

An assignment repository with a README.md and starter/, tests/ and solution/ folders can be taken in from GitHub by its URL. Template repositories laid out differently need their files moved into that layout first.

Do students need a GitHub account?

No. Students are invited by email, or arrive from the LMS over LTI, and work in the browser.

Can we try it on one course first?

Yes. There is a free trial tier, and the demo shows a whole course from both the educator's and the student's side.

Sources

GitHub Classroom data that is not in a repository is being deleted; what is in a repository stays yours. Uppcoder keeps courses and coursework in git for the same reason.

Moving a course across, free until 30 June 2027

Tell us which course, roughly how many students and when the term starts. We move up to ten of its assignments across for you, connect your LMS if you use one, and the course runs free until 30 June 2027. Open to the first 20 courses, one per teacher and up to 40 students, applying by 15 December 2026; we confirm each one by email. No card needed, and nothing renews by itself.

Contact us