For the last couple of months, you may have noticed that both your in-progress and completed courses – non-legacy courses, that is – are synced from your Saylor Academy ePortfolio to Syncing that information between the two systems turned out to be a bit of a challenge. Moodle (the LMS we use for seems to be designed with more traditional schools in mind and, sometimes, this is at odds with our use case as a provider of free, open, and self-paced courses.

Moodle comes pre-installed with an enrollment plugin (“External Database“) designed to connect to an external database, read the enrollments, and enroll the appropriate students in each course. We initially tested this plugin but found it not quite working for our use case of having an open instance of Moodle where students can enroll and unenroll at will; the plugin creates a new enrollment type, called ‘database’, and proceeds to enroll students that way.

Students, unfortunately, are unable to control this type of enrollment themselves. If the student’s enrollment is removed from the external database, that student is then unenrolled automatically from the course. The result was that students would be enrolled in the courses that they were enrolled in in ePortfolio but couldn’t control that enrollment at In order to unenroll from that course the student would have to go and log into ePortfolio and unenroll there! Obviously, this was far from ideal.

So what should an organization that believes in openness and the benefits of remixing materials and ideas do? Fork the project and modify it for our use case! We forked the external database plugin and created the DBSelf (“External database (self)” in the admin panel) plugin, modifying it to enroll students with the ‘self’ enrollment type and allowing students to control their enrollment status for the course. If they wished to unenroll, they now could do so from

After this was done, we felt there was still room for improvement on this v1.0 of the plugin and thought it would be great if we could get the completed courses synced as well. The plugin couldn’t interpret completion status and could only enroll students, so we could only sync in-progress courses. And if we were syncing completed courses, could we get the associated data (like the exam grade and completion date) synced as well? This led to further development of the DBSelf plugin over the summer. The result is the current version of the plugin we have in production at

This version of the plugin is able to read the external database and differentiate between in-progress and completed courses (and you can even set what the fields are marked as in the external database — perhaps other systems’ “in-progress” courses are marked as “active” instead); and if the course has been completed, it enrolls the student in the course at the enrollment date specified in the external database, marks the course as completed in Moodle at the specified completion date, creates a final exam grade with the course grade.

The plugin is, of course, open source and can be found on GitHub. There are two branches to the project: the v1.0 branch, which has the first version of the plugin which only self enrolls students, and the master branch, which syncs the completed courses and scores as well. Feel free to use the plugin in your own instance of Moodle or to fork the project and modify if for you own needs!