A fast, safe, and customizable tool to download course content from Canvas (Instructure).
Features:
- Safe: Strictly read-only. Never modifies, deletes, or uploads any data.
- Cross-Platform: Works on macOS, Windows, and Linux.
- Optimized: Uses parallel downloading and smart rate-limiting to be fast without getting blocked.
- Complete: Can download Files, Modules, Pages, and Assignments (including attached solutions/descriptions).
- Flexible: download everything in structured folders, or flatten it; ignore specific files; pick specific courses.
Why?
- I was tired of downloading course content manually
- I wanted to have a backup of my courses
- I wanted to be able to access my courses offline
- I want to feed the downloaded content into a LLM
- I want to turn my courses into a searchable database
- I want to turn my courses into a quiz or practice test
This is the easiest way to use the tool. Get it directly from PyPI.
pip install canvas_downloaderThen run it anywhere:
canvas-downloader --help- Install uv (if needed):
brew install uv(macOS) orpip install uv(others).- (For more help see uv docs)
- Clone the repo:
git clone https://github.com/jamubc/Canvas_Downloader.git cd Canvas_Downloader - Setup environment:
uv venv uv pip install -r requirements.txt
- Run:
uv run python downloader.py --help
canvas-downloader \
--api-token YOUR_API_TOKEN \
--course-id YOUR_COURSE_ID \
--output-dir ./my_course_download \
--canvas-url https://canvas.instructure.com(Replace YOUR_API_TOKEN, YOUR_COURSE_ID with real values. Use your school's URL for --canvas-url)
For more information see Canvas API Documentation
You can customize the download by adding these flags to the command above:
| Flag | Description |
|---|---|
--include-assignments |
Recommended. Downloads assignment instructions and attached files (solutions, starter code, etc.) into an Assignments/ folder. |
--include-submissions |
Download your own submissions (e.g. uploaded files, graded PDFs) into Assignments/{Name}/Submissions/. |
--no-structure |
Flattens all files into a single directory instead of organizing them by Module/Week. |
--ignore-pattern "*.ext" |
Skips files matching the pattern. Can be used multiple times. Example: --ignore-pattern "*.zip" --ignore-pattern "*.m" |
--no-optimize |
Disables parallel downloading and smart rate-limiting. Use this if you encounter errors or want a strictly sequential, slower download. |
--force |
Force redownload of all files, ignoring any existing files (bypassing sync logic). |
--canvas-url URL |
Base URL of your Canvas instance. Defaults to https://canvas.instructure.com. Example: https://canvas.ubc.ca |
uv run python downloader.py \
--api-token <TOKEN> \
--course-id 123456 \
--output-dir ./Fall2024_Backup \
--canvas-url https://canvas.ubc.ca \
--include-assignments \
--ignore-pattern "*.mp4" To download new content later, just run the same command again. The script is safe to run multiple times; it will overwrite existing files with the latest versions from Canvas.
Q: How do I download all my Canvas course contents at once? A: This tool is built exactly for that. It iterates through your entire course (Modules, Files, Assignments, Pages) and saves everything to your local computer in one go.
Q: Can I backup my Canvas courses before I lose access? A: Yes! Use this tool at the end of the semester to create a permanent, offline archive of your materials (PDFs, PPTXs, Videos, etc).
Q: Does this download videos and quiz content? A: It downloads files and assignment descriptions. Video support and specific quiz capture are currently being worked on (see Upcoming Features).
Im happy to help, please open an issue on GitHub.
- Downloading Video files (currently unhandled)
- AI Embedding
- Plug in usage for 'canvas-mcp-tool' (please reach out if you are interested in testing it!)
- Repomix integration
This project is licensed under the MIT License - see the LICENSE file for details.