Complex Course Logic & Tools
Overview
Complex Course Logic & Tools covers the advanced authoring capabilities that go beyond standard course creation — conditional content releases, prerequisite gating, custom course pacing, and specialized course delivery modes. These features allow course creators to design adaptive or conditional learning flows that respond to learner behavior or progress.
CCX (Custom Courses for edX) is the primary vehicle for course customization at the delivery level — allowing instructors to derive modified versions of a master course for specific cohorts.
Current State (2026)
- Conditional content:
ConditionalDescriptorandSplitTestDescriptorXBlocks enable A/B testing and conditional unit visibility based on cohort membership or prerequisite completion - Content gating: Graded subsections can be gated behind prerequisite completion; configurable via course advanced settings
- Course pacing: Instructor-paced vs. self-paced mode; self-paced allows learners to move through on their own schedule with per-learner due dates
- Prerequisites: Course-level prerequisites (one course must be completed before enrolling in another) configured in
course-discovery - CCX (Custom Courses for edX): Allows instructors to create customized sub-versions of a master course with their own start dates, content subsets, and enrollment
- Schedule & Dates:
openedx-django-learning-coreand edX-platform date logic manages relative and absolute due dates
Architecture
- Conditional logic: Implemented as XBlocks (
SplitTestDescriptor,ConditionalDescriptor); evaluated server-side at render time - Gating: Grade-based gating uses the persistent grade model; prerequisite gating uses completion tracking
- CCX:
CCXCon(CCX Connector) andedx-platformCCX models allow per-learner course derivations; not widely deployed - Pacing: Course pacing mode stored in course metadata; self-paced due dates computed per-learner from enrollment date
- Course prerequisites: Enforced by
edx-platformat enrollment time; prerequisite course IDs stored incourse-discovery
Relevant Repositories
| Repository | Role in This Feature | Activity Level | Notes |
|---|---|---|---|
| openedx/openedx-platform | Conditional logic, gating, pacing, CCX implementation | High | Core platform for all logic |
| openedx/frontend-app-authoring | Authoring UI for advanced settings and gating config | High | Studio MFE |
| openedx/ccx-keys | CCX course key format | Low | Key structure for CCX courses |
| openedx/course-discovery | Course-level prerequisite configuration | High | Prerequisite data model |
Recent Changes
- Self-paced course delivery growing in adoption
- CCX remains available but not widely deployed
History
Origin
- Year introduced: Various — conditional content and A/B testing features were added iteratively post-launch; CCX introduced ~2015
- Initial implementation: Conditional XBlocks and split tests built into the XBlock framework; CCX built as a derivative course model
- Context: As edX scaled, course teams needed more flexibility — A/B testing for content effectiveness, gated content for structured learning paths, and customized course delivery for enterprise/SPOC use cases
Key Milestones
| Year | Milestone | Teams / People Involved |
|---|---|---|
| ~2013–2014 | SplitTestDescriptor (A/B) and conditional content XBlocks added | Unknown |
| ~2015 | CCX (Custom Courses for edX) introduced for SPOC use | Unknown |
| ~2016–2017 | Self-paced course mode launched | Unknown |
| ~2018–2019 | Grade-based content gating implemented | Unknown |
People Who Shaped This Area
- Engineering: Unknown — open question for interview
- Product: Unknown — open question for interview
- Design: Unknown — open question for interview
Open Questions
- [ ] What drove the introduction of CCX and who were the primary users?
- [ ] Is CCX still actively used and maintained, or effectively deprecated?
- [ ] How does content gating interact with the new persistent grade model?
- [ ] What are the authoring UX implications of conditional content — can authors preview conditional paths?
- [ ] What is the relationship between
SplitTestDescriptorand cohort-based content visibility? - [ ] How does self-paced due date computation work technically?