# Tutor mfe build hangs

**URL:** <https://discuss.openedx.org/t/tutor-mfe-build-hangs/18376>\
**Category:** Tutor Help\
**Created:** [February 3, 2026, 7:51pm UTC](https://discuss.openedx.org/t/tutor-mfe-build-hangs/18376 "2026-02-03T19:51:15Z")\
**Posts on this page:** 13\
**Page:** 1

<div class="post-metadata">

**Author:** ![Chris\_Beach](https://sea2.discourse-cdn.com/flex020/user_avatar/discuss.openedx.org/chris_beach/32/8861_2.png) [@Chris\_Beach](https://discuss.openedx.org/u/Chris_Beach)\
**Post date:** [February 3, 2026, 7:51pm UTC](https://discuss.openedx.org/t/tutor-mfe-build-hangs/18376/1 "2026-02-03T19:51:15Z")

</div>

Hello folks!

I’m trying to build the mfe plugin via tutor on my local Mac Silicon laptop, and it appears to hang on `[profile-prod 1/1] RUN npm run build` . I’ve searched the forums and slack for insight on how to let the build proceed, but haven’t found anything yet that matches my issue. There are options to locally run the MFE outside of tutor, which I’m open to, but would like to understand why the tutor mfe flow is not working.

Any ideas on what might be the issue?

Essentially ran basic setup steps:

```auto
python -m venv env
source env/bin/activate
git clone https://github.com/openedx/edx-platform
git clone https://github.com/overhangio/tutor
cd tutor
git checkout main
pip install -e .

```

Set Docker Desktop to use 16GB of RAM, 10 CPUs, and 50 GB of disk space, and essentially ran:

```auto
cd ../
export DOCKER_DEFAULT_PLATFORM=linux/amd64
tutor mounts add ./openedx-platform
tutor images build openedx-dev --no-cache --no-registry-cache
git clone https://github.com:overhangio/tutor-mfe
pip install -e ./tutor-mfe
tutor plugins enable mfe
tutor config save
tutor dev launch <---- this hangs (doesn’t complete the mfe build and doesn’t provide output besides [authoring-prod 1/1] RUN npm run build)

```

so I upped my Docker Desktop to use 28GB of RAM and 256 of disk space, and added:

```auto
export TUTOR_ROOT=/Users/…/tools/tutor

```

and then ran:

```auto
tutor images build mfe 
–no-cache 
–no-registry-cache 
–docker-arg=“–progress=plain” 
2>&1 | tee mfe-build.lo

```

and it’s been sitting on this output for the last hour:

```auto
#121 6.276 Translations pulled successfully!
#121 6.289 ./node_modules/.bin/intl-imports.js frontend-platform paragon frontend-component-header frontend-component-footer frontend-app-profile
#121 DONE 7.7s

#115 [account-prod 1/1] RUN npm run build
#115 …
#122 [profile-common 6/6] COPY env.config.jsx /openedx/app#122 DONE 0.1s

#123 [profile-prod 1/1] RUN npm run build#123 1.969#123 1.969 > @edx/frontend-app-profile@1.0.0-semantically-released build#123 1.969 > fedx-scripts webpack#123 1.969#123 3.594 Running with resolved config:#123 3.594 /openedx/app/node_modules/@openedx/frontend-build/config/webpack.prod.config.js#123 3.594

```

Docker Desktop is reporting used resources as: RAM 24.52 GB, CPU 100.00%, Disk 67.28 GB.

I tried giving docker another CPU (for 11 total, I have 12 available), and the build still pegs the CPU and sits at the `profile-prod` build step.

---

<div class="post-metadata">

**Author:** ![joel.edwards](https://sea2.discourse-cdn.com/flex020/user_avatar/discuss.openedx.org/joel.edwards/32/3193_2.png) [@joel.edwards](https://discuss.openedx.org/u/joel.edwards)\
**Post date:** [February 4, 2026, 6:22am UTC](https://discuss.openedx.org/t/tutor-mfe-build-hangs/18376/2 "2026-02-04T06:22:13Z")

</div>

Hi @Chris_Beach  
I suspect that the issue might be related to how many processes spawn due to the number of cores in your setup, which might be eating up too much RAM and slowing down disk I/O. As far as I know it by default tries to run a parallel task for each core in your system.

Have a look at [Resource limiting - Max parallelism](https://docs.docker.com/build/buildkit/configure/#max-parallelism) in the Docker documentation

On my instance in particular I have 4x CPU and 18GB RAM, but I often found that the build would start fine initially but slow down severely with the RAM fully used and paging to the swapfile. So after limiting to 3 parallel tasks my memory usage improved to the point I didn’t have to worry about it paging to swap, takes slightly longer overall to complete all the builds as there’s less running at the same time, but it did make the process more stable, for me anyway…

Hope this helps 🙂

---

<div class="post-metadata">

**Author:** ![Chris\_Beach](https://sea2.discourse-cdn.com/flex020/user_avatar/discuss.openedx.org/chris_beach/32/8861_2.png) [@Chris\_Beach](https://discuss.openedx.org/u/Chris_Beach)\
**Post date:** [February 4, 2026, 3:59pm UTC](https://discuss.openedx.org/t/tutor-mfe-build-hangs/18376/3 "2026-02-04T15:59:02Z")

</div>

Thanks for the advice @joel.edwards !

I’m retrying the `tutor dev launch` with a couple CPUs and we’ll see how it goes.

When you do a tutor build with just 3 parallel tasks, does that force the build to run a max of 3 `npm run build`commands concurrently? I’m seeing the following in my tutor build run and am curious if I didn’t limit the CPUs correctly.

```auto
[+] Building 5279.7s (113/135) docker:desktop-linux
 => [ora-grading-prod 1/1] RUN npm run build 5270.0s
 => => # Running with resolved config:                                                                           
 => => # /openedx/app/webpack.prod.config.js                                                                     
 => => # Browserslist: browsers data (caniuse-lite) is 10 months old. Please run:                                
 => => # npx update-browserslist-db@latest                                                                     
 => => # Why you should do it regularly: https://github.com/browserslist/update-db#readme                      
 => [discussions-prod 1/1] RUN npm run build 5268.3s
 => [communications-prod 1/1] RUN npm run build 5267.4s
 => [learning-prod 1/1] RUN npm run build 5265.9s
 => [authoring-prod 1/1] RUN npm run build 5265.9s
 => [learner-dashboard-common 4/6] COPY --from=learner-dashboard-src / /openedx/app 0.1s
 => [learner-dashboard-common 5/6] RUN make OPENEDX_ATLAS_PULL=true ATLAS_OPTIONS="--repository=openedx/op 10.1s
 => [gradebook-common 4/6] COPY --from=gradebook-src / /openedx/app 0.1s
 => [gradebook-common 5/6] RUN make OPENEDX_ATLAS_PULL=true ATLAS_OPTIONS="--repository=openedx/openedx-tra 9.7s
 => [learner-dashboard-common 6/6] COPY env.config.jsx /openedx/app 0.1s
 => [learner-dashboard-prod 1/1] RUN npm run build 5075.6s
 => [gradebook-common 6/6] COPY env.config.jsx /openedx/app 0.0s
 => [gradebook-prod 1/1] RUN npm run build 5071.6s
 => [admin-console-common 4/6] COPY --from=admin-console-src / /openedx/app 0.1s
 => [admin-console-common 5/6] RUN make OPENEDX_ATLAS_PULL=true ATLAS_OPTIONS="--repository=openedx/opened 11.2s
 => [admin-console-common 6/6] COPY env.config.jsx /openedx/app 0.0s
 => [admin-console-prod 1/1] RUN npm run build 5036.1s
 => [profile-common 4/6] COPY --from=profile-src / /openedx/app 0.1s
 => [profile-common 5/6] RUN make OPENEDX_ATLAS_PULL=true ATLAS_OPTIONS="--repository=openedx/openedx-tran 10.8s
 => [profile-common 6/6] COPY env.config.jsx /openedx/app 0.0s 
 => [profile-prod 1/1] RUN npm run build 4745.4s 

```

Note, the in progress / completed status doesn’t show nicely in the code block - please see the screenshot below for each task’s status.

 ![image](https://us1.discourse-cdn.com/flex020/uploads/openedx/original/2X/5/5ca9d8baab746034f72a6f61f8cb320530678000.png)

---

<div class="post-metadata">

**Author:** ![sarina](https://sea2.discourse-cdn.com/flex020/user_avatar/discuss.openedx.org/sarina/32/2308_2.png) [@sarina](https://discuss.openedx.org/u/sarina)\
**Post date:** [February 4, 2026, 4:36pm UTC](https://discuss.openedx.org/t/tutor-mfe-build-hangs/18376/4 "2026-02-04T16:36:21Z")

</div>

@Chris_Beach I updated your trust level so you can post images 🙂

---

<div class="post-metadata">

**Author:** ![Chris\_Beach](https://sea2.discourse-cdn.com/flex020/user_avatar/discuss.openedx.org/chris_beach/32/8861_2.png) [@Chris\_Beach](https://discuss.openedx.org/u/Chris_Beach)\
**Post date:** [February 4, 2026, 4:49pm UTC](https://discuss.openedx.org/t/tutor-mfe-build-hangs/18376/5 "2026-02-04T16:49:06Z")

</div>

Thank you @sarina ! I’ve updated my reply above with the screenshot of tutor build.

---

<div class="post-metadata">

**Author:** ![sarina](https://sea2.discourse-cdn.com/flex020/user_avatar/discuss.openedx.org/sarina/32/2308_2.png) [@sarina](https://discuss.openedx.org/u/sarina)\
**Post date:** [February 4, 2026, 5:04pm UTC](https://discuss.openedx.org/t/tutor-mfe-build-hangs/18376/6 "2026-02-04T17:04:22Z")

</div>

@Chris_Beach I actually will say, you should _always_ paste output in a code block. Images are not searchable and we can’t copy bits out of it. Could you revert to using a code block?

---

<div class="post-metadata">

**Author:** ![Chris\_Beach](https://sea2.discourse-cdn.com/flex020/user_avatar/discuss.openedx.org/chris_beach/32/8861_2.png) [@Chris\_Beach](https://discuss.openedx.org/u/Chris_Beach)\
**Post date:** [February 4, 2026, 5:30pm UTC](https://discuss.openedx.org/t/tutor-mfe-build-hangs/18376/7 "2026-02-04T17:30:38Z")

</div>

Sounds good @sarina . I adjusted my reply above.

---

<div class="post-metadata">

**Author:** ![joel.edwards](https://sea2.discourse-cdn.com/flex020/user_avatar/discuss.openedx.org/joel.edwards/32/3193_2.png) [@joel.edwards](https://discuss.openedx.org/u/joel.edwards)\
**Post date:** [February 5, 2026, 2:45pm UTC](https://discuss.openedx.org/t/tutor-mfe-build-hangs/18376/8 "2026-02-05T14:45:36Z")

</div>

From what I can see in your screenshot, it looks like there are 9 parallel tasks running and its taking 2+ hours to run, this is definitely not ideal. Most of my builds take between 10-30mins depending on what is/isn’t cached already, but don’t think I’ve had it take more than an hour at most for everything uncached (although your connectivity/internet speed may be a factor too, assuming that’s on the slower end)

This is how I did the Max-Parallelism config on my system:  
create file `~/.docker/buildkitd3.toml` with content:

```auto
[worker.oci]
  max-parallelism = 3

```

run commands:  
`docker buildx create --name max3cpu --driver docker-container --use --config ~/.docker/buildkitd3.toml`  
`docker buildx inspect max3cpu --bootstrap`

if done correctly you should see `max3cpu` in the build process like this:

 ![image](https://us1.discourse-cdn.com/flex020/uploads/openedx/original/2X/0/07da80fdd8ef596f3f630adbcb64eaf795576442.png)

At the least that’s how I achieved this, hope it helps 🙂

---

<div class="post-metadata">

**Author:** ![Chris\_Beach](https://sea2.discourse-cdn.com/flex020/user_avatar/discuss.openedx.org/chris_beach/32/8861_2.png) [@Chris\_Beach](https://discuss.openedx.org/u/Chris_Beach)\
**Post date:** [February 6, 2026, 7:09pm UTC](https://discuss.openedx.org/t/tutor-mfe-build-hangs/18376/9 "2026-02-06T19:09:07Z")

</div>

@joel.edwards After following your instructions, I was able to confirm the max parallelism was indeed lowered on my tutor build (thank you).

However, it still just sits on those `npm run build` mfe tasks for hours, without any apparent progress.

---

<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:** [February 10, 2026, 9:25pm UTC](https://discuss.openedx.org/t/tutor-mfe-build-hangs/18376/10 "2026-02-10T21:25:52Z")

</div>

FWIW, I switched over to [Orbstack](https://orbstack.dev/) a long time ago on my Mac, and it’s been much better for resource consumption.

---

<div class="post-metadata">

**Author:** ![kmccormick](https://sea2.discourse-cdn.com/flex020/user_avatar/discuss.openedx.org/kmccormick/32/8982_2.png) [@kmccormick](https://discuss.openedx.org/u/kmccormick)\
**Post date:** [February 10, 2026, 9:44pm UTC](https://discuss.openedx.org/t/tutor-mfe-build-hangs/18376/11 "2026-02-10T21:44:06Z")

</div>

The `mfe` image build is unfortunately very long, but it should not take hours.

+1 to Dave’s advice to use Orbstack for development macOS.

Another approach you can try is disabling some of the less-important MFEs. Here’s a plugin I install which limits the MFE build to just the 3 that I regularly need (authentication, authoring, and learning):

```python
"""
fewer_mfes.py:
whittle down list of mfes to save build time
"""
from tutormfe.hooks import MFE_APPS

@MFE_APPS.add()
def _remove_extra_mfes(apps: dict) -> dict:
    return {
        **{
            app_name: app
            for app_name, app in apps.items()
            if app_name in [
                "learning",
                "authoring",
                "authn",
                # ... add more here if needed. E.g., "discussions", "account".
            ]
        },
    }

```

I paste this into a Python file at `"$(tutor plugins printroot)"/fewer_mfes.py` , and then enable it (`tutor plugins enable fewer_mfes`) and re-run `tutor images build mfe`.

The downside of this is that sometimes I’ll hit a 404 because I disabled an MFE, but then I just edit the plugin, save my config (`tutor config save`) and re-build the MFE image.

---

<div class="post-metadata">

**Author:** ![Chris\_Beach](https://sea2.discourse-cdn.com/flex020/user_avatar/discuss.openedx.org/chris_beach/32/8861_2.png) [@Chris\_Beach](https://discuss.openedx.org/u/Chris_Beach)\
**Post date:** [February 18, 2026, 6:51pm UTC](https://discuss.openedx.org/t/tutor-mfe-build-hangs/18376/12 "2026-02-18T18:51:55Z")

</div>

Thanks @kmccormick and @dave - the Orbstack approach is working much better and I was able to build the mfe image.

---

<div class="post-metadata">

**Author:** ![john\_curricume](https://sea2.discourse-cdn.com/flex020/user_avatar/discuss.openedx.org/john_curricume/32/5295_2.png) [@john\_curricume](https://discuss.openedx.org/u/john_curricume)\
**Post date:** [February 20, 2026, 2:38pm UTC](https://discuss.openedx.org/t/tutor-mfe-build-hangs/18376/13 "2026-02-20T14:38:23Z")

</div>

Adding my experience here. Tried to build the MFE container on a t3.large instance yesterday and it hung up the instance twice.

Today, upgraded to a t3.xlarge tried right off the bat. I got a different failure about an “npm timeout” (or something to that effect, I didn’t save the actual error). Seems like the machine was big enough this time to at least know when it was hung up.

So I made a few changes after that:

- set max3cpu
- added 8 GB swap memory

The build completed successfully after 20 minutes.
