Your first module renders here.
``` Field by field: - **`createRoutes`** returns a vue-router `RouteRecordRaw` (or an array of them). The runtime mounts it via `router.addRoute()`. `createRoutes` is **optional** — headless modules (stores, commands, zones only, no routes) simply omit it. Use `component: () => import("./Page.vue")` for lazy, code-split routes. - **`navigation`** is an array of nav items the `Pick a module from the sidebar.
``` With a standard `index.html` + `vite.config.ts` (using `@vitejs/plugin-vue`), `pnpm install && pnpm --filter @myorg/shell dev` boots the app. The sidebar shows **Dashboard**, and navigating to it renders the module's page inside the shell chrome — with **no edits to the shell** for that module. ## 5. Add a second module This is the payoff. Copy the `dashboard` module to `modules/billing`, change its `id`, `path`, and nav item: ```ts // modules/billing/src/index.ts import { defineModule } from "@modular-vue/core"; import type { RouteRecordRaw } from "vue-router"; import type { AppDependencies, AppSlots } from "@myorg/app-shared"; import BillingPage from "./BillingPage.vue"; export default defineModule