react-monorepo features
Generated from templates/react-monorepo/template.json. The apps are features
too: app-auth and app-client are on by default; app-landing and
app-admin are opt-in.
| Feature | Default | What it adds |
|---|---|---|
uiUI kit (@scope/ui) | Always | shadcn-style Radix components, a Formik+Zod form helper, light/dark theming with a no-flash init script, and page-meta helpers. |
apiData layer (@scope/api) | Always | One shared RTK Query baseApi that every feature extends via injectEndpoints, a configured store, and an upload-aware base query. Endpoint names and tagTypes live in one global namespace — collisions are silent, so keep them unique. |
authAuth client (@scope/auth) | Always | better-auth browser client, session slice, route guards and login redirects, shared across every app via a cross-subdomain cookie. |
layoutsLayouts (@scope/layouts) | Always | App shell, auth layout, marketing layout, error boundary and the loading/empty/forbidden/not-found state screens. |
configShared config (@scope/config) | Always | Base tsconfigs, the shared Vite config factory, the ESLint base and the Tailwind theme. |
hooksShared hooks (@scope/hooks) | On | Files it owns (1)
|
typesGenerated API types (@scope/types) | On | OpenAPI-generated request/response types and Zod schemas, regenerated from the backend's /openapi-json. Files it owns (1)
|
telemetryBrowser monitoring → OpenObserve | On | The @acme/telemetry package: OpenObserve RUM and logs in every app — page views, errors (including the error boundary's), slow resources, user actions, the signed-in user id, and traceparent headers on API calls so frontend and backend traces link up. Session replay is off unless a project turns it on. Off at runtime until VITE_OPENOBSERVE_* are set. Files it owns (1)
|
app-authAuth app | On | Login, signup, forgot/reset password, email verification. The one app that owns the session; the others redirect here. Files it owns (1)
|
app-clientClient app | On | The authenticated product surface — app shell, protected routing, feature directories. Files it owns (1)
|
app-adminAdmin console | Opt-in | Internal console over the same data layer, gated to the admin and superuser roles in the UI. The API must enforce the role on every endpoint it calls. Files it owns (1)
|
app-landingMarketing site | Opt-in | Public marketing site: a home page, an SEO route table, and build-time robots.txt, sitemap.xml and security.txt. Files it owns (1)
|
realtimeSocket.IO client | Opt-in | socket.io-client wired to the backend's /realtime path, with room helpers and shared event-name constants. Pairs with the nest-api realtime feature. Files it owns (2)
|
pwaInstallable PWA (client app) | Opt-in | vite-plugin-pwa configured for the client app: app-shell offline caching, and registerType 'prompt' so a new build waits for the user instead of swapping assets under a running app. The update prompt and install button are yours to build with the plugin's useRegisterSW. |
chartsCharts (client app) | Opt-in | ApexCharts and react-apexcharts in the client app, with a theme-aware chart palette (the --chart-* tokens in the UI kit). No chart components ship. |
huskyGit hooks + lint-staged | On | Files it owns (1)
|
dockerDocker image | On | Multi-stage build producing a static bundle per app, served by the nginx config in docker/ (cache rules, SPA fallback, security headers). Files it owns (4)
|
ciForgejo Actions CI | On | Files it owns (1)
|
secretsInfisical secret sync | On | Files it owns (2)
|
- Dropping
app-authmeans another app must own/login: every guard and every 401 sends users toVITE_APP_AUTH_HOST/login. pwaandchartsconfigure the client app only.typesoff removes generated types; apps then type their API calls by hand.- The Dockerfile, CI matrix and
build.shfollow the app set: only the apps you generate are built.