canvas-course-sync
Skill2 starsChanged 57 days agoMITView on GitHub
Use when syncing Canvas course materials and announcements.
In this repository16 other files it gives its agents.
- categorizerSkill
- course-knowledge-baseSkill
- course-study-sessionSkill
- email-draftingSkill
- exam-prepSkill
- grade-calculatorSkill
- homework-checklistSkill
- meetings-and-clubsSkill
- note-formatting-rulesSkill
- photos-to-pdfSkill
- roadmapSkill
- school-advisorSkill
- study-notes-workflowSkill
- suite-updateSkill
- verification-before-completionSkill
- writing-for-agentsSkill
The file
We split this skill into the rules it gives an agent
8 rules. About 0 are common, 1 is distinctive, and 7 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈1
Distinctive · estimate
This author's own choices. Worth a look.
7
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 49
Run downloads in background with notify (terminal background=true + notify=true): 40–90 min lectures exceed the 420s foreground cap.
- Very specific: line 50
Verify each mp4 with C:/Program Files/yt-dlp/ffprobe.exe after download.
- Very specific: line 51
After transcription, skim the transcript for Key Points and file them beside it.
- Very specific: line 57
Read page text with tool_call desktop_preview read (wait ~2s after navigating).
- Very specific: line 70
Keep the professor's ORIGINAL filenames (they encode lecture order, e.g.
- Very specific: line 89
Update Classes/Roadmap.md (deadlines, stress-balanced by-day plan — user wants load-tagged 🟢/🟠/🔴 scheduling, not raw deadline lists) and …
- Distinctive: line 91
Ask the user to run this weekly or when Canvas shows unread/new-content counts.
- Very specific: line 95
Pane flakiness: use the retry ladder in references/pane-retry.md (elements refresh → wait → URL check → tab handling → hand to human for …
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Canvas Course Sync
Recurring job: sweep every Fall 2026 course on Canvas and pull anything not already local: module items, assignment attachments, announcements, files. Canvas API tokens are DISABLED at this school, so everything goes through the user's logged-in preview pane.
School config (READ BEFORE EVERY COURSE SESSION)
The suite ships with <PLACEHOLDER> tokens; resolve them from ~/.hermes/school-config.md (copy school-config.example.md there and fill in YOUR values once). At the start of any course session, read that file; if it is missing, tell the user to create it and stop — never answer with literal placeholders.
Student ID, school domain, course IDs, instructor/org names, platform URLs, and CLASSES_ROOT all come from the config. Never hardcode real values into any SKILL.md — that is what the config file is for.
To resolve values quickly, run python scripts/read_school_config.py (it reads ~/.hermes/school-config.md and exits 1 with a hint if missing).
Course IDs
Your school's IDs go in ~/.hermes/school-config.md (each course URL shows /courses/<ID>/). Keep a row per course, e.g.:
course_id_course1: <ID>
course_id_course2: <ID>
course_id_course3: <ID>- The agent sweeps Canvas courses with the IDs from config; add a note next to each for quirks (disabled assignments, external homeworks, lab cadence).
Fresh-machine config (read me before first sweep)
- Classes root: this suite assumes a
Classes/folder (syllabi, materials, Roadmap.md, Announcements/). On a fresh machine, setCLASSES_ROOT(defaultC:/Users/<USER_NAME>/Desktop/Classeson the origin machine) and use it everywhere instead of the literal path. - The one-time login in the pane (Dashboard → courses) is required; Achieve (Macmillan) and Pearson (MasteringEngineering) cannot be pane-logged — the user self-checks those and the agent reminds them weekly.
- Dependencies: python3 with
faster-whisper pymupdf pillow, plusyt-dlp(+ bundled ffmpeg). See the suite README for install per OS.
Kaltura recorded lectures (download + transcribe)
Lecture videos are Kaltura playManifest URLs; the ks token in them EXPIRES within hours, so every video needs a FRESH URL from the user (F12 → Network → filter m3u8 → play → copy the a.m3u8). Never store the token — redact it.
Packaged pipeline (download + faster-whisper transcription, one background call):
cd "<Course>/Materials/Lectures" # or wherever the video belongs
bash "$SKILL_DIR/scripts/kaltura_pipeline.sh" "<fresh a.m3u8 URL>" "<Output Base Name>"- Outputs
<Name>.mp4+<Name> - transcript.txt+<Name> - transcript.md(timestamped[MM:SS]lines). - Name by entryId lookup in
scripts/kaltura_entries.tsv(entryId → canonical name); append new rows as you discover them so future grabs auto-name. entryId is theentryId/<id>segment of the URL. - Run downloads in background with notify (
terminalbackground=true + notify=true): 40–90 min lectures exceed the 420s foreground cap. yt-dlp-c -N 8resumes safely across the restart. - Verify each mp4 with
C:/Program Files/yt-dlp/ffprobe.exeafter download; transcription takes ~10–25 min per hour of audio on CPU (int8). ADONE <n> segments, <x> minline means the transcript is written. - After transcription, skim the transcript for Key Points and file them beside it; log flags to
Roadmap.md.
Pane driving (the only read path)
tool_call desktop_preview openhttps://<SCHOOL_DOMAIN>(user stays logged in; reopen if the pane was closed).tool_call drive_preview elementsfirst every page change; act by ref, not guessed selectors. Refs die on navigation — freshelementsafter every navigate.- Read page text with
tool_call desktop_preview read(wait ~2s after navigating). - Per course navigate to:
/courses/{id}/modules,/courses/{id}/assignments,/courses/{id}/announcements,/courses/{id}/files(files page is often hidden; modules usually carry everything).
Sweep checklist (per course, in this order)
- Announcements → compare against
Classes/Announcements/<Course>.md(one md per course,## YYYY-MM-DD — Titlenewest-first, full body). Append anything missing. If disabled (Circuits, Statics — verified), note and skip, don't re-check every time. - Modules → enumerate items. Files: download anything missing from local
Materials/; external tools/videos: record existence + link in the course README (don't block the sweep on video extraction — flag for later). - Assignments → note new due dates for
Roadmap.md+ course README deadline tables. Download attached assignment sheets toMaterials/Homework/. - Files → download anything not already local.
Dedupe + storage rules
- Local compare = same title OR same content; only pull what we don't have.
- Keep the professor's ORIGINAL filenames (they encode lecture order, e.g.
<COURSE_CODE>-4a_). - Multiple formats of the same lecture: keep PDFs only (user's standing rule for lectures).
- Layout:
<Course>/Materials/→Syllabus.*(original name),Lectures/,Homework/(HW{n}.pdf),Homework Solutions/; textbooks atMaterials/root as<Author> - <Title> (<ed> ed).pdf. - Student work + AI guides:
<Course>/Materials/Homework/HW{n}/holds the user's own work (scanned JPGs/PDF) plus any AI-chat export (e.g.Circuits HW1 AI Guide.md— Gemini) as a reference; file them there so every attempt/verification is recoverable next to the problem sheet. - Downloads land in the user's Downloads folder via the pane; move them into the right course folder as part of the sweep. Never auto-process
~/Downloadsfor categorization, but class-material moves out of Downloads are expected.
Other grading platforms (user self-checks — assistant REMINDS)
The user checks both sites in their own browser (the pane can't hold those logins — confirmed 9/12). The assistant's job is the weekly reminder (Sunday review + before due windows) and logging what the user reports/screenshots. Read-only; never submit or change anything.
- Achieve (Macmillan) — homework platform. Course URL:
https://<ACHIEVE_COURSE_URL>/mycourse(from config). The week view lists each HW with due dates + point values, review assignments, and adaptive quizzes.- Pane login does NOT work for Achieve (confirmed 9/12) — the user checks the week view in their own browser and reports/screenshots; log to
Chemistry/README.md+Roadmap.md. - Capture: weekly HW names/due dates/point values + completion status →
Chemistry/README.md+Roadmap.md(the Achieve assignment list mirrors the screenshot the user takes).
- Pane login does NOT work for Achieve (confirmed 9/12) — the user checks the week view in their own browser and reports/screenshots; log to
- Pearson MasteringEngineering — homework platform. Course menu URL:
https://<PEARSON_COURSE_URL>(from config). Also reachable via Canvas → "MasteringEngineering" external-tool link (SSO via the pane's Canvas session; may need one user login the first time).- Pane login does NOT work for Pearson either — the user checks their homework list in their own browser and reports/screenshots; log due dates + scores to the Statics README + Roadmap. Statics Canvas assignments are disabled, so Pearson is the ONLY source of Statics due dates, and the user-check is mandatory, not optional.
- The user will keep taking screenshots of the Achieve week view — treat those as a first-class scan artifact (vision-read them like the 9/11 batch).
After the sweep
- Update
Classes/Roadmap.md(deadlines, stress-balanced by-day plan — user wants load-tagged 🟢/🟠/🔴 scheduling, not raw deadline lists) and the course README deadline table. - Report what was new vs already-local per course, and any videos/external tools that need follow-up.
- Ask the user to run this weekly or when Canvas shows unread/new-content counts.
Pitfalls
- Pane flakiness: use the retry ladder in
references/pane-retry.md(elements refresh → wait → URL check → tab handling → hand to human for hover-⤓ downloads / third-party logins). - Kaltura
kstokens die within hours — a URL that 404'd means it expired; ask the user for a fresh one. A URL from yesterday NEVER works. - Automating the URL grab (browser_exec local=true) requires Chrome fully quit first — never kill the user's tabs; ask first.
drive_previewintermittently fails with 'arguments is not valid JSON' or 'pointer input never reached the page' — navigation usually still happened; re-runelements()for fresh refs and re-read the URL before retrying.- The user may close the preview pane mid-sweep; reopen it. If they close it in the middle of a critical flow, say so.
- AI policy varies by course (one course may allow AI with acknowledgement, another forbids it on graded work). Never ghostwrite graded written work.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

