{
"$type": "site.standard.document",
"content": "---\ntitle: \"Class discussions on Discourse\"\ndescription: \"Switching from Piazza to self-hosted Discourse for a 200-student course\n forum, with practical notes on setup, tradeoffs, and what's missing.\"\ntags:\n - teaching\n - dev\n---\n\nIn 2018 I (with the support of the Teaching & Learning IT team in\n[my School](https://cs.anu.edu.au)) switched from [Piazza](https://piazza.com)\nto a self-hosted [Discourse](https://www.discourse.org) instance for class\ndiscussions. Specifically, I used it for\n[COMP1720: Art & Interaction in New Media](https://cs.anu.edu.au/courses/comp1720/),\na large-ish (~200 students) introductory code/art programming and interaction\ndesign course. This course is open to both CS and non-CS students, and can be\ncounted towards a major in both the CS and the ANU School of Art and\nDesign.[^artgit]\n\n[^artgit]:\n I also teach all the artists & designers to use git---and it works really\n well... with the appropriate scaffolding. Knowing how to use version control\n really does feel like having superpowers when editing digital, and seeing\n artists and designers realise this is pretty cool.\n\nThis wasn't because Piazza sucks---it's actually pretty great in lots of ways.\nBut there were a few things we hoped to that Discourse would do better:\n\n1. integration with the rest of our class management infrastructure (so that the\n professor doesn't have to keep adding/students manually as enrolment grows\n and then settles down at the start of semester)\n\n2. a [proper API](https://docs.discourse.org), rather than using one of the\n [unofficial Piazza API clients](https://github.com/hfaran/piazza-api) and\n hoping that Piazza didn't break things just before an assigment/exam\n\n3. proper markdown support (with the ability to add whichever programming\n languages we like through [highlight.js](https://highlightjs.org)\n integration) rather than whatever they call the nonsense pseudo-markdown and\n flaky rich text editor that Piazza offers\n\n4. self-hosting and controlling where the data is stored, because I don't think\n I ever figured out whether it was technically ok to store student data on a\n foreign server and compel students to create an account on same\n\n5. a [plugin ecosystem](https://www.discourse.org/plugins) so that we could\n tweak it to suit our specific needs (and potentially develop our own plugins)\n\nStill, there are a couple of things that Discourse is missing out-of-the-box\ncompared to Piazza:\n\n1. the ability for instructors (professors & tutors) to mark a question/answer\n as a _good question/answer_ (really handy in teaching)\n\n2. the ability for students to \"post anonymously to other students\" while still\n being visible (identifiable) to the instructors\n\n3. ability for students to \"accept\" an answer,\n [SO](https://stackoverflow.com)-style (there's a\n [plugin for this](https://github.com/discourse/discourse-solved), but we\n didn't use it first time around)\n\nHow'd it all go? Pretty well, actually---student engagement was higher than\nthe previous year (with Piazza) and anecdotal feedback was that the students\nliked it. The limitations described\nabove didn't bite _too_ hard, although I do think that the \"post anonymously to\nstudents\" thing in particular does encourage students to speak up when they're\nstruggling in a way that they don't when their name is attached to everything.\n\nAlong the way, we also made some decisions about how to organise/administer a\nDiscourse server for use as a course forum. Since Discourse isn't specifically\ndesigned for this task, we had to make a few choices, and it's worth laying them\nout here in case anyone else is going down the same path. Note, you'll need to\nget your head around the Discourse nomenclature if you're going to use it, but\nthe crash course is\n\n- threads are called **topics**\n- topics are grouped into **categories** and **subcategories** (but only 2\n levels max---no **subsubcategories**)\n- **groups** are groups of users\n\nSo, the way we organised it was:\n\n- each course is a **category**\n- **subcategories** were devoted to e.g. lectures, labs, assignments, etc.\n- _access control_: all students were enrolled into a **group**, which was given\n read/write access to the **category** with the same name[^samename]\n- tutors (TAs) were given\n\n[^samename]:\n the course category (list of topics) and group (list of members) could in\n principle have different names\n\nHere's an example: for COMP1720 we set up\n\n- a top-level _comp1720_ category\n- a _comp1720_ group (in which all students in the course were automatically\n enrolled using the Discourse API)\n- all tutors are members of a _comp1720-tutors_ group, which has a higher\n privilege level\n\nThis way, if a student is enrolled in multiple courses, they'll appear in\nmultiple groups. They'll have access to all the topics in the categories for\ntheir courses, but not any topics from other course (of course).\n\nOne final bonus is that the default \"homepage\" for a logged in user shows the\nlatest posts across all the user's categories (although users can customise this\nbehaviour).\n\nFor next steps, I've got a student who's working hard to develop a new plugin\nto restore the \"anon to students, visible to instructors\" behaviour, since that's a\ndeal-breaker for a lot of folks (it nearly was for me as well). We'll release\nthat plugin when it's done and the kinks are worked out.\n\nThere are still things to figure out as well, but things are looking good. I\nwouldn't go back; I think it's easier to add the things I miss from Piazza to\nDiscourse than the other way around.\n\nIf you've got experience with this sort of thing and have suggestions or\ncomments, then get in touch (<ben.swift@anu.edu.au>)\n",
"createdAt": "2026-05-13T23:15:00.738Z",
"description": "Switching from Piazza to self-hosted Discourse for a 200-student course forum, with practical notes on setup, tradeoffs, and what's missing.",
"path": "/blog/2019/02/06/class-discussions-on-discourse",
"publishedAt": "2019-02-06T00:00:00.000Z",
"site": "at://did:plc:tevykrhi4kibtsipzci76d76/site.standard.publication/self",
"tags": [
"teaching",
"dev"
],
"textContent": "Switching from Piazza to self-hosted Discourse for a 200-student course forum, with practical notes on setup, tradeoffs, and what's missing.",
"title": "Class discussions on Discourse"
}