Any lightweight LMS with Markdown support?

Hi there! :wave:

I’ve been using GH Classroom at university for almost 5 years, with very good results.

We use a GH page, mostly a blog, to share content with our students. Each lesson has its own post, where we include videos, text, articles and one or two exercises - basically links to GH Classroom assignments.

That model has worked well so far, but it has a few disadvantages:

  • students can’t track their own progress, since all of them see the same static site,
  • each semester, I have to hide all the lessons and release them again when the time comes,
  • I can’t use the same site for two different courses with some weeks of distance - because one of them will be spoiled with future lessons.

What I imagine is a very simple LMS (or kind of) where I can create courses, add students to them and share these lessons - just a Markdown/HTML file. I want to keep it as simple as possible: I don’t need nor want any fancy WYSIWYG editor, or friendly backoffice UI. Ideally, my students will login using their GitHub account, so they don’t need to remember any new account.

Do you happen to know something that works like this? I’m a developer, so I can spend some reasonable time configuring and deployingo something that may fit my needs. I can even develop some of the functionalities myself, but I don’t have time to start from scratch.

Thanks in advance!
Fede, from Argentina :argentina:


Hi Fede,

I have found that different types of documents have very different lifespans. Things like notes and resources tends to have a longer life. Sometimes its shared between courses. Things such as assignments/labs/addendas have a shorter life… applicable only to that semester and changes for each run of the course… so for organization, I separate out these components. This is what I do:

For long lasting content:

  • I use gitbook to create my course notes. One book per course. gitbook is great in that your content is yours and you can synch it to a github repo and have your content in its markdown form. I’m not locked in. I can write in markdown in my repo or use gitbooks wysiwyg and it will generate the course notes for me. Looking at moving to docusaurus for the future but for now, gitbook solves a bunch of problems for me.
  • For common content(content that I might use in multiple course like my gdb guide or style guide), I create a repository with a bunch of markdown wiki pages.
  • both the notes and common content are linked from the course content repository which I create each semester.
  • note that these are all publicly available for easy of linking.

For short term content, I create a separate github repo for each course each semester but I do it using github classroom to help with user management.

  • Create a course oganization for the course you are running.
  • Setup a template repo for your course with your short term content as well as links to your long term content.
  • Using github classroom, I create a group assignment that I call something like “content-s21”. In the settings:
    • I set it to allow creation of maximum of 1 team
    • private repo, no admin access.
  • I accept the assignment using my own account, and then I go into that repo and change the settings to make it read only. This doesn’t affect you as owner of org so you can write to it… but students who accept the assignment can’t.
  • After setting up the repo, I give this assignment link to my students and they simply accept it to get access to course content.
  • If you need a new run, just make another group assignment for the new students in the same way and send that other link.
  • If you want to change some of the assignments or labs between semesters just edit the repo for that term.

For progress tracking… I have a bunch of testers that I run off our college’s infrastructure so they know when things work or not. However, would using something like autograder scripts with assignments allow them to at least self check?

user admin is a lot of work and github classroom has made it a lot easier.

Anyhow, hope this helps.

1 Like

I am just finishing up teaching a programming course and found this post is addressing exactly the issues I am trying to solve before my next run of the course next month.

So far I have been using GitBook for my course content and sharing it with my students. I plan on using GH Classroom for assignments next term.

I have the same issue of how to create a reproduceable framework for each run of the course.

I get how you separate your long-term content into GitBook but hoped you could give a few more details as to how you “link” to it from your short-term GH Classroom content. Do you just link to the specific topic in the GitBook? This would allow the student to browse through the entire GitBook once they follow the link, correct? I was hoping that I could figure out a to have a week-by-week GitBook, or GH Classroom page, that incrementally adds lessons as we move along, copy each week from my long-term content GitBook.

In gitbook, I don’t know of a way to link to a part of the book and limit access to just that part. For me, being super lazy, I link to the start of the part that I want them to read and list the topics and I tell them that the book is organized in same order that material is presented in class. If they wish to read ahead, I don’t see a problem with it. If you want to limit it week by week, you would need to put each week into a separate book on gitbook… but I can’t think of any other method to release this week by week othewise.

I was using github before GH classroom existed, so for me GH classroom is more of a repository creation/access management tool. I use GH Classroom to create repositories within an organization because it helps with managing access rights. Before gh classroom, I had a google form that students would use to fill in their names and github id’s and then I would take that info and run a bash script to create teams and access. Someone would always fill in that form wrong by adding things like brackets to indicate their preferred name and break my script so it was really annoying.

For the courses I teach, I have a common repo that all students have read access to where I post everything. This is where the creation of a “group assignment” that has only 1 team for content access comes in. Doing this method, in github, I can create a single repository that all students can access by using a link and hitting a “join” button which is super easy to deal with and I don’t have to manage lists of userid’s. When you create a “group assignment” with one team, what gh classroom will do is create a single repo and a single team within your course organization. Any student who “joins” the assignment is added to that one team on github. I change the access level to the course repository of that one team to “read”, so that students can’t alter my course repository content. I then use the repository’s wiki as a means to hand out “documents” (assignments, labs, notes… everything). I have a skeleton “Home page” that I copy over that has a list of links to everything. So as you can see, long term content are full urls, while short term content are not. I then go and populate the short term content as I go. If that short term content is not yet posted, I just make the page and put “coming soon” on it… this will give me a url to that content even if its not done and I can put a link to it in the school’s LMS. Here is the skeleton that I have (shortened of course… but you sort of get a feel for the setup).

* [Course Addenda](Course-Addenda)
* [Course Notes](

## Labs
* [Lab 0](Lab-0)
* [Lab 1](Lab-1)
* [Lab 2](Lab-2)

## assignments

* [assignment 1](assignment-1)
* [assignment 2](assignment-2)
* [Style Guide](

## resources

* [my animations, sorting, linked list, stacks, queues](
* [GDB Guide](
   * [gdb - lldb command map](
* [Drawing Template for Linked Lists](

The addenda has weekly topics, and here is how I post that:

All readings are from the subject notes:

| Week | Topics and Reading | Assessment - Out |  Assessment Due and Weight |
| week 1 | [Introduction](, [Algorithms analysis](, [Asymptotic Notation](|Lab 0, Lab 1| Lab 0 - 0% |
| week 2 | [Recursion](, [Lists](| Lab 2 and  A1 |  |

You could also just make the main wiki page your file content instead of wiki… but I prefer the wiki.

Anyhow, I hope this helps clarify what I usually do.

Thank you Catherine for taking the time to supply such a detailed description of your setup. That really helped.

I also have my core long-term course content in Gitbook. I like your short-term wiki that links to labs/assignments/long-term course content. I was trying to use Gitbook for that as well, as I really like how easy it is to incorporate images, code snippets, etc. I was even trying to figure out how I could store all my lab content in a master Gitbook, but that doesn’t really work, as I do want to incrementally distribute that and Gitbook doesn’t support that.

Again, thanks for the details. I really appreciate it.


Gitbook really is very good for what it does. Not sure if you know this, but you can sync your gitbook content to a github repo and it will generate your book content in markdown to that repo. the repo and book content has a bidirectional sync. Thus, if you edit the markdown in your repo, it will also reflect in your book. if you like the formatting that gitbook does, you could probably do a private gitbook space that syncs to a private repo … then you will have the content in markdown form and can copy over as you go.

If all you need to do is put in code and images,markdown isn’t too bad for putting in images and code snippets (the hardest thing for me to put in properly is properly rendered math).

For code snippets you can get proper formatting by putting 3 backticks (`) followed by language before the code block and 3 backticks at the end:

#include <iostream>
int main(void){
(three back ticks here.. I can't get it to show)

Images are a bit harder as you need to find a way to host it… This term my students discovered that if they put the images into an issue, they can get a web url for the image, then adding it to wiki page is relatively easy. Alternatively you can make a repo and turn on github pages, then just put all your images into that repo. This will also give you a url for the image.

In any case I’m happy that this has been useful for you :). Let me know if you have other questions.

I’m assuming you also have a LMS. Where do you put the links to the GitHub Classroom assignments? In your class Wiki or the LMS, or both? It seems like you have to duplicate stuff in LMS and class Wiki.

Do the students submit their GitHub assignments in the LMS? I saw another thread where someone said they had the students submit the assignment repo URL in the LMS.


Do you create unique pages for each lab/assignment? I have been creating a template repository for the labs, and use the README for the directions. I was thinking I would provide a link to the GitHub Classroom assignment on the Wiki page, but it sounds like you create an intermediate page for the lab?

The assignment specs are in the course wik and I put the link to classroom there. Part of this is because I want my students to use a specific naming convention so that I can easily find their repos within the organization so I don’t want them to just click the link.

In the assignment specs I have a blurb that has a link and instructions on how I want them to name their teams when creating assignments. This naming convention lets me filter within the organization for a particular student’s repo. Since all student repos created with classroom are within a single organization, I don’t really need them to send me a link as I can filter for it quickly in the github web interface.

This is part of the blurb that I wrote for our assignment:

When setting up your repo please name your team as follows:

a1 schoolusername1 schoolusername2

Thus, if you are creating a team for assignment 1 with team members were jdoe and cleung, you should name your team:

a1 jdoe cleung


We have been online for a while and I find that online, you want to be pretty clear about where stuff is. When we were in person, I use to have a link to just the course content repo and tell them all content is there… since going online, I have found that its necessary to be more consistent about where and how to find course content and have been using the LMS a touch more (though my content is still simply links into various pages in the repo). So all assignments are linked from the lms out to the assignment specs in course repo. This allows courses that have more than one section (and more than one teacher) to have same basic lms shell (since the links are the same).

As for submission, I use a combo of github and our college unix system to run a testing script which runs tests and sends me an email if completed. I plan to look into auto grading feature but need to figure out the best way to do that first. Students submit their assignments on the unix system (my colleague wrote a wonderful script to do this). If their assignment passes testing, the system sends me an email letting me know that the student’s code works (and a copy of the code. I also get my students to push their work into their assignment repo. When I grade I verify that tests have passed by looking for the system email. then I read the content of repo and write feedback into the issue tracker. I then use that feedback to determine grade for student and use the LMS to deliver the numeric grade.

The best part about feedback through github is that you can get really specific about exactly where something isn’t quite right or to discuss a blurb of code… its superior to pretty much every lms feedback system for programming courses.

Thanks again, for your help. I will also create the assignment wrapper page with the short instructions and the GitHub Classroom link. I agree, that it will be helpful to have that placeholder page from the Wiki page so that the schedule’s links all go somewhere.


Hi @catherine-leung and @annechinn, I’m very glad my question helped another people. I’ve been reading your answers but couldn’t make a time to write my own one - until now.

Based on Catherine’s first post, I decided to “split” my GitHub page in two: one for the long-term content and another one for the short-term course-based content (assignments, announces, deadlines, etc). Also based on your advise, I’ve created a Docusaurus site for the long-term page and I’m very happy with it.

Just in case you want to take a look, these are my pages (content is in Spanish, but I think you can get the idea):

Book with long-term content: Diseño de software orientado a objetos | Diseño de software orientado a objetos
Course-specific page:
Example of a lesson for a course: Clase 2 - Pruebas automatizadas y TDD | ProgramaciĂłn con Objetos 2

As you can see on the Lecturas section, almost all the content is just a link to my book.

Thanks to both of you for sharing your experiences!

1 Like

Our school has been looking at docusaurus for updating some of the course notes. I have mine in gitbook but annoyed that I can’t get pdf for cheap enough (their minimum number of licenses put it out of range for me to pay out of my own pocket). Also, one of our profs wants to make it possible for students to hack on the docusaurus code to address accessibility issues and so on and thats not possible with gitbook. Would love to hear your experience with it. Thank you for sharing in any case. Glad I could help

1 Like

Hi again Catherine!

DISCLAIMER: besides from being a teacher, I’m a software developer too. So my experience can be a little biased…

To be honest, Docusaurus felt completely natural for me from the beginning. If you want to use it “as is”, you just have to drop your Markdown files on a docs folder, optionally creating subdirectories if you want to create categories. You have to include some metadata too, but I believe that GitBook should be similar in that matter.

Then, the other advantage of Docusaurus is that everything is extensible, and it’s built in a very modular fashion so you can change only the components you want to change. For instance, I’ve personalized the appearance a bit, added an open source search instead of using Algolia and created some custom components to deliver a more consistent experience while browsing the site.

If you’re familiar with Markdown, I really encourage you to try Docusaurus. I’m using GitHub pages as hosting, the Docusaurus’ docs tell you how to achieve that.

Let me know if you need anything or have doubts about any feature. We can even start another thread so it’s easier for others to find it.

My colleagues have started taking the old course notes and converting them into markdown. Its looking fantastic. I am planning to try it out… see how much work it takes to convert my markdown files (generated from gitbook) to it. I know markdown well enough but gitbook does add a bunch of extra tags so there will likely need to be some code written parse that stuff. Docusaurus looks really good though. I will bug you if I need help but I think I can probably get it going :).

1 Like

Great! Please share your results, I could forward your example to other teachers of my university.

© 2017 GitHub, Inc.
with by
GitHub Education