🎓 Native GitHub Classroom

GitHub is the LMS. A repo is the coursework. A push is a submission.


Alongside dev management and tech lead work, I teach software engineering part-time. Native GitHub Classroom is the platform I run that side of the week on, and it started out of pure cheapness: no hosted app, no server to babysit between semesters, no budget. A school email quietly unlocks GitHub Education, so I asked what happens if the repo is the platform, not GitHub plus an LMS but GitHub as the LMS. Coursework is a repo, submitting is a push, grading is a GitHub Action, and feedback is a Markdown file that lands in the student's own repo. The only outside system is Canvas, right at the end, to receive final grades.

Teacher control repo engine · private tests · gradebook Student repo Student repo GitHub Actions grade off a snapshot Gradebook single source of truth Canvas publish content push = submit write scores one CSV, term end deliberate publish step
The whole design in one breath

The trick that keeps it sane is one idea repeated, so four live classes never quietly drift into four snowflakes I can no longer maintain.

One org per course

Locked down so a student sees only their own repos.

One teacher control repo

The engine: the scripts, the workflows, the private grader tests, and the gradebook. The gradebook is the single source of truth. If it is not in the gradebook, it did not happen.

One workspace repo per student

Both their graded coursework and their personal scratch space, which is exactly why the next rule matters so much.

Grading and publishing, separately

The grader scores off a snapshot of the student's repo, against my tests, and never writes back. Delivering grades is a second, deliberate step that dry-runs by default.

The rules I will not break

The engine is identical across every course. Only the tests and a small config file change: edit once, copy everywhere. And the machine never writes to a student's own work during grading. Anything that writes to a student repo or the gradebook dry-runs first and shows me the plan, so I read what is about to happen before it happens. Those two rules are the reason I can let automation this close to real grades sleep at night.

Read more
The full build storyhow the "repo is the platform" reframe fell out of having no budget, and the unglamorous access-control bugs that turned out to be the real work.
Docshow the system is put together: the four repos, the safety model, and the audits.
Projectsback to the rest of what I've been building.

This is not a product, and that is the point. It is a teacher's tool that happens to be built like real software, with tests and dry runs and audits, because that is the only way I trust a machine anywhere near my students' grades. What it will never have here: course internals or student data. Those stay private.

Part of tjakoen.github.io.

🤖 Built with Claude. I don't prompt and pray, I prompt and prove. Every commit here is co-authored with an AI, on purpose. How I actually work with AI, receipts and all →