React + Webpack + Nx

Special thanks to Colum at Nx for his feedback on using Nx generators with Module Federation.

Generating a New Nx Workspace

Nx, a leading Monorepo and CI tool, offers an extensive array of generators that facilitate various development needs.

Terminal
npx create-nx-workspace@latest myorg

For those preferring Rspack, replace the command with the following:

Terminal
npx create-nx-workspace@latest myorg --preset=@nx/rspack

Selecting a Frontend Framework

At this stage, select 'None' for the frontend framework to keep the setup minimal.

Terminal
NX Let's create a new workspace [https://nx.dev/getting-started/intro] ? Which stack do you want to use? … None: Configures a TypeScript/JavaScript project with minimal structure. React: Configures a React application with your framework of choice. Vue: Configures a Vue application with your framework of choice. Angular: Configures a Angular application with modern tooling. Node: Configures a Node API application with your framework of choice.

Monorepo Type Configuration

We opt for the Integrated configuration as it allows us to house all remotes and the shell within a single repository:

Terminal
? Package-based monorepo, integrated monorepo, or standalone project? Package-based Monorepo: Nx makes it fast, but lets you run things your way. Integrated Monorepo: Nx creates a monorepo that contains multiple projects. Standalone: Nx creates a single project and makes it fast.

Nx Setup

While any Nx Cloud setup option is valid, "Skipping for Now" is chosen in our example, though activating Nx Cloud can significantly enhance local and CI build speeds:

Terminal
? Do you want Nx Cloud to make your CI fast? (it's free and can be disabled any time) Yes, enable Nx Cloud Yes, configure Nx Cloud for GitHub Actions Yes, configure Nx Cloud for Circle CI Skip for now

Post-Setup Steps

Change into the directory of the newly created workspace:

Terminal
cd myorg

Adding Framework / Library Support

At this stage, we will use Nx to integrate React support. While our example specifically uses React, you may choose to use a different framework according to your project needs:

Terminal
npx nx add @nx/react

Installing Zephyr

Install the zephyr-edge-contract and zephyr-webpack-plugin using npm with the following commands:

npm install zephyr-edge-contract@latest npm install zephyr-webpack-plugin@latest

Once installed, ensure these packages are listed in your package.json under dependencies:

package.json
"dependencies": { "zephyr-edge-contract": "^0.0.2", "zephyr-webpack-plugin": "^0.0.2" }

Generate Module Federation Shell and Remotes

Use Nx to structure your application with a host shell and remote apps:

Terminal
npx nx g @nx/react:host shell --remotes=remote1,remote2 --directory=apps/shell

For those using Rspack, append the command accordingly:

Terminal
npx nx g @nx/react:host shell --remotes=remote1,remote2 --directory=apps/shell --preset=@nx/rspack

Style Configuration

When prompted, choose your preferred stylesheet format. Options include CSS, SASS, LESS, and others:

Terminal
? Which stylesheet format would you like to use? CSS SASS(.scss) [ https://sass-lang.com ] LESS [ https://lesscss.org ] tailwind [ https://tailwindcss.com/ ] styled-components [ https://styled-components.com ] emotion [ https://emotion.sh ] styled-jsx [ https://www.npmjs.com/package/styled-jsx ] None

End-to-End Testing Setup

Select an E2E test runner, though for demo purposes, 'none' is selected:

Terminal
? Which E2E test runner would you like to use? cypress playwright none

Project Structure Confirmation

Select "As Provided" for project names, as no adjustments are necessary:

Terminal
? What should be the project name and where should it be generated? As provided: Name: shell Root: apps/shell Derived: Name: shell-shell Root: apps/shell/shell

Final Adjustments

To accommodate Zephyr Cloud support, we need to make certain modifications to the generated projects.

Adding Package JSON Files

Zephyr Cloud requires a package.json file in each application to resolve names. Create a package.json for each application, specifying a unique name for each:

myorg/apps/shell/package.json
{ "name": "shell" }
myorg/apps/remote1/package.json
{ "name": "remote1" }
myorg/apps/remote2/package.json
{ "name": "remote2" }

Updating Webpack Configuration

Update both the webpack.config.ts and webpack.config.prod.ts files for shell and webpack.config.ts for both remotes.

INFO

Rspackis also supported however this example uses Webpack

shell/webpack.config.ts
import { composePlugins, withNx, ModuleFederationConfig } from '@nx/webpack'; import { withReact } from '@nx/react'; import { withModuleFederation } from '@nx/react/module-federation'; import baseConfig from './module-federation.config'; import {withZephyr} from "zephyr-webpack-plugin"; const config: ModuleFederationConfig = { ...baseConfig, }; // Nx plugins for webpack to build config object from Nx options and context. export default composePlugins( withNx(), withReact(), withModuleFederation(config), withZephyr(), (config)=>{ return config; } );
shell/webpack.config.prod.ts
import { composePlugins, withNx } from '@nx/webpack'; import { withReact } from '@nx/react'; import { withModuleFederation } from '@nx/react/module-federation'; import { ModuleFederationConfig } from '@nx/webpack'; import baseConfig from './module-federation.config'; import {withZephyr} from "zephyr-webpack-plugin"; const prodConfig: ModuleFederationConfig = { ...baseConfig, /* * Remote overrides for production. * Each entry is a pair of a unique name and the URL where it is deployed. * * e.g. * remotes: [ * ['app1', 'http://app1.example.com'], * ['app2', 'http://app2.example.com'], * ] * * You can also use a full path to the remoteEntry.js file if desired. * * remotes: [ * ['app1', 'http://example.com/path/to/app1/remoteEntry.js'], * ['app2', 'http://example.com/path/to/app2/remoteEntry.js'], * ] */ remotes: [ ['remote1', 'http://localhost:4201/'], ['remote2', 'http://localhost:4202/'], ], }; // Nx plugins for webpack to build config object from Nx options and context. export default composePlugins( withNx(), withReact(), withModuleFederation(prodConfig), withZephyr(), (config)=>{ return config; } );
remote1/webpack.config.ts
import { composePlugins, withNx } from '@nx/webpack'; import { withReact } from '@nx/react'; import { withModuleFederation } from '@nx/react/module-federation'; import baseConfig from './module-federation.config'; import {withZephyr} from "zephyr-webpack-plugin"; const config = { ...baseConfig, }; // Nx plugins for webpack to build config object from Nx options and context. export default composePlugins( withNx(), withReact(), withModuleFederation(config), withZephyr(), (config)=>{ return config; } );
remote2/webpack.config.prod.ts
import { composePlugins, withNx } from '@nx/webpack'; import { withReact } from '@nx/react'; import { withModuleFederation } from '@nx/react/module-federation'; import baseConfig from './module-federation.config'; import {withZephyr} from "zephyr-webpack-plugin"; const config = { ...baseConfig, }; // Nx plugins for webpack to build config object from Nx options and context. export default composePlugins( withNx(), withReact(), withModuleFederation(config), withZephyr(), (config)=>{ return config; } );

Building the App

With all preparations complete, you can now build the applications and start utilizing Zephyr Cloud.

Building the Shell

To build the shell application, execute the following command, which uses watch mode for ongoing updates:

Terminal
npx nx build shell -- --watch
INFO

Ensure you have created package.json files in each project directory as outlined earlier. Failure to do so may result in errors like the ones below, indicating unresolved remote entry points:

[zephyr] Could not resolve 'remote1.zephyr-examples.zephyrcloudio' with version 'http://localhost:4201/remoteEntry.js' [zephyr] Could not resolve 'remote2.zephyr-examples.zephyrcloudio' with version 'http://localhost:4202/remoteEntry.js'

Shell Build Output

Terminal>
nx run shell:build:production --watch You are already logged in [shell.zephyr-examples.zephyrcloudio](valorkin)[3016]: local build started [shell.zephyr-examples.zephyrcloudio](valorkin)[3016]: started uploading of local snapshot to zephyr [shell.zephyr-examples.zephyrcloudio](valorkin)[3016]: uploaded local snapshot in 805ms [shell.zephyr-examples.zephyrcloudio](valorkin)[3016]: uploading missing assets to zephyr (queued 11 out of 14) [shell.zephyr-examples.zephyrcloudio](valorkin)[3016]: file main.93e9078aa7b6c830.js uploaded in 126ms (8.31kb) [shell.zephyr-examples.zephyrcloudio](valorkin)[3016]: file 913.026a13b340471b7f.js.LICENSE.txt uploaded in 139ms (0.66kb) [shell.zephyr-examples.zephyrcloudio](valorkin)[3016]: file 943.a0a6b971d9115018.js uploaded in 150ms (27.19kb) [shell.zephyr-examples.zephyrcloudio](valorkin)[3016]: file 41.b26ddec4260a2e36.js uploaded in 156ms (6.43kb) [shell.zephyr-examples.zephyrcloudio](valorkin)[3016]: file index.html uploaded in 150ms (0.48kb) [shell.zephyr-examples.zephyrcloudio](valorkin)[3016]: file 144.3652843fc7a12189.js.LICENSE.txt uploaded in 158ms (0.47kb) [shell.zephyr-examples.zephyrcloudio](valorkin)[3016]: file 41.b26ddec4260a2e36.js.LICENSE.txt uploaded in 160ms (0.23kb) [shell.zephyr-examples.zephyrcloudio](valorkin)[3016]: file styles.ecbc7c8fef0c436e.js uploaded in 169ms (5.84kb) [shell.zephyr-examples.zephyrcloudio](valorkin)[3016]: file 943.a0a6b971d9115018.js.LICENSE.txt uploaded in 174ms (0.24kb) [shell.zephyr-examples.zephyrcloudio](valorkin)[3016]: file 913.026a13b340471b7f.js uploaded in 217ms (63.79kb) [shell.zephyr-examples.zephyrcloudio](valorkin)[3016]: file 144.3652843fc7a12189.js uploaded in 222ms (129.66kb) [shell.zephyr-examples.zephyrcloudio](valorkin)[3016]: uploaded missing assets to zephyr (11 assets in 1821ms, 243.31kb) [shell.zephyr-examples.zephyrcloudio](valorkin)[3016]: started deploying local build to edge [shell.zephyr-examples.zephyrcloudio](valorkin)[3016]: deployed to https://valorkin_3016-shell-zephyr-examples-zephyrcloudio-ze.valorkin.dev [shell.zephyr-examples.zephyrcloudio](valorkin)[3016]: deployed to https://t_main_zack_zephyr-cloud_io-pe4ufnqhxd-shell-zephyr-e-80bb4d-ze.valorkin.dev [shell.zephyr-examples.zephyrcloudio](valorkin)[3016]: deployed to https://shell-zephyr-examples-zephyrcloudio-ze.valorkin.dev [shell.zephyr-examples.zephyrcloudio](valorkin)[3016]: local build deployed to edge in 188ms [shell.zephyr-examples.zephyrcloudio](valorkin)[3016]: build deployed in 1634ms Entrypoint main 8.31 KiB = main.93e9078aa7b6c830.js Entrypoint styles 5.92 KiB = styles.5f4524c1fa820eae.css 81 bytes styles.ecbc7c8fef0c436e.js 5.84 KiB chunk (runtime: main, styles) 41.b26ddec4260a2e36.js 6.94 KiB [rendered] chunk (runtime: main, styles) 144.3652843fc7a12189.js (id hint: vendors) 134 KiB [rendered] reused as split chunk (cache group: defaultVendors) chunk (runtime: main, styles) 42 bytes reused as split chunk (cache group: default) chunk (runtime: main) 6 bytes (remote) 6 bytes (share-init) chunk (runtime: main) 42 bytes chunk (runtime: main) 42 bytes chunk (runtime: main) main.93e9078aa7b6c830.js (main) 139 bytes (javascript) 126 bytes (share-init) 21.1 KiB (runtime) [entry] [rendered] chunk (runtime: main) 6 bytes (remote) 6 bytes (share-init) chunk (runtime: styles) styles.5f4524c1fa820eae.css, styles.ecbc7c8fef0c436e.js (styles) 50 bytes (javascript) 80 bytes (css/mini-extract) 126 bytes (share-init) 19 KiB (runtime) [entry] [rendered] chunk (runtime: main, styles) 913.026a13b340471b7f.js (id hint: vendors) 228 KiB [rendered] reused as split chunk (cache group: defaultVendors) chunk (runtime: main) 943.a0a6b971d9115018.js 37.4 KiB (javascript) 84 bytes (consume-shared) [rendered] webpack compiled successfully (533e09796edd0232) [shell.zephyr-examples.zephyrcloudio](valorkin)[3016]: local build finished in 3265ms
INFO

The build process generates a series of URLs for each deployment. For a comprehensive understanding of these build outputs, please consult our versioning documentation.

Terminal
[shell.zephyr-examples.zephyrcloudio](valorkin)[3016]: deployed to https://valorkin_3016-shell-zephyr-examples-zephyrcloudio-ze.valorkin.dev [shell.zephyr-examples.zephyrcloudio](valorkin)[3016]: deployed to https://t_main_zack_zephyr-cloud_io-pe4ufnqhxd-shell-zephyr-e-80bb4d-ze.valorkin.dev [shell.zephyr-examples.zephyrcloudio](valorkin)[3016]: deployed to https://shell-zephyr-examples-zephyrcloudio-ze.valorkin.dev

Remote 1 Build

Terminal
npx nx build remote1 --watch

Remote 1 Build Output

Terminal
> nx run remote1:build:production --watch You are already logged in [_create-nx-workspace-mf_source.zephyr-examples.zephyrcloudio](valorkin)[3015]: local build started [_create-nx-workspace-mf_source.zephyr-examples.zephyrcloudio](valorkin)[3015]: started uploading of local snapshot to zephyr [_create-nx-workspace-mf_source.zephyr-examples.zephyrcloudio](valorkin)[3015]: uploaded local snapshot in 589ms [_create-nx-workspace-mf_source.zephyr-examples.zephyrcloudio](valorkin)[3015]: uploading missing assets to zephyr (queued 12 out of 15) [_create-nx-workspace-mf_source.zephyr-examples.zephyrcloudio](valorkin)[3015]: file remoteEntry.js uploaded in 126ms (5.72kb) [_create-nx-workspace-mf_source.zephyr-examples.zephyrcloudio](valorkin)[3015]: file 41.9a449c58de22ab6b.js uploaded in 145ms (6.43kb) [_create-nx-workspace-mf_source.zephyr-examples.zephyrcloudio](valorkin)[3015]: file main.42dbf49433954a69.js uploaded in 138ms (5.45kb) [_create-nx-workspace-mf_source.zephyr-examples.zephyrcloudio](valorkin)[3015]: file 41.9a449c58de22ab6b.js.LICENSE.txt uploaded in 141ms (0.23kb) [_create-nx-workspace-mf_source.zephyr-examples.zephyrcloudio](valorkin)[3015]: file index.html uploaded in 147ms (0.49kb) [_create-nx-workspace-mf_source.zephyr-examples.zephyrcloudio](valorkin)[3015]: file 589.505424fc93ec3072.js uploaded in 154ms (0.14kb) [_create-nx-workspace-mf_source.zephyr-examples.zephyrcloudio](valorkin)[3015]: file 404.86591e41fe4977b8.js.LICENSE.txt uploaded in 155ms (0.24kb) [_create-nx-workspace-mf_source.zephyr-examples.zephyrcloudio](valorkin)[3015]: file 404.86591e41fe4977b8.js uploaded in 157ms (26.42kb) [_create-nx-workspace-mf_source.zephyr-examples.zephyrcloudio](valorkin)[3015]: file 144.e8b8368c4463d4f1.js.LICENSE.txt uploaded in 164ms (0.47kb) [_create-nx-workspace-mf_source.zephyr-examples.zephyrcloudio](valorkin)[3015]: file styles.2c6709042aaf4268.js uploaded in 167ms (4.92kb) [_create-nx-workspace-mf_source.zephyr-examples.zephyrcloudio](valorkin)[3015]: file 510.705b2055194c71b8.js uploaded in 192ms (0.30kb) [_create-nx-workspace-mf_source.zephyr-examples.zephyrcloudio](valorkin)[3015]: file 144.e8b8368c4463d4f1.js uploaded in 197ms (129.66kb) [_create-nx-workspace-mf_source.zephyr-examples.zephyrcloudio](valorkin)[3015]: uploaded missing assets to zephyr (12 assets in 1883ms, 180.47kb) [_create-nx-workspace-mf_source.zephyr-examples.zephyrcloudio](valorkin)[3015]: started deploying local build to edge [_create-nx-workspace-mf_source.zephyr-examples.zephyrcloudio](valorkin)[3015]: deployed to https://valorkin_3015-_create-nx-workspace-mf_source-zephyr-e-66be25-ze.valorkin.dev [_create-nx-workspace-mf_source.zephyr-examples.zephyrcloudio](valorkin)[3015]: deployed to https://t_main_zack_zephyr-cloud_io-pe4ufnqhxd-_create-nx-wor-b959ef-ze.valorkin.dev [_create-nx-workspace-mf_source.zephyr-examples.zephyrcloudio](valorkin)[3015]: deployed to https://_create-nx-workspace-mf_source-zephyr-examples-zephyr-262fe7-ze.valorkin.dev [_create-nx-workspace-mf_source.zephyr-examples.zephyrcloudio](valorkin)[3015]: local build deployed to edge in 169ms [_create-nx-workspace-mf_source.zephyr-examples.zephyrcloudio](valorkin)[3015]: build deployed in 1446ms Entrypoint main 5.45 KiB = main.42dbf49433954a69.js Entrypoint styles 5 KiB = styles.5f4524c1fa820eae.css 81 bytes styles.2c6709042aaf4268.js 4.92 KiB Entrypoint remote1 5.72 KiB = remoteEntry.js chunk (runtime: main, remote1, styles) 41.9a449c58de22ab6b.js 6.94 KiB [rendered] chunk (runtime: main, remote1, styles) 144.e8b8368c4463d4f1.js (id hint: vendors) 134 KiB [rendered] reused as split chunk (cache group: defaultVendors) chunk (runtime: main, remote1, styles) 42 bytes reused as split chunk (cache group: default) chunk (runtime: main, remote1) 404.86591e41fe4977b8.js 35.4 KiB [rendered] split chunk (cache group: default) chunk (runtime: main) 510.705b2055194c71b8.js 934 bytes (javascript) 42 bytes (consume-shared) [rendered] chunk (runtime: remote1) 589.505424fc93ec3072.js 36 bytes [rendered] chunk (runtime: remote1) remoteEntry.js (remote1) 42 bytes (javascript) 84 bytes (share-init) 17.3 KiB (runtime) [entry] [rendered] chunk (runtime: main) main.42dbf49433954a69.js (main) 22 bytes (javascript) 84 bytes (share-init) 17.7 KiB (runtime) [entry] [rendered] chunk (runtime: styles) styles.5f4524c1fa820eae.css, styles.2c6709042aaf4268.js (styles) 50 bytes (javascript) 80 bytes (css/mini-extract) 84 bytes (share-init) 16.7 KiB (runtime) [entry] [rendered] webpack compiled successfully (6bdf66978d6c6278) [_create-nx-workspace-mf_source.zephyr-examples.zephyrcloudio](valorkin)[3015]: local build finished in 3229ms

Remote 2 Build

Terminal
npx nx build remote2 -- --watch

Remote 2 Build Output

Terminal
> nx run remote2:build:production --watch You are already logged in [_create-nx-workspace-mf_source.zephyr-examples.zephyrcloudio](valorkin)[3017]: local build started [_create-nx-workspace-mf_source.zephyr-examples.zephyrcloudio](valorkin)[3017]: started uploading of local snapshot to zephyr [_create-nx-workspace-mf_source.zephyr-examples.zephyrcloudio](valorkin)[3017]: uploaded local snapshot in 612ms [_create-nx-workspace-mf_source.zephyr-examples.zephyrcloudio](valorkin)[3017]: uploading missing assets to zephyr (queued 12 out of 15) [_create-nx-workspace-mf_source.zephyr-examples.zephyrcloudio](valorkin)[3017]: file remoteEntry.js uploaded in 128ms (5.72kb) [_create-nx-workspace-mf_source.zephyr-examples.zephyrcloudio](valorkin)[3017]: file styles.1571ea7a783778ba.js uploaded in 128ms (4.92kb) [_create-nx-workspace-mf_source.zephyr-examples.zephyrcloudio](valorkin)[3017]: file 404.2971a24285c7bbe6.js.LICENSE.txt uploaded in 131ms (0.24kb) [_create-nx-workspace-mf_source.zephyr-examples.zephyrcloudio](valorkin)[3017]: file main.2e27878c29b4811c.js uploaded in 148ms (5.45kb) [_create-nx-workspace-mf_source.zephyr-examples.zephyrcloudio](valorkin)[3017]: file index.html uploaded in 154ms (0.49kb) [_create-nx-workspace-mf_source.zephyr-examples.zephyrcloudio](valorkin)[3017]: file 404.2971a24285c7bbe6.js uploaded in 163ms (26.42kb) [_create-nx-workspace-mf_source.zephyr-examples.zephyrcloudio](valorkin)[3017]: file 144.ca505f105bb1b446.js.LICENSE.txt uploaded in 165ms (0.47kb) [_create-nx-workspace-mf_source.zephyr-examples.zephyrcloudio](valorkin)[3017]: file 510.2a6e58595f33f0b5.js uploaded in 178ms (0.30kb) [_create-nx-workspace-mf_source.zephyr-examples.zephyrcloudio](valorkin)[3017]: file 41.641d6a5a1b771f6b.js uploaded in 188ms (6.43kb) [_create-nx-workspace-mf_source.zephyr-examples.zephyrcloudio](valorkin)[3017]: file 589.8fb6a268ace3b111.js uploaded in 190ms (0.14kb) [_create-nx-workspace-mf_source.zephyr-examples.zephyrcloudio](valorkin)[3017]: file 41.641d6a5a1b771f6b.js.LICENSE.txt uploaded in 221ms (0.23kb) [_create-nx-workspace-mf_source.zephyr-examples.zephyrcloudio](valorkin)[3017]: file 144.ca505f105bb1b446.js uploaded in 269ms (129.66kb) [_create-nx-workspace-mf_source.zephyr-examples.zephyrcloudio](valorkin)[3017]: uploaded missing assets to zephyr (12 assets in 2063ms, 180.47kb) [_create-nx-workspace-mf_source.zephyr-examples.zephyrcloudio](valorkin)[3017]: started deploying local build to edge [_create-nx-workspace-mf_source.zephyr-examples.zephyrcloudio](valorkin)[3017]: deployed to https://valorkin_3017-_create-nx-workspace-mf_source-zephyr-e-a00e91-ze.valorkin.dev [_create-nx-workspace-mf_source.zephyr-examples.zephyrcloudio](valorkin)[3017]: deployed to https://t_main_zack_zephyr-cloud_io-pe4ufnqhxd-_create-nx-wor-b959ef-ze.valorkin.dev [_create-nx-workspace-mf_source.zephyr-examples.zephyrcloudio](valorkin)[3017]: deployed to https://_create-nx-workspace-mf_source-zephyr-examples-zephyr-262fe7-ze.valorkin.dev [_create-nx-workspace-mf_source.zephyr-examples.zephyrcloudio](valorkin)[3017]: local build deployed to edge in 190ms [_create-nx-workspace-mf_source.zephyr-examples.zephyrcloudio](valorkin)[3017]: build deployed in 1531ms Entrypoint main 5.45 KiB = main.2e27878c29b4811c.js Entrypoint styles 5 KiB = styles.5f4524c1fa820eae.css 81 bytes styles.1571ea7a783778ba.js 4.92 KiB Entrypoint remote2 5.72 KiB = remoteEntry.js chunk (runtime: main, remote2, styles) 41.641d6a5a1b771f6b.js 6.94 KiB [rendered] chunk (runtime: main, remote2, styles) 144.ca505f105bb1b446.js (id hint: vendors) 134 KiB [rendered] reused as split chunk (cache group: defaultVendors) chunk (runtime: main, remote2, styles) 42 bytes reused as split chunk (cache group: default) chunk (runtime: remote2) remoteEntry.js (remote2) 42 bytes (javascript) 84 bytes (share-init) 17.3 KiB (runtime) [entry] [rendered] chunk (runtime: main, remote2) 404.2971a24285c7bbe6.js 35.4 KiB [rendered] split chunk (cache group: default) chunk (runtime: main) 510.2a6e58595f33f0b5.js 934 bytes (javascript) 42 bytes (consume-shared) [rendered] chunk (runtime: remote2) 589.8fb6a268ace3b111.js 36 bytes [rendered] chunk (runtime: main) main.2e27878c29b4811c.js (main) 22 bytes (javascript) 84 bytes (share-init) 17.7 KiB (runtime) [entry] [rendered] chunk (runtime: styles) styles.5f4524c1fa820eae.css, styles.1571ea7a783778ba.js (styles) 50 bytes (javascript) 80 bytes (css/mini-extract) 84 bytes (share-init) 16.7 KiB (runtime) [entry] [rendered] webpack compiled successfully (ba7bd784fa780a37) [_create-nx-workspace-mf_source.zephyr-examples.zephyrcloudio](valorkin)[3017]: local build finished in 3363ms

Next Steps

Now that the initial setup is complete, you can proceed to add remote modules and start developing your federated application as planned.