Sync Canvas LMS data (assignments, calendar events) to Obsidian markdown notes with YAML frontmatter.
- 🔐 Secure API token storage via Windows Credential Manager
- 📚 Web UI for course selection
- 📝 Assignment sync with Dataview-compatible frontmatter
- 📅 Calendar event sync with time windows
- 🔄 Edit detection - skips locally modified files
- ⏰ Daily scheduled sync via background daemon
# Clone repository
git clone https://github.com/Gladdonilli/Gladdon-s-solution-to-education.git
cd canvas-obsidian-sync
# Install with dev dependencies
pip install -e ".[dev]"
# Install Playwright browsers (for E2E tests)
playwright install chromium- Log into Canvas at https://canvas.illinois.edu
- Go to Account → Settings
- Scroll to Approved Integrations
- Click + New Access Token
- Enter a purpose (e.g., "Obsidian Sync") and generate
- Copy the token (you won't see it again)
python -m canvas_syncThis opens the web UI at http://localhost:5000 where you can:
- Enter your Canvas API token
- Select courses to sync
- Trigger manual sync
python -m canvas_syncOpens browser to http://localhost:5000
python -m canvas_sync --daemonRuns daily sync at configured time (default: 6:00 AM)
python -m canvas_sync --versionFiles are created in your Obsidian vault:
Project-obsidian-vault/
└── Courses/
└── CS 101 - Intro to Programming/
├── Assignments/
│ └── Homework 1.md
└── Events/
└── Midterm Exam.md
Assignments include:
type: assignment
course: CS 101
due: 2026-02-15T23:59:00Z
points: 100
status: pending # pending | submitted | gradedCalendar events include:
type: calendar_event
course: CS 101
start: 2026-03-01T14:00:00Z
end: 2026-03-01T16:00:00Z
location: Room 100# All tests
pytest
# Unit tests only
pytest tests/ --ignore=tests/e2e
# E2E tests with Playwright
pytest tests/e2e/src/canvas_sync/
├── api/ # Canvas API client
├── db/ # SQLite models
├── sync/ # Sync logic
├── web/ # Flask UI
└── scheduler.py # Background daemon
MIT