I wrote a small command line tool (in Python) for retrieving, adding and updating content, pages and files exposed to students and teachers, for a Canvas course.


At the University of Oslo, we started using Canvas a few years back. Writing content for the pages of a course is normally done through a web-interface. However, I am very fond of writing content for the web in Markdown. However, there is no option to write in Markdown directly in the Canvas web interface.
I also like to keep my textfiles under version control. So, I needed a way to write course pages in Markdown, convert them to html and upload them to my Canvas course, ideally through the command line - another tool I am very fond of. Since I could not find such a tool, so I decided to write my own. After all, Canvas is an open source project and has an API!


Thus was born canvasCourseCli. It uses the Canvas API through the Python package canvasapi. Commands start with canvasCourseCli followed by one of the subcommands:

list_files    -u URL                        List all files for a course on Canvas.
list_pages    -u URL                        List all pages for a course on Canvas.
tree          -u URL                        List all folders for a course on Canvas.
dump          -u URL                        Download all files and pages for a course on Canvas.
view_page     -u URL                        View the content of a page on Canvas.
add_page      -u URL -t TITLE -f HTML_FILE  Add a new page to Canvas.
create_folder -u URL                        Create a new folder on Canvas.
add_file      -u URL -f FILE_TO_SEND        Add a file to a folder on Canvas.
update_page   -u URL -f HTML_FILE           Update the content of a page on Canvas.
add_to_module -u URL -m MODULE_NAME         Add a page on Canvas to a module.

For example, if you want to replace the content of an existing page with content of a file (in html format) on your computer, for an imaginary course that ‘lives’ at https://instance.instructure.com/courses/9999, you could run this command:

canvasCourseCli update_page -u https://instance.instructure.com/courses/9999/pages/name-of-page -f file.html

I hope to develop more subcommands in the future.

How I use it

  • I write course pages in Markdown
  • convert them to html using pandoc
  • upload or update them to Canvas using canvasCourseCli
  • I use a Makefile and Gnu Make to automate this process
  • I also automate uploading some of the files that I add to Canvas on a weekly basis through that Makefile

All pages for the latest edition of my course ‘BIOS1100 - Introduction to Computational Modelling in the Biosciences’ are written in Markdown and updated on Canvas through canvasCourseCli, and many of the course’s files are added through it too. Feel free to view the results at the Canvas page for this course.

What about the Canvas Data CLI Tool canvasDataCli?

The Canvas Data CLI Tool is used to extract course data from the database. canvasCourseCli is meant to work with course pages and files.

How to install it

For now, canvasCourseCli is available through a GitHub repo at https://github.com/lexnederbragt/canvasCourseCli. Clone that repo, or download the code, and make it available on your system. I hope to make it into a ‘proper’ Python package, installable through (for example) pip, as soon as I find time to figure out how to do that.

Further documentation can be found in the README file of the repository.

A word of warning

I have not been able to test canvasCourseCli on any other Canvas (instructure) instance than the one provided by my university. I would appreciate feedback (through the issue functionality of the Github repository) on both successful and failed attempts at using the tool for your course.

What’s next

I hope to add functionality and improve the code in the near future. There is a ToDo list that has my thoughts and wishes for further development. I welcome contributions!

A note on teaching, programming and using the command line

I used to do a lot of command line based analysis on supercomputers. These days, I mostly teach programming to novices. However, as much as possible I try to use my ‘command line and programming skills’ for my teaching work. So

  • I write course materials in Markdown or DocOnce (another markup language)
  • have all text files under version control
  • convert to different formats through the command line
  • automated using make and Makefiles where possible
  • synchronize the files to Canvas with canvasCourseCli

Not only does this make me more efficient, I also find it a fun way to work (and it keeps my skills up to date)!

This is my first real piece of software that I deliberately wrote also for others to use. Pretty scary, actually! But I realized that if canvasCourseCli is useful to others, I may even get people interested in helping me to improve the tool!

Finally, when writing this program, and setting up the repository, I aimed to follow the recommendations we wrote in the Good enough practices in scientific computing paper. I found that to be a very useful exercise!

Enjoy canvasCourseCli and, as I said, I welcome contributions!