# \[RFC\] Pluginifying edx-enterprise — looking for community interest & collaborators

**URL:** <https://discuss.openedx.org/t/rfc-pluginifying-edx-enterprise-looking-for-community-interest-collaborators/18316>\
**Category:** Architecture\
**Tags:** plugins, enterprise\
**Created:** [January 26, 2026, 11:46pm UTC](https://discuss.openedx.org/t/rfc-pluginifying-edx-enterprise-looking-for-community-interest-collaborators/18316 "2026-01-26T23:46:30Z")\
**Posts on this page:** 15\
**Page:** 1

<div class="post-metadata">

**Author:** ![tsankey](https://sea2.discourse-cdn.com/flex020/user_avatar/discuss.openedx.org/tsankey/32/9289_2.png) [@tsankey](https://discuss.openedx.org/u/tsankey)\
**Post date:** [January 26, 2026, 11:46pm UTC](https://discuss.openedx.org/t/rfc-pluginifying-edx-enterprise-looking-for-community-interest-collaborators/18316/1 "2026-01-26T23:46:30Z")

</div>

## 

* * *

## TL;DR

I’m proposing to **convert [openedx/edx-enterprise](https://github.com/openedx/edx-enterprise) into a plugin** using the existing [Open edX plugin framework](https://github.com/openedx/edx-django-utils/tree/master/edx_django_utils/plugins), so that:

- edx-platform no longer directly imports or requires the `enterprise` module.
- Enterprise behavior is provided entirely via **well-defined plugin hooks.**
- Operators can install the official plugin, their own fork, or run **non-enterprise** LMS with zero enterprise code.

This would provide cleaner code boundaries, reduce coupling, and make enterprise functionality truly optional.

The goal of this post is to gather feedback on direction and identify potential collaborators before investing heavily in implementation.

* * *

## Background: Current Pain Points

Today, edx-enterprise is tightly coupled with edx-platform through direct imports across core modules. The `ENABLE_ENTERPRISE_INTEGRATION` setting **doesn’t fully disable** enterprise code paths or imports.

**For operators:**

- Customizing or forking edx-enterprise requires maintaining compatibility with upstream module names and function signatures indefinitely.
- Enterprise code paths cannot be fully switched off, increasing error surface area even for non-enterprise deployments.

**For developers:**

- Tight coupling obscures where enterprise code lives and creates risk of unintended side-effects when modifying either enterprise or platform logic.

* * *

## Proposed Solution

We evaluated simpler alternatives (requirement swaps, patchsets) but found they created unsustainable maintenance burdens. Instead, we propose to **convert edx-enterprise into a true plugin** , which can be done incrementally in phases:

1. **Define a clear “Enterprise plugin interface”** in edx-platform using the existing plugin framework.
2. **Migrate enterprise integration points** behind plugin hooks (can be done incrementally).
  - “plugin hooks” include things like [settings injection](https://github.com/openedx/edx-django-utils/blob/master/edx_django_utils/plugins/plugin_settings.py), [function overrides](https://github.com/openedx/edx-django-utils/blob/master/edx_django_utils/plugins/pluggable_override.py), middleware injections, event receiver/sender injections, etc.

3. **Remove edx-enterprise from base requirements** , making edx-platform agnostic to which (if any) enterprise plugin is installed.

The following edx-platform functionality depends on the `enterprise` module, and will be the main targets for adding plugin hooks:

1. Third-party auth ([common/djangoapps/third\_party\_auth](https://github.com/openedx/edx-platform/blob/9979017b69798d5f89a791a3d4aaba50c12fca47/common/djangoapps/third_party_auth/))
2. Courseware access and DSC redirects ([lms/djangoapps/courseware](https://github.com/openedx/edx-platform/blob/9979017b69798d5f89a791a3d4aaba50c12fca47/lms/djangoapps/courseware/))
3. User API and retirement ([openedx/core/djangoapps/user\_api](https://github.com/openedx/edx-platform/blob/9979017b69798d5f89a791a3d4aaba50c12fca47/openedx/core/djangoapps/user_api/))
4. RBAC role mappings and other enterprise settings ([lms/envs/common.py](https://github.com/openedx/edx-platform/blob/9979017b69798d5f89a791a3d4aaba50c12fca47/lms/envs/common.py))
5. Enterprise support Django app ([openedx/features/enterprise\_support](https://github.com/openedx/edx-platform/blob/9979017b69798d5f89a791a3d4aaba50c12fca47/openedx/features/enterprise_support/))
6. Potentially more…

Please see the attached PDF for the full proposal details.

* * *

## How to Get Involved

Please reply if you have an interest in collaborating, or also if you have any specific feedback/concerns. If there’s positive interest, I may move forward with an Open edX Enhancement Proposal (OEP) to facilitate collaboration. Looking forward to your feedback and seeing if this can become a shared community effort!

[SOL-[Discovery] Forking edx-enterprise-260126-224958.pdf](https://discuss.openedx.org/uploads/short-url/thBVQHdh7Hai1XniXuCJukHmTbJ.pdf) (1.2 MB)

---

<div class="post-metadata">

**Author:** ![Felipe](https://sea2.discourse-cdn.com/flex020/user_avatar/discuss.openedx.org/felipe/32/60_2.png) [@Felipe](https://discuss.openedx.org/u/Felipe)\
**Post date:** [January 27, 2026, 12:03am UTC](https://discuss.openedx.org/t/rfc-pluginifying-edx-enterprise-looking-for-community-interest-collaborators/18316/2 "2026-01-27T00:03:34Z")

</div>

+1!. I have for years thought this is the right approach to edx-enterprise. It was one of the first use cases we tried to understand when initially developing the hooks framework. As a maintainer of the events and filters libraries, I’d be happy to help move things along.

If you see that there are things that are required for this migrations that the libraries don’t yet support, I’ll also be happy to remove those blockers.

---

<div class="post-metadata">

**Author:** ![braden](https://sea2.discourse-cdn.com/flex020/user_avatar/discuss.openedx.org/braden/32/46_2.png) [@braden](https://discuss.openedx.org/u/braden)\
**Post date:** [January 27, 2026, 12:34am UTC](https://discuss.openedx.org/t/rfc-pluginifying-edx-enterprise-looking-for-community-interest-collaborators/18316/3 "2026-01-27T00:34:28Z")

</div>

Big +1 from me as well.

---

<div class="post-metadata">

**Author:** ![scottrish](https://sea2.discourse-cdn.com/flex020/user_avatar/discuss.openedx.org/scottrish/32/727_2.png) [@scottrish](https://discuss.openedx.org/u/scottrish)\
**Post date:** [January 27, 2026, 1:22pm UTC](https://discuss.openedx.org/t/rfc-pluginifying-edx-enterprise-looking-for-community-interest-collaborators/18316/4 "2026-01-27T13:22:24Z")

</div>

+1. This looks great.

---

<div class="post-metadata">

**Author:** ![feanil](https://sea2.discourse-cdn.com/flex020/user_avatar/discuss.openedx.org/feanil/32/37_2.png) [@feanil](https://discuss.openedx.org/u/feanil)\
**Post date:** [January 27, 2026, 4:32pm UTC](https://discuss.openedx.org/t/rfc-pluginifying-edx-enterprise-looking-for-community-interest-collaborators/18316/5 "2026-01-27T16:32:10Z")

</div>

I think this makes a ton of sense, and it will be good to get the interface points needed to make this work moved to openedx-events and openedx-filters.

---

<div class="post-metadata">

**Author:** ![dave](https://sea2.discourse-cdn.com/flex020/user_avatar/discuss.openedx.org/dave/32/263_2.png) [@dave](https://discuss.openedx.org/u/dave)\
**Post date:** [January 27, 2026, 5:11pm UTC](https://discuss.openedx.org/t/rfc-pluginifying-edx-enterprise-looking-for-community-interest-collaborators/18316/6 "2026-01-27T17:11:08Z")

</div>

I agree with everyone else: this is fantastic. Thank you.

> [@tsankey](#):
>
> If there’s positive interest, I may move forward with an Open edX Enhancement Proposal (OEP) to facilitate collaboration. Looking forward to your feedback and seeing if this can become a shared community effort!

FWIW, I think that one or more ADRs in the edx-enterprise repo should be sufficient, as opposed to a full OEP.

---

<div class="post-metadata">

**Author:** ![tsankey](https://sea2.discourse-cdn.com/flex020/user_avatar/discuss.openedx.org/tsankey/32/9289_2.png) [@tsankey](https://discuss.openedx.org/u/tsankey)\
**Post date:** [January 27, 2026, 5:25pm UTC](https://discuss.openedx.org/t/rfc-pluginifying-edx-enterprise-looking-for-community-interest-collaborators/18316/8 "2026-01-27T17:25:36Z")

</div>

Yep, I was just thinking the same.

---

<div class="post-metadata">

**Author:** ![e0d](https://sea2.discourse-cdn.com/flex020/user_avatar/discuss.openedx.org/e0d/32/199_2.png) [@e0d](https://discuss.openedx.org/u/e0d)\
**Post date:** [January 27, 2026, 5:56pm UTC](https://discuss.openedx.org/t/rfc-pluginifying-edx-enterprise-looking-for-community-interest-collaborators/18316/9 "2026-01-27T17:56:49Z")

</div>

I think this a great proposal and am very supportive of this approach. Thanks for putting this together.

---

<div class="post-metadata">

**Author:** ![tsankey](https://sea2.discourse-cdn.com/flex020/user_avatar/discuss.openedx.org/tsankey/32/9289_2.png) [@tsankey](https://discuss.openedx.org/u/tsankey)\
**Post date:** [March 5, 2026, 2:50am UTC](https://discuss.openedx.org/t/rfc-pluginifying-edx-enterprise-looking-for-community-interest-collaborators/18316/10 "2026-03-05T02:50:03Z")

</div>

FYI, my team got the green light to start work on this. This also coincided with gaining claude-code access, so I spent almost a week doing a claude deep-dive and generated about 80% of the overall work as draft PRs. These are designed to be mergeable and deployable incrementally, so no need to do a big bang release.

- Grades Analytics Event Enrichment
  - [https://github.com/openedx/openedx-filters/pull/333](https://github.com/openedx/openedx-filters/pull/333)
  - [https://github.com/openedx/openedx-platform/pull/38097](https://github.com/openedx/openedx-platform/pull/38097)
  - [https://github.com/openedx/edx-enterprise/pull/2543](https://github.com/openedx/edx-enterprise/pull/2543)

- User Account Readonly Fields
  - [https://github.com/openedx/openedx-filters/pull/334](https://github.com/openedx/openedx-filters/pull/334)
  - [https://github.com/openedx/openedx-platform/pull/38098](https://github.com/openedx/openedx-platform/pull/38098)
  - [https://github.com/openedx/edx-enterprise/pull/2544](https://github.com/openedx/edx-enterprise/pull/2544)

- Discount Enterprise Learner Exclusion
  - [https://github.com/openedx/openedx-filters/pull/335](https://github.com/openedx/openedx-filters/pull/335)
  - [https://github.com/openedx/openedx-platform/pull/38099](https://github.com/openedx/openedx-platform/pull/38099)
  - [https://github.com/openedx/edx-enterprise/pull/2545](https://github.com/openedx/edx-enterprise/pull/2545)

- User Retirement Enterprise Cleanup
  - [https://github.com/openedx/openedx-platform/pull/38100](https://github.com/openedx/openedx-platform/pull/38100)
  - [https://github.com/openedx/edx-enterprise/pull/2546](https://github.com/openedx/edx-enterprise/pull/2546)

- Enterprise Username Change Command
  - [https://github.com/openedx/openedx-platform/pull/38101](https://github.com/openedx/openedx-platform/pull/38101)
  - [https://github.com/openedx/edx-enterprise/pull/2547](https://github.com/openedx/edx-enterprise/pull/2547)

- DSC Courseware View Redirects
  - [https://github.com/openedx/openedx-filters/pull/336](https://github.com/openedx/openedx-filters/pull/336)
  - [https://github.com/openedx/openedx-platform/pull/38102](https://github.com/openedx/openedx-platform/pull/38102)
  - [https://github.com/openedx/edx-enterprise/pull/2548](https://github.com/openedx/edx-enterprise/pull/2548)

- Third Party Auth Enterprise Pipeline
  - [https://github.com/openedx/openedx-platform/pull/38103](https://github.com/openedx/openedx-platform/pull/38103)
  - [https://github.com/openedx/edx-enterprise/pull/2549](https://github.com/openedx/edx-enterprise/pull/2549)

- SAML Admin Enterprise Views
  - [https://github.com/openedx/openedx-platform/pull/38104](https://github.com/openedx/openedx-platform/pull/38104)
  - [https://github.com/openedx/edx-enterprise/pull/2550](https://github.com/openedx/edx-enterprise/pull/2550)

- Logistration Enterprise Context
  - [https://github.com/openedx/openedx-filters/pull/337](https://github.com/openedx/openedx-filters/pull/337)
  - [https://github.com/openedx/openedx-platform/pull/38105](https://github.com/openedx/openedx-platform/pull/38105)
  - [https://github.com/openedx/edx-enterprise/pull/2551](https://github.com/openedx/edx-enterprise/pull/2551)

- Student Dashboard Enterprise Context
  - [https://github.com/openedx/openedx-platform/pull/38094](https://github.com/openedx/openedx-platform/pull/38094)
  - [https://github.com/openedx/edx-enterprise/pull/2552](https://github.com/openedx/edx-enterprise/pull/2552)

- Enrollment API Enterprise Support
  - [https://github.com/openedx/openedx-platform/pull/38106](https://github.com/openedx/openedx-platform/pull/38106)
  - [https://github.com/openedx/edx-enterprise/pull/2553](https://github.com/openedx/edx-enterprise/pull/2553)

- Learner Home Enterprise Dashboard
  - [https://github.com/openedx/openedx-platform/pull/38107](https://github.com/openedx/openedx-platform/pull/38107)
  - [https://github.com/openedx/edx-enterprise/pull/2554](https://github.com/openedx/edx-enterprise/pull/2554)

- Course Home Progress Enterprise Name
  - [https://github.com/openedx/openedx-platform/pull/38108](https://github.com/openedx/openedx-platform/pull/38108)
  - [https://github.com/openedx/edx-enterprise/pull/2555](https://github.com/openedx/edx-enterprise/pull/2555)

- Course Modes Enterprise Customer
  - [https://github.com/openedx/openedx-filters/pull/338](https://github.com/openedx/openedx-filters/pull/338)
  - [https://github.com/openedx/openedx-platform/pull/38109](https://github.com/openedx/openedx-platform/pull/38109)
  - [https://github.com/openedx/edx-enterprise/pull/2556](https://github.com/openedx/edx-enterprise/pull/2556)

- Support Views Enterprise Context
  - [https://github.com/openedx/openedx-filters/pull/339](https://github.com/openedx/openedx-filters/pull/339)
  - [https://github.com/openedx/openedx-platform/pull/38110](https://github.com/openedx/openedx-platform/pull/38110)
  - [https://github.com/openedx/edx-enterprise/pull/2557](https://github.com/openedx/edx-enterprise/pull/2557)

Some of them are good to go, but most need additional work. While the CI are failing, checks **do** pass locally where my virtualenvs are wired correctly to install as editable (`pip install -e`) the libs they depend on. There are other issues, e.g.:

- Sometimes claude decided to run isort against files which should have been excluded from isort,
- pluggable\_overrides were never actually wired up in plugin\_settings,
- libraries all still need version bumps,
- etc.

Feel free to take a look and put in some reviews! In the meantime, we’ll spend the next ~month chipping away at all the tickets to carry these over the line.

---

<div class="post-metadata">

**Author:** ![e0d](https://sea2.discourse-cdn.com/flex020/user_avatar/discuss.openedx.org/e0d/32/199_2.png) [@e0d](https://discuss.openedx.org/u/e0d)\
**Post date:** [March 6, 2026, 2:44am UTC](https://discuss.openedx.org/t/rfc-pluginifying-edx-enterprise-looking-for-community-interest-collaborators/18316/11 "2026-03-06T02:44:03Z")

</div>

Have you given any thought to the best approach for releasing these changes? Top of mind as we have a code cut in 5 weeks.

---

<div class="post-metadata">

**Author:** ![tsankey](https://sea2.discourse-cdn.com/flex020/user_avatar/discuss.openedx.org/tsankey/32/9289_2.png) [@tsankey](https://discuss.openedx.org/u/tsankey)\
**Post date:** [March 6, 2026, 4:16pm UTC](https://discuss.openedx.org/t/rfc-pluginifying-edx-enterprise-looking-for-community-interest-collaborators/18316/12 "2026-03-06T16:16:55Z")

</div>

Well, we’ve already started merging—starting with user retirement:

- [https://github.com/openedx/openedx-platform/pull/38078](https://github.com/openedx/openedx-platform/pull/38078)
- [https://github.com/openedx/edx-enterprise/pull/2559](https://github.com/openedx/edx-enterprise/pull/2559)
- [https://github.com/openedx/openedx-platform/pull/38117](https://github.com/openedx/openedx-platform/pull/38117)

The goal is to leverage the specific 1-month approval for capacity to get as much in as possible, starting last week. Each grouping of PRs are designed to be mergeable and deployable in isolation. It’s inevitable that we cut a release with half of these merged in.

---

<div class="post-metadata">

**Author:** ![tsankey](https://sea2.discourse-cdn.com/flex020/user_avatar/discuss.openedx.org/tsankey/32/9289_2.png) [@tsankey](https://discuss.openedx.org/u/tsankey)\
**Post date:** [March 6, 2026, 4:22pm UTC](https://discuss.openedx.org/t/rfc-pluginifying-edx-enterprise-looking-for-community-interest-collaborators/18316/13 "2026-03-06T16:22:11Z")

</div>

If that’s not okay, then I guess we could just merge to our local edx/edx-platform fork, then do a big bang backport upstream before we trash our release-ulmo branch, but it starts to get confusing.

Here’s what I mean by “trashing” our release-ulmo branch:

 ![edx-platform soft-fork(5)(2)](https://us1.discourse-cdn.com/flex020/uploads/openedx/original/2X/6/60ffc13cfee8df8758618b18a028a6a2d9593cf8.png)

---

<div class="post-metadata">

**Author:** ![kmiller1](https://sea2.discourse-cdn.com/flex020/user_avatar/discuss.openedx.org/kmiller1/32/9594_2.png) [@kmiller1](https://discuss.openedx.org/u/kmiller1)\
**Post date:** [April 30, 2026, 8:29pm UTC](https://discuss.openedx.org/t/rfc-pluginifying-edx-enterprise-looking-for-community-interest-collaborators/18316/14 "2026-04-30T20:29:03Z")

</div>

In order to continue developing in the openedx-filters repo, I have made a Rights Expansion post for myself [Core Contributor Rights Expansion: Kira Miller](https://discuss.openedx.org/t/core-contributor-rights-expansion-kira-miller/18881) .

---

<div class="post-metadata">

**Author:** ![tsankey](https://sea2.discourse-cdn.com/flex020/user_avatar/discuss.openedx.org/tsankey/32/9289_2.png) [@tsankey](https://discuss.openedx.org/u/tsankey)\
**Post date:** [April 30, 2026, 8:40pm UTC](https://discuss.openedx.org/t/rfc-pluginifying-edx-enterprise-looking-for-community-interest-collaborators/18316/15 "2026-04-30T20:40:49Z")

</div>

I too have made a Rights Expansion post for myself: [Core Contributor Rights Expansion: Troy Sankey](https://discuss.openedx.org/t/core-contributor-rights-exapansion-troy-sankey/18882) .

---

<div class="post-metadata">

**Author:** ![tsankey](https://sea2.discourse-cdn.com/flex020/user_avatar/discuss.openedx.org/tsankey/32/9289_2.png) [@tsankey](https://discuss.openedx.org/u/tsankey)\
**Post date:** [August 26, 2026, 11:26pm UTC](https://discuss.openedx.org/t/rfc-pluginifying-edx-enterprise-looking-for-community-interest-collaborators/18316/16 "2026-08-26T23:26:42Z")

</div>

I just wanted to give a status update on this project as light is appearing at the end of the tunnel.

73 of 83 total estimated PRs merged, or **88% complete** by this metric.

| JIRA | Description | PRs Merged | State |
| --- | --- | --- | --- |
| ENT-11563 | Grades Analytics Event Enrichment | 4/4 | ✅ Done |
| ENT-11510 | User Account Readonly Fields | 4/4 | ✅ Done |
| ENT-11564 | Discount Enterprise Learner Exclusion | 4/4 | ✅ Done |
| ENT-11473 | User Retirement Enterprise Cleanup | 4/4 | ✅ Done |
| ENT-11565 | Ent Username Change Command | 2/2 | ✅ Done |
| ENT-11544 | DSC Courseware View Redirects | 8/8 | ✅ Done |
| ENT-11566 | Third Party Auth Enterprise Pipeline | 5/5 | ✅ Done |
| ENT-11567 | SAML Admin Enterprise Views | 4/4 | ✅ Done |
| ENT-11568 | Logistration Enterprise Context | 5/5 | ✅ Done |
| ENT-11569 | Student Dashboard Enterprise Context | 5/5 | ✅ Done |
| ENT-11570 | Enrollment API Enterprise Support | 4/4 | ✅ Done |
| ENT-11571 | Learner Home Enterprise Dashboard | 3/3 | ✅ Done |
| ENT-11572 | Course Home Progress Ent Name | 3/3 | ✅ Done |
| ENT-11573 | Course Modes Enterprise Customer | 4/4 | ✅ Done |
| ENT-11575 | Programs API Enterprise Enrollments | 3/3 | ✅ Done |
| ENT-11663 | Plugin Registration Prep | 7/7 | ✅ Done |
| ENT-11830 | Migrate Filter Injection | 4/4 | ✅ Done |
| ENT-11574 | Support Views Enterprise Context | 0/4 | ⬜ TODO |
| ENT-11576 | Enterprise Support To Edx Enterprise | 0/3 | ⬜ TODO |
| ENT-11577 | Migrate Enterprise Settings | 0/3 | ⬜ TODO |

I’m approved (for now) to take this over the line despite losing all my dedicated engineers, so this last stretch might be a long tail.

Of course, the end goal is to remove `edx-enterprise` from the list of dependencies in openedx-platform, but that cannot happen until the very last PR is merged.
