Canvas Quirks Encyclopedia

Canvas fails students in specific, documented, reproducible ways — a to-do list that only looks one week ahead, overdue work that silently disappears, dashboards that hide half your courses. This encyclopedia documents each quirk with the evidence: the exact behavior, why it happens, what you can do about it, and where the proof lives — usually in Canvas's own source code. No rumors; every entry cites its source.

The entries

The Canvas to-do list only looks one week ahead The feed behind the to-do list is built from a scope whose defaults run from four weeks back to one week forward. Work due further out is not in the list yet, however large it is. The window is the default in Canvas's own source, and Instructure's Users API reference — the page documenting this endpoint — does not state it.

Overdue offline assignments vanish from the to-do list Paper submissions, external-tool assignments (which includes New Quizzes), and assignments with no online submission stay on the list only while the due date is in the future. Once the deadline passes, they drop off, whether or not the work was done.

Courses missing from your Canvas dashboard If you have ever starred a course, your dashboard shows only starred courses. If you have starred none, Canvas substitutes a default list of current courses, capped at 20 by default. Nothing on screen tells you which mode you are in, so courses you starred last term can hide the ones you are taking now.

Locked Canvas assignments leave your to-do list entirely The to-do scope filters locked items out by default, and Canvas counts an assignment as locked both before its Available-from date and after its Available-until date. A quiz that closed overnight leaves nothing on the list to say you missed it.

Ungraded quizzes and surveys are invisible in the to-do feed Practice quizzes and surveys are excluded unless an app explicitly asks for them, and even then their window runs only from the current moment to one week out — with no backward window at all.

The has_submitted_submissions API trap This Canvas API boolean flips true when any student in the course submits, not when you do. Instructure's own documentation says so, and an app that reads it as a personal completion signal will close work you have not started.

The Canvas calendar feed's hard limits A subscribed calendar is a copy, not a live view. One university's Canvas documentation puts the Canvas-side delay at roughly an hour, and the app that fetches the file refreshes on a schedule of its own.

Your Canvas calendar feed URL is a credential The feed URL carries an opaque per-user token — on Canvas, in the path itself. A calendar subscription is an unauthenticated fetch, so possession of the link is authorization to read the schedule behind it.

All-day events: the end date is exclusive RFC 5545 defines an all-day event's end date as the day after its last day. A reader that displays that date literally shows all-day assignments one day late — and shifting the start date to compensate creates the mirror-image bug.

Floating times can put deadlines on the wrong day A timestamp carrying no timezone at all is what the spec calls floating, and resolving it is the reading app's job. An app that assumes UTC shifts the event by your whole offset, which near midnight moves it onto the next day.

A 90-day recurrence horizon silently truncates your semester Ninety days is 12.9 weeks and a semester is 15 or 16, so a reader that clips recurrence expansion at a fixed horizon drops the last weeks of a weekly series — with no error, because the expansion succeeded.

The Todoist calendar-sync duplicate loop Two-way calendar sync plus a feed subscription pointed at the same calendar forms a closed circuit: mirrored events re-import as new tasks, which mirror again. Neither product is malfunctioning; the wiring is.

How to read these entries

Each entry answers the same four questions in the same order: what you see, why it happens, what you can do about it, and what the evidence is.

The evidence section is the point. Canvas's web application is open source, so most of these behaviors can be read directly in the code that produces them, and each entry quotes the file and the code it came from, with the date it was retrieved. Where the source is Instructure's own documentation, the entry quotes and links that documentation instead. Where something comes from our own experience building Margin's Canvas and calendar-feed integrations, the entry says so in the first person rather than dressing it up as a general fact.

Two standing cautions. First, Canvas changes, so a quoted snippet can move or be rewritten; the behavior is the durable part, and every quote carries the date we read it. Second: Margin can only show what Canvas exposes — check your syllabus too. The syllabus is still the only complete record for anything an instructor never entered into Canvas.

A note on completeness

Canvas also filters instructor-suppressed assignments out of the to-do feed (without_suppressed_assignments in the same scope) — rare, hard to self-diagnose, listed here for completeness.

Evidence

The behaviors cataloged here are read from the canvas-lms source on the master branch, retrieved 2026-07-30: app/models/user_learning_object_scopes.rb (the to-do scope, its due_after / due_before defaults, the submittable clause, and without_suppressed_assignments), app/models/abstract_assignment.rb (OFFLINE_SUBMISSION_TYPES and scope :submittable), and app/models/user.rb (the menu_courses favorites fallback and menu_course_limit). Documentation citations are to Instructure's own developer docs, Users API reference, retrieved 2026-07-30. Each entry repeats the specific quote it relies on.