🎓 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.

Open the console yourself

The teacher side of all this is one page, the Course Console: attendance on one tab, and every AI-proposed grade held on the other until I approve or edit it. It ships a demo mode you can open in your own browser right now. It is not a mock-up. The demo runs the real code with exactly one part swapped, the connection to GitHub, so the views, the parsing and the write surfaces are the ones I use, generated in your tab from a fixed seed. No token, no connection, and three invented classes that go away when you close it.

The Course Console dashboard in demo mode, with a demo badge in the sidebar, a banner explaining that three invented classes were generated in this browser with no GitHub connection and no token, and a footer repeating that writes go through intents.
The front door of the demo, which says out loud what it is. Every write in there is simulated in the tab and gone when you close it.

Read more

The Course Console, in demo modethe real console against synthetic students. Nothing to install, nothing to connect.
github-native-course-platform on GitHubthe public code: the console, the scanner, the workflows and the docs. The course internals and the gradebooks stay in a private repo.
The console, and why it looks like thatgoing from four classes to seven, the scanner that came first, and why an AI-proposed grade renders grainy until I sign it.
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 →