๐ŸŽ“ The Academic Knowledge Management Dilemma

Modern higher education and enterprise training programs rely almost universally on Learning Management Systems (LMS) like Instructure Canvas to distribute coursework, lecture modules, assignments, student discussions, and grading rubrics.

Yet for technical students, researchers, and security practitioners who build their intellectual workflows inside personal knowledge management (PKM) tools like Obsidian, Canvas represents an isolated, walled-off data silo:

  1. Ephemerality & Term Expiration: Once an academic semester concludes, student access to Canvas courses is routinely archived or revoked. Syllabi, instructor annotations, curated reading lists, and assignment rubrics vanish behind institutional access gates.
  2. Disconnected Knowledge Silos: Course notes authored in Obsidian remain disconnected from source materials, grading criteria, and module pacing guides living inside the web browser.
  3. Administrative Token Gating: Canvas exposes an extensive REST API, but institutional administrators frequently disable personal access tokens (Account > Settings > + New Access Token) for student roles due to enterprise compliance policies.
  4. Third-Party Cloud Aggregation Risks: Existing third-party scrapers and web integrations require routing student session credentials, course documents, and peer discussions through external SaaS servers. For students handling proprietary lab code or education records governed by FERPA and GDPR, third-party cloud aggregation is an unacceptable privacy compromise.
Third-Party Cloud Scraper (High Risk):
[Canvas LMS] ----(Credentials/Course Data)----> [Cloud Relay / SaaS] ----> [Obsidian Vault]
                                                        โ–ฒ
                                                        โ””โ”€โ”€ Attack Surface & Data Leakage Risk

Canvas to Obsidian Sync (Hybrid Local-First Architecture):
[Canvas LMS REST API] โ•โ•โ•โ•(Direct Token / requestUrl)โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—
                                                                        โ–ผ
[Canvas LMS Web Tab]  โ•โ•โ•โ•(Session Cookies)โ•โ•โ•โ•> [Browser Ext] โ”€โ”€(127.0.0.1)โ”€โ”€> [Obsidian Vault]

To bridge this divide while respecting strict privacy boundaries, I designed and open-sourced Canvas to Obsidian Sync (v0.3.1)โ€”a hybrid, local-first ecosystem that provides two flexible ingestion pathways converging on a unified rendering engine.


๐Ÿ›๏ธ Hybrid Ingestion Architecture

obsidian-canvas-sync employs a hybrid architecture that adapts to both institutional API policies and platform constraints:

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                                   CANVAS LMS CLOUD                                     โ”‚
โ”‚   โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”   โ”‚
โ”‚   โ”‚  Canvas REST API (/api/v1/...)                                                 โ”‚   โ”‚
โ”‚   โ”‚  - Courses, Modules, Pages, Syllabus                                           โ”‚   โ”‚
โ”‚   โ”‚  - Assignments, Rubrics & Student Submissions                                  โ”‚   โ”‚
โ”‚   โ”‚  - Discussions & Complete Nested Reply Trees                                   โ”‚   โ”‚
โ”‚   โ”‚  - Calendar Events & Due Date Milestones                                       โ”‚   โ”‚
โ”‚   โ”‚  - Course Files & Static Asset Downloads                                       โ”‚   โ”‚
โ”‚   โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜   โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                             โ”‚                               โ”‚
        Mode A: Direct API   โ”‚ HTTPS                         โ”‚ Mode B: Session-Based
      (Obsidian requestUrl)  โ”‚ (Bearer Token)                โ”‚ (Browser Session Cookies)
                             โ”‚                               โ–ผ
                             โ”‚                 โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
                             โ”‚                 โ”‚ Companion Web Extension   โ”‚
                             โ”‚                 โ”‚ (Chrome / Firefox)        โ”‚
                             โ”‚                 โ”‚ - Session Extractor       โ”‚
                             โ”‚                 โ”‚ - Extraction Toggles      โ”‚
                             โ”‚                 โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                             โ”‚                               โ”‚ Loopback POST (127.0.0.1:27125)
                             โ”‚                               โ”‚ (Opt-in / Disabled by default)
                             โ–ผ                               โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                              OBSIDIAN PLUGIN RUNTIME                                   โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”                     โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”‚
โ”‚  โ”‚ CanvasApiClient         โ”‚                     โ”‚ Loopback Bridge Server           โ”‚  โ”‚
โ”‚  โ”‚ (Direct API Connection) โ”‚                     โ”‚ (conditionally active)           โ”‚  โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                     โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ”‚
โ”‚               โ”‚                                                   โ”‚                    โ”‚
โ”‚               โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                    โ”‚
โ”‚                                     โ”‚                                                  โ”‚
โ”‚                                     โ–ผ                                                  โ”‚
โ”‚                       โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”                                    โ”‚
โ”‚                       โ”‚   Canonical Course Payloadโ”‚                                    โ”‚
โ”‚                       โ”‚   (CanvasCoursePayload)   โ”‚                                    โ”‚
โ”‚                       โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                                    โ”‚
โ”‚                                     โ”‚                                                  โ”‚
โ”‚                                     โ–ผ                                                  โ”‚
โ”‚                       โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”                                    โ”‚
โ”‚                       โ”‚ Markdown & Link Engine    โ”‚                                    โ”‚
โ”‚                       โ”‚ - GFM Converter (Turndown)โ”‚                                    โ”‚
โ”‚                       โ”‚ - Wikilink Transformer    โ”‚                                    โ”‚
โ”‚                       โ”‚ - Table Pipe Escaper      โ”‚                                    โ”‚
โ”‚                       โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                                    โ”‚
โ”‚                                     โ”‚                                                  โ”‚
โ”‚                                     โ–ผ                                                  โ”‚
โ”‚                       โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”                                    โ”‚
โ”‚                       โ”‚ Asset & File Downloader   โ”‚                                    โ”‚
โ”‚                       โ”‚ - Binary Streamer         โ”‚                                    โ”‚
โ”‚                       โ”‚ - Size/Extension Filters  โ”‚                                    โ”‚
โ”‚                       โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                                    โ”‚
โ”‚                                     โ”‚                                                  โ”‚
โ”‚                                     โ–ผ                                                  โ”‚
โ”‚                       โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”                                    โ”‚
โ”‚                       โ”‚ Vault Note Generator      โ”‚                                    โ”‚
โ”‚                       โ”‚ - Path Sanitization       โ”‚                                    โ”‚
โ”‚                       โ”‚ - Templated Course Vault  โ”‚                                    โ”‚
โ”‚                       โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                                    โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                                      โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                              OBSIDIAN VAULT STORAGE                                    โ”‚
โ”‚  โ””โ”€โ”€ Canvas/CS101 - Intro to CS/                                                       โ”‚
โ”‚      โ”œโ”€โ”€ Course.md, Home.md, Syllabus.md, Grades.md                                    โ”‚
โ”‚      โ”œโ”€โ”€ Tasks.md, Discussions.md, Calendar.md                                         โ”‚
โ”‚      โ”œโ”€โ”€ Modules/01 - Week 1/01 - Page - Lecture.md                                    โ”‚
โ”‚      โ”œโ”€โ”€ Files/ (PDF, DOCX, XLSX, etc.)                                                โ”‚
โ”‚      โ””โ”€โ”€ Attachments/ (Images, Banners)                                                โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

The Two Ingestion Modes

Ingestion ModePrimary MechanismBest ForPlatform Support
Mode A: Direct REST APIObsidian native requestUrl using Canvas Bearer TokenStandard users, automated multi-course batch syncing, historical/concluded course archivingObsidian Desktop & Mobile
Mode B: Companion Web ExtensionManifest V3 background script extracting active tab session cookiesLocked-down universities where student API keys are disabledChrome, Firefox, Brave, Edge, Arc

๐Ÿ”’ Threat Modeling & Security Hardening

Operating an open HTTP listener within an Electron desktop application introduces potential Cross-Site Port Scanning and CSRF risks if an attacker attempts to transmit payloads to 127.0.0.1.

In obsidian-canvas-sync v0.3.1, the loopback bridge implements strict defense-in-depth controls:

1. Opt-In Loopback Server (Closed by Default)

The local HTTP server on 127.0.0.1:27125 is disabled by default. Users relying on the Direct REST API mode never expose a local TCP port. The bridge only initializes when the user explicitly enables browser extension sync in plugin settings.

2. Mandatory Origin & Client Header Guards

Preflight OPTIONS and POST requests must present:

  • An approved extension scheme (chrome-extension:// or moz-extension://).
  • The mandatory custom header: X-Canvas-Sync-Client: Obsidian-Canvas-Sync-Extension.

Browsers prohibit arbitrary websites from setting custom request headers across origins without triggering CORS preflight rejections, isolating the endpoint from drive-by web scripts.

3. Path Traversal & Filename Sanitization

Canvas module names and assignment titles often contain characters that are illegal across POSIX/NTFS file systems or represent directory traversal sequences (../../).

All paths pass through deterministic sanitization:

1
2
3
4
5
6
7
export function sanitizeVaultPath(input: string): string {
    return input
        .replace(/[\\/:*?"<>|]/g, '-')  // Strip illegal filesystem characters
        .replace(/\.\.+/g, '.')          // Eliminate directory traversal sequences
        .replace(/^\/+|\/+$/g, '')       // Trim boundary slashes
        .trim();
}

๐Ÿ“Š Comprehensive Synchronization Capabilities

Both ingestion modes stream data into a unified canonical payload (CanvasCoursePayload), producing complete, interconnected course vaults:

1. Grades & Submissions (Grades.md)

Syncs active grade standing, current course scores, submission status (Submitted, Graded, Missing), points earned vs points possible, submitted file links, and instructor feedback comments.

1
2
3
4
5
6
### ๐Ÿ“Š Student Gradebook Summary

| Assignment | Status | Score | Max Points | Feedback |
| :--- | :--- | :--- | :--- | :--- |
| **Lab 1: Cryptanalysis** | Graded | 95.0 | 100.0 | Great implementation of Kasiski examination. |
| **Midterm Exam** | Graded | 88.0 | 90.0 | Solid analysis on forward secrecy. |

2. Discussions with Nested Reply Trees (Discussions.md)

Preserves instructor discussion prompts along with complete multi-tier nested student replies, formatted as hierarchical callouts with author timestamps and direct link anchors.

3. Assignments & Rubric Table Normalization (Tasks.md)

Canvas rubrics use complex, nested HTML tables. The engine converts these into clean GitHub Flavored Markdown (GFM) tables, capturing rating descriptions, point distributions, and grading criteria:

1
2
3
4
5
6
### ๐Ÿ“‹ Assignment Grading Rubric

| Criterion | Ratings | Max Points |
| :--- | :--- | :--- |
| **Architecture & Threat Model** | โ€ข Exemplary (20 pts): STRIDE model applied.<br>โ€ข Proficient (15 pts): Minor gaps.<br>โ€ข Novice (5 pts): Missing loopback controls. | 20 pts |
| **Unit Test Coverage** | โ€ข Full Marks (30 pts): 100% Vitest pass rate.<br>โ€ข Partial (20 pts): Missing edge cases. | 30 pts |

4. Local File & Asset Downloader (Files/ & Attachments/)

Directly downloads referenced course documents (.pdf, .docx, .pptx, .xlsx, .zip) and embedded images into dedicated vault folders. Includes configurable maximum file size limits (default: 50MB) and extension allowlists.

All internal module items and syllabus links are resolved to Obsidian [[wikilinks]]. Table-embedded links use strict pipe escaping ([[path\|alias]]) to ensure markdown tables render without broken column boundaries.


๐Ÿ—‚๏ธ Generated Vault Structure

Synced courses generate a structured, navigable directory hierarchy:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
Canvas/
โ””โ”€โ”€ CS510 - Advanced Network Security/
    โ”œโ”€โ”€ Course.md         # Master index note with metadata & instructor contact
    โ”œโ”€โ”€ Home.md           # Course landing page & announcement banners
    โ”œโ”€โ”€ Syllabus.md       # Complete syllabus text, policies & textbook list
    โ”œโ”€โ”€ Tasks.md          # Assignment checklists, due dates & rubric tables
    โ”œโ”€โ”€ Grades.md         # Gradebook table with scores, percentages & feedback
    โ”œโ”€โ”€ Discussions.md    # Discussion board topics with full student reply trees
    โ”œโ”€โ”€ Calendar.md       # Course milestones, due dates & Zoom meeting links
    โ”œโ”€โ”€ Modules/
    โ”‚   โ”œโ”€โ”€ 01 - Week 1 - Applied Cryptography/
    โ”‚   โ”‚   โ”œโ”€โ”€ 01 - Page - Stream Ciphers & Block Ciphers.md
    โ”‚   โ”‚   โ””โ”€โ”€ 02 - Assignment - Breaking Polyalphabetic Ciphers.md
    โ”‚   โ””โ”€โ”€ 02 - Week 2 - Protocol Vulnerabilities/
    โ”‚       โ”œโ”€โ”€ 01 - Page - TLS 1.3 & Forward Secrecy.md
    โ”‚       โ””โ”€โ”€ 02 - Assignment - Wireshark Decryption Lab.md
    โ”œโ”€โ”€ Files/            # Downloaded PDFs, DOCX, slides, spreadsheets, and archives
    โ””โ”€โ”€ Attachments/      # Embedded images, course banners, and diagrams

๐Ÿš€ Installation & Getting Started

1. Install the Obsidian Plugin

  1. Open Obsidian Settings > Community Plugins.
  2. Disable Restricted mode if prompted.
  3. Search for Canvas Sync Bridge, click Install, and Enable.

Method B: Obsidian BRAT (Beta Builds)

  1. Install the BRAT Plugin in Obsidian.
  2. Under BRAT settings, click Add Beta plugin and enter:
    https://github.com/SixFiveMil/obsidian-canvas-sync
    

Method C: Manual Release

Download main.js, manifest.json, and styles.css from the Latest GitHub Release and place them in <Vault>/.obsidian/plugins/canvas-sync-bridge/.


2. Choose Your Sync Method

  1. In Canvas, navigate to Account > Settings > Approved Integrations > + New Access Token.
  2. Copy your generated access token.
  3. In Obsidian Settings under Canvas Sync, enter your Canvas Base URL (https://canvas.instructure.com or your institution domain) and API Token.
  4. Press Ctrl/Cmd + P and run Canvas Sync: Select & sync courses (or click the ๐ŸŽ“ ribbon icon) to launch the interactive course selector.

Option B: Browser Extension Bridge (Zero-Token Mode)

  1. In Obsidian Settings under Canvas Sync, toggle on Enable browser bridge listener.
  2. Install the companion extension:
  3. Open any Canvas course tab in your browser, click the extension icon, test the bridge connection, and click Sync Active Course.

๐Ÿค Open Source & Community RFC

obsidian-canvas-sync is distributed under the MIT License and developed publicly at SixFiveMil/obsidian-canvas-sync.

We welcome feedback, issues, and contributions from students, researchers, and educators. Join the architectural discussion on GitHub Discussions!