openedx / openedx/openedx-platform

Combine LMS and CMS into a single headless service

Open
#38,762 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Dominant language
Python
Stars
8.2k
Forks
4.4k
Avg merge
6d 18h
Merged PRs (30d)
42

Description

Goal: to simplify our codebase, operations, and deployment by combining the CMS and LMS into a single headless REST API server.

Background: Proposal: Combined Headless LMS+CMS

Tentative steps (these should be converted to sub-issues):

  1. Create and merge an ADR for this.
  2. Either migrate our course content to openedx-core (talk, slides, code) or convert the modulestore APIs to be more explicit about draft vs. published (so that calls like modulestore().get_item() become published_modulestore().get_item() or modulestore().get_published_item(), etc.).
    Hopefully we can just go with the first option, and the modulestore APIs can become a legacy read-only/published-only API without many changes.
  3. URL by URL in the CMS URLconf, add the URL to the LMS URLconf; test the behavior and address issues until they are returning identical responses whether accessed via LMS or CMS domain. Then remove it from the CMS URLconf and replace it with a redirect or a proxy.
  4. Same thing for management commands.
  5. Eventually the CMS is just a redirect/proxy service and doesn’t even need to be a django app anymore, and can be replaced with some nginx forwarding rules or something like that.

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start with the linked combined LMS+CMS proposal and the CMS URLconf at cms/urls.py, then review the referenced openedx-core discussion and implementation. The work needs to be split into an ADR, a modulestore/content decision, URL and management-command parity, and eventual CMS redirect or proxy behavior. Done means the agreed migration path is documented and LMS and CMS access have matching behavior before the CMS service is reduced.

Written by the indexing model from the issue text.

Assessment

Tech stack
django, python
Domain
api, backend, infrastructure
Issue type
Feature
Difficulty
5/5
Estimated time
Over a week
Activity status
Quiet
Clarity
Needs clarification
Newbie friendliness
25/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.