You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Fast-track continuity: the one contestable piece - dropping cross-course "Search Your Courses"
with no MFE replacement - already ran a full standard RFC as #38941, now unblocked. The rest is
unreachable dead code. This consolidates the whole frontend teardown and supersedes #38941.
Rationale
Part of the move to consolidate the frontend and remove non-MFE experiences. The legacy course
search UI is a Backbone/RequireJS bundle, openedx/features/course_search/, with two entry points,
both now clear to remove:
In-course searchcourse_search_factory.js is unreachable dead code - no template
instantiates it, only the RequireJS build manifest references it. The learning MFE replaced the
legacy courseware page that hosted it.
Cross-course dashboard searchdashboard_search_factory.js - the "Search Your Courses" widget
on the legacy dashboard - has no MFE replacement. Its removal was decided via #38941, now unblocked.
Both entry points share the same core, so the cleanest path is to remove the whole bundle in one
pass. This supersedes and closes as a duplicate #38941.
Description
Removed - the entire legacy course search frontend:
The openedx/features/course_search/ bundle in full: both factories, the shared
views/collections/models, Underscore templates, JS specs, fixtures, and README.rst. Static
assets only - no Python.
The two course_search/js/*_factory entries in lms/static/lms/js/build.js.
The ENABLE_DASHBOARD_SEARCH widget blocks in lms/templates/dashboard.html.
The ENABLE_DASHBOARD_SEARCH feature flag: definition in lms/envs/common.py, env defaults in test.py / devstack.py, and its clause in the SEARCH_ENGINE condition in lms/envs/production.py.
The associated SCSS - lms/static/sass/features/_course-search.scss and lms/static/sass/search/_search.scss and their imports; verify they are not shared with another
search UI before deleting.
Replacement / transition
In-course search is served by the learning MFE via the shared /search/ API - no operator action.
ENABLE_DASHBOARD_SEARCH defaults to False, so most deployments are unaffected.
Out of scope, preserved:
The /search/ endpoint, lms/urls.py → include('search.urls'). The learning MFE depends on it.
In-course search: the ENABLE_COURSEWARE_SEARCH flag and the course_api search path the learning
MFE uses.
The content index, SEARCH_ENGINE / ENABLE_COURSEWARE_INDEX. It is shared and still driven by ENABLE_COURSEWARE_SEARCH, so removing ENABLE_DASHBOARD_SEARCH frees no search infrastructure.
Task List
Remove the openedx/features/course_search/ bundle in full.
Remove the two course_search/js/*_factory entries from lms/static/lms/js/build.js.
Remove the ENABLE_DASHBOARD_SEARCH widget blocks from lms/templates/dashboard.html.
Remove the ENABLE_DASHBOARD_SEARCH flag - definition, env defaults, and the SEARCH_ENGINE
clause - preserving ENABLE_COURSEWARE_SEARCH.
Verify and remove the associated SCSS partials.
Set the issue status to Transition Unblocked and post the link in #risky-changes.
Close #38941 as a duplicate, with
a comment noting dashboard search is removed as part of this DEPR, and cross-link.
RFC Start Date
N/A -- Already Accepted
Target Plan Accepted Date
N/A -- Already Accepted
Target Transition Unblocked Date
Immediately -- Transition Already Unblocked
Earliest Breaking Changes Unblocked Date
2026-09-10
Rationale
Part of the move to consolidate the frontend and remove non-MFE experiences. The legacy course
search UI is a Backbone/RequireJS bundle,
openedx/features/course_search/, with two entry points,both now clear to remove:
course_search_factory.jsis unreachable dead code - no templateinstantiates it, only the RequireJS build manifest references it. The learning MFE replaced the
legacy courseware page that hosted it.
dashboard_search_factory.js- the "Search Your Courses" widgeton the legacy dashboard - has no MFE replacement. Its removal was decided via
#38941, now unblocked.
Both entry points share the same core, so the cleanest path is to remove the whole bundle in one
pass. This supersedes and closes as a duplicate
#38941.
Description
Removed - the entire legacy course search frontend:
openedx/features/course_search/bundle in full: both factories, the sharedviews/collections/models, Underscore templates, JS specs, fixtures, and
README.rst. Staticassets only - no Python.
course_search/js/*_factoryentries inlms/static/lms/js/build.js.ENABLE_DASHBOARD_SEARCHwidget blocks inlms/templates/dashboard.html.ENABLE_DASHBOARD_SEARCHfeature flag: definition inlms/envs/common.py, env defaults intest.py/devstack.py, and its clause in theSEARCH_ENGINEcondition inlms/envs/production.py.lms/static/sass/features/_course-search.scssandlms/static/sass/search/_search.scssand their imports; verify they are not shared with anothersearch UI before deleting.
Replacement / transition
/search/API - no operator action.there is real demand it would be rebuilt as a net-new feature in the new frontend.
ENABLE_DASHBOARD_SEARCHdefaults toFalse, so most deployments are unaffected.Out of scope, preserved:
/search/endpoint,lms/urls.py→include('search.urls'). The learning MFE depends on it.ENABLE_COURSEWARE_SEARCHflag and thecourse_apisearch path the learningMFE uses.
SEARCH_ENGINE/ENABLE_COURSEWARE_INDEX. It is shared and still driven byENABLE_COURSEWARE_SEARCH, so removingENABLE_DASHBOARD_SEARCHfrees no search infrastructure.Task List
openedx/features/course_search/bundle in full.course_search/js/*_factoryentries fromlms/static/lms/js/build.js.ENABLE_DASHBOARD_SEARCHwidget blocks fromlms/templates/dashboard.html.ENABLE_DASHBOARD_SEARCHflag - definition, env defaults, and theSEARCH_ENGINEclause - preserving
ENABLE_COURSEWARE_SEARCH.#risky-changes.a comment noting dashboard search is removed as part of this DEPR, and cross-link.
Related: #38936.