[Proposal] Optional Content Support
See Github ticket. Please provide feedback before Jul 17, 2026.
TL;DR summary
Add platform-level support for optional course content in the LMS, allowing authors to mark content as “optional”, ensuring it is clearly labeled and excluded from required completion.
Overview
Course teams sometimes want to include enrichment, background, or extra-practice materials that learners may find useful but are not required to complete the course. Examples include background primers, deep-dive readings, supplemental videos, and problem sets for “extra practice”.
Today, Open edX does not have a consistent platform-level concept of optional content. As a result, course teams often rely on naming conventions or custom content workarounds to communicate that something is optional.
This proposal introduces structured optional content support across authoring, the learner-facing UI, completion logic, and reporting. Course authors can mark sections, subsections, units, or XBlocks as optional. Optional content is clearly labeled for learners, excluded from required completion calculations, and platform administrators can track completion of optional items.
This would replace ad-hoc authoring conventions like adding “Optional” to titles or using custom banners, and would make optional learning experiences clearer, more consistent, and easier to manage across courses.
Problem
Course authors sometimes need to include learning materials that are useful but not required. Without a core optional-content model, this creates several issues:
Authors use inconsistent workarounds, such as adding “Optional” to titles, inserting custom HTML banners, or relying on course-specific instructions.
Learners may not easily understand which content is required and which content is additional. This can make it harder for them to prioritize their work.
LMS behavior is ambiguous because optional items may still appear in completion metrics or required progress calculations.
Instructors and platform administrators do not have a consistent way to report on optional content engagement.
Use Cases
As a Platform Administrator…
As a platform administrator, I need optional content to behave consistently across courses in order to reduce course-by-course workarounds and support predictable learner experiences.
As a platform administrator, I need optional content to be excluded from required completion calculations in order to ensure completion data accurately reflects required learner progress.
As a platform administrator, I need optional content to be represented consistently in course data in order to support reliable reporting.
As a Course Author or Instructor…
As a course author or instructor, I need to mark sections, subsections, units, or individual XBlocks as optional in order to include supplemental content without making it required.
As a course author or instructor, I need optional content to be clearly labelled in the learner experience in order to avoid needing to provide additional instructions around it manually.
As a course author or instructor, I need optional content to be excluded from required completion in order to ensure learners are not penalized for skipping non-required course material.
As a course author or instructor, I need to track learner engagement with optional content in order to understand whether supplemental materials are useful.
As a Learner…
As a learner, I need to clearly see which content is optional in order to prioritize required coursework.
As a learner, I need optional content to be visually distinguishable from required content in the course outline, course sidebar navigation, and unit view in order to avoid confusion.
As a learner, I need optional content not to affect my required completion status in order to confidently choose whether or not to complete it.
Proposed solution
Add a platform-level optional content attribute to the LMS and Studio authoring experience.
Authoring experience
Course authors should be able to mark the following as optional:
Sections
Subsections
Units
Individual XBlocks, such as videos, text for content authors etc.
Below are screenshots of how authors can set optional content for sections, subsections, units and XBlocks:
Setting a Section as optional: Actions (kebab menu icon) > Configure > Completion
Setting a Subsection as Optional: Actions (kebab menu icon) > Configure > Completion
Setting a Unit as Optional: Actions (kebab menu icon) > Configure > Completion
Setting an XBlock as optional: Edit > Settings
When a parent item is marked as optional, the learner-facing UI should make this clear for both the parent item and its children where appropriate.
The optional state should be stored in the course structure, for example as an optional: true/false attribute on the relevant course node.
Learner experience
Optional content should be clearly labelled in the learner experience.
In the course outline, optional items should display an outlined OPTIONAL pill alongside the item name:
In the sidebar navigation, optional items should also display an outlined OPTIONAL pill alongside the item name. If an entire subsection is optional, the subsection header and its children should display the OPTIONAL pill for clarity:
If an entire unit is optional, a banner should appear at the top of the unit page to indicate that the content in the unit is optional:
If only a specific XBlock is optional within an otherwise required unit, an OPTIONAL pill should appear in the block header:
Completion and reporting behavior
Optional items:
Should be excluded from required completion calculations.
Should be trackable in terms of engagement by platform administrators. Harvard Medical School uses the OpenCraft completion aggregator to track optional content engagement down to the individual XBlock level, separately from required completion metrics.
The native Open edX completion mechanism can also display optional completion, but only at the unit level, individual optional XBlocks within an otherwise required unit won't be tracked separately.
Should be trackable in terms of engagement by instructors and learners:
Alternatives we considered
Using the Excluded completion mode for XBlocks to exclude content from being counted toward required completion at the XBlock level. However, this approach has the following limitations:
Backward incompatibility: Whether an XBlock counts toward completion is currently a setting built into the XBlock type itself (e.g. the Video XBlock, the Problem XBlock), not something that can be configured for one specific instance of that XBlock in a course. Making this instance-specific would be a structural, platform-wide change that could affect other tools and third-party XBlocks built around the current behavior.
No analytics visibility: XBlocks using Excluded mode do not publish completion data at all, preventing platform administrators and instructors from tracking learner engagement with optional content, which is a capability needed for understanding whether supplemental materials are effective.
Long-term ownership and maintenance plans
We anticipate that several teams will need this functionality, and core contributors from OpenCraft will be actively involved in its development. These contributors will continue to assist with maintenance. If needed, one or more point persons can be designated as the primary contact for this code after its release.
Open Questions for Discussion
When all children of a unit are optional but the unit flag is not set, should a unit‑level banner be automatically shown, or require explicit author choice?
Do we want a course‑level setting to hide sidebar labels for fully optional appendices to minimize noise?
Contacts
Product: @Cassie Zamparini
Technical: @Piotr Surowiec
Harvard Medical School: @YeaRim Oh
I’m concerned that we will have to deal with nonsensical combinations in terms of data handling, e.g. an “Optional” Final Exam that’s worth 50% of the student grade.
Can we leverage Grading’s concept of Assignment Types to get this affect? So when people create a new assignment type in Studio, they’d have a checkbox to say whether it’s optional or not. If it’s optional, the weight is treated at 0% and we don’t care if the number specified matches the number of them in the course. Then we still get the flexibility that people can still label it something (e.g. “Practice Exam” vs. “Review Exercise”) and have that label show up. “Optional” could be added as a label to anything weighted at 0%.
Then we don’t have to worry about conflicts with Progress, and the skip logic for completion becomes simpler. It also means that we don’t have to add a new thing to the serialization format, or worry about parent/child conflicts and what that could mean, e.g. “can I have a mandatory unit in an optional subsection?” Some potential drawbacks:
We couldn’t represent “optional things that don’t count towards completion but do count towards your grade”, which seems like a weird thing to support, but someone might have a use case for…?
The Progress page might have to be modified to skip things that don’t have any gradable things inside of it, if there are pure-reading optional things that would have no score representation.