Skip to content

docs: OEP-65 reframe around build-time shell architecture#808

Open
arbrandes wants to merge 1 commit into
openedx:masterfrom
arbrandes:arbrandes/oep-65-refactor
Open

docs: OEP-65 reframe around build-time shell architecture#808
arbrandes wants to merge 1 commit into
openedx:masterfrom
arbrandes:arbrandes/oep-65-refactor

Conversation

@arbrandes

Copy link
Copy Markdown
Contributor

Description

This reframes OEP-65 to match what the frontend-base reference implementation actually does. The original OEP proposed runtime module loading via webpack module federation, but the implementation dropped both in favor of composing frontends into a single build. The OEP, its glossary, and its ADRs described an architecture that no longer exists.

The proposal now centers on build-time composability and shared dependencies, achieved by composing apps into one or more sites via a shared shell. The glossary and ADRs are updated to the new vocabulary, and ADR-0003 is renamed from "Frontend Projects" to "Frontend Sites". A longstanding misspelling of the OEP's "Composability" label is also fixed.

LLM usage notice

Built with assistance from Claude.

@arbrandes arbrandes linked an issue Jul 14, 2026 that may be closed by this pull request
@arbrandes
arbrandes force-pushed the arbrandes/oep-65-refactor branch 5 times, most recently from a8a69df to 24e17f3 Compare July 14, 2026 13:17
The library will provide base ESLint, Jest, TypeScript, and Webpack configurations. ESLint, Jest, and TypeScript will be similar to what ``frontend-build`` provides.

The webpack configurations will support a variety of build targets for the new module architecture, as well as application MFE configurations to enable us to migrate to the new unified platform library in a backwards compatible way. The new build targets include:
The webpack configurations will support a variety of build targets for the new :term:`Shell Architecture`, as well as application MFE configurations to enable us to migrate to the new unified platform library in a backwards compatible way. The new build targets include:

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is MFE a deprecated term? If so, I'd be careful how it gets used in this doc. I'm not sure if this should read "... application configurations (was MFE configurations) ...", or just "... application configurations ...", or something else. But I would not continue to sprinkle the term "MFE" around if you wish to replace it.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agreed, totally. This instance should definitely read "application configurations". Thanks!

@brian-smith-tcril brian-smith-tcril left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Overall this reframe looks great! Couple things that feel odd to me I left comments about.

Comment thread oeps/architectural-decisions/oep-0065/decisions/0001-unified-platform-library.rst Outdated
Comment thread oeps/architectural-decisions/oep-0065/decisions/0001-unified-platform-library.rst Outdated
Comment thread oeps/architectural-decisions/oep-0065/decisions/0001-unified-platform-library.rst Outdated
Comment thread oeps/architectural-decisions/oep-0065/decisions/0001-unified-platform-library.rst Outdated
Comment thread oeps/architectural-decisions/oep-0065/decisions/0001-unified-platform-library.rst Outdated
Comment thread oeps/architectural-decisions/oep-0065/decisions/frontend-glossary.rst Outdated
Comment thread oeps/architectural-decisions/oep-0065/decisions/frontend-glossary.rst Outdated
Comment thread oeps/architectural-decisions/oep-0065-arch-frontend-composability.rst Outdated
Comment thread oeps/architectural-decisions/oep-0065-arch-frontend-composability.rst Outdated

Proposed MFE Architecture
=========================
The reference implementation of this architecture is `frontend-base <https://github.com/openedx/frontend-base>`_, which provides the :term:`shell` and replaces `frontend-build <frontend-build_>`_, `frontend-platform <frontend-platform_>`_, `frontend-plugin-framework <frontend-plugin-framework_>`_, `frontend-component-header <frontend-component-header_>`_, and `frontend-component-footer <frontend-component-footer_>`_.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reference implementation doesn't feel like it makes sense as this section title anymore

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think it's fine. Can't think of a better term for a concrete piece of code that implements a proposed architecture.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think I'm OK with it too. The thing that gave me pause about it is that reference implementation doesn't automatically imply "prod ready."

frontend-base is our official, published (to npm), production ready implementation. "Reference" doesn't quite hit those notes for me.

@arbrandes
arbrandes force-pushed the arbrandes/oep-65-refactor branch 3 times, most recently from 83e8bae to 1ee72e3 Compare July 15, 2026 19:46
Reframe OEP-65 to match the frontend-base reference implementation:
build-time composition of apps into sites via a shared shell, replacing
the dropped runtime module federation approach. Rework the glossary and
ADRs to the new vocabulary (App, App Repository, Site, Shell, Shell
Architecture, Slot, Widget), rename ADR-0003 to "Frontend Sites", remove
the obsolete federation diagrams, and fix the "Composability" label typo.

Co-Authored-By: Claude <noreply@anthropic.com>
@arbrandes
arbrandes force-pushed the arbrandes/oep-65-refactor branch from 1ee72e3 to 46bf1e8 Compare July 15, 2026 19:49

@brian-smith-tcril brian-smith-tcril left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

2 tiny comments but this looks great!


* **The shell takes over the foundations.** Apps no longer initialize ``frontend-platform`` or render their own header and footer; the :term:`Shell` provides application initialization, layout, branding, and services. Apps drop the foundational libraries this replaces - ``frontend-build``, ``frontend-platform``, ``frontend-plugin-framework``, ``frontend-component-header``, ``frontend-component-footer``, and ``@edx/brand`` - in favor of ``frontend-base``.
* **Shared dependencies become peer dependencies.** The dependencies the shell provides - React, Paragon, React Router, Redux, and so on - become peer dependencies of the App Repository rather than direct ones, so that a :term:`Site` resolves them to a single shared version at build time.
* **Configuration moves to the Site.** App Repositories no longer carry environment-specific ``.env`` or ``env.config`` files; configuration lives in a :term:`Site Config` (see :ref:`Frontend Sites`). A repository may keep a git-ignored config file for local development.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I like the reframing! The one part that still specifically feels odd to me is the mention of

A repository may keep a git-ignored config file for local development.

even more specifically, the gitignored part.

Since we do keep site.config.dev.tsx files checked in for local development in the frontend-base branches of frontend app repos, it feels odd to mention gitignoring it.


Proposed MFE Architecture
=========================
The reference implementation of this architecture is `frontend-base <https://github.com/openedx/frontend-base>`_, which provides the :term:`shell` and replaces `frontend-build <frontend-build_>`_, `frontend-platform <frontend-platform_>`_, `frontend-plugin-framework <frontend-plugin-framework_>`_, `frontend-component-header <frontend-component-header_>`_, and `frontend-component-footer <frontend-component-footer_>`_.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think I'm OK with it too. The thing that gave me pause about it is that reference implementation doesn't automatically imply "prod ready."

frontend-base is our official, published (to npm), production ready implementation. "Reference" doesn't quite hit those notes for me.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Refactor OEP-65

3 participants