The challenge
A North American higher-ed institution had Panopto for lecture capture and Canvas LMS for course delivery, but nothing connecting them at scale. Every term, an instructional design team spent ~600 hours doing the same manual loop: confirm a recording finished, find the right Panopto folder, name the recording correctly, set captions and access, post a link in the right Canvas module, then chase down the lectures that didn't record at all.
The failure modes were frustrating and predictable. Recordings published to the wrong section. Captions delayed by days. Late-semester rooms with broken capture devices that nobody noticed until students complained. And no audit trail — when a student asked "why was last Thursday's lecture missing?" nobody could give a confident answer. The institution wanted the team's 600 hours back, the failure modes caught the moment they happened, and a system that could scale to twice the current room count without adding headcount.
Our solution
We built an end-to-end orchestration layer in Python and FastAPI that listens to Canvas course events and Panopto recording events, joins them through a local catalog model that knows about courses, sections, rooms, and instructors, and drives the full publish workflow automatically.
The local catalog is the key idea. Instead of asking Canvas and Panopto the same questions over and over, we maintain a small, authoritative PostgreSQL catalog of courses, sections, room-to-section mappings, instructor-to-section ownership, and the publishing rules each department has chosen. Canvas Live Events and Panopto webhooks update the catalog in near real time; a FastAPI orchestration service then drives every downstream action: file the recording in the right Panopto folder, request captions, set access by section roster, post the lecture into the right Canvas module, and write a structured audit event for every step.
Intelligent filtering catches the failure modes that used to be invisible. If a scheduled lecture has no recording within 15 minutes of class end, the system pages the instructional support team and opens a tracked incident. If captions are still missing after the SLA window, it escalates. Every single publish action — successful or not — is logged with who, what, when, why, and the upstream events that triggered it, so the question "why was last Thursday missing?" now has an answer in 30 seconds.
- Local catalog of courses, sections, rooms, instructors, and per-department publishing rules
- Canvas Live Events + Panopto webhook ingestion through an inbox-pattern receiver
- Idempotent per-recording state machine: detected → filed → captioned → posted → audited
- Intelligent missing-recording detection with 15-minute SLA and tracked incident creation
- Caption SLA monitoring with automatic escalation when the window is missed
- Per-section roster-aware access control applied to Panopto folders and Canvas posts
- Replay tool to re-run the publish workflow for any historical recording end-to-end
- Structured audit log answering 'why is this lecture missing?' in 30 seconds
- Admin UI for instructional design team to edit publishing rules without an engineer