Customization Overview
Marketlum is designed to be customized without forking. Your project owns two thin shells — apps/api and apps/web — that consume @marketlum/core, @marketlum/ui, and @marketlum/shared as npm dependencies. Customization happens in the shells; upstream packages stay upgradable.
What you can safely customize
| Area | Where | Page |
|---|---|---|
| Logo, app name, theme colors, fonts | apps/web | Branding |
| Languages and translated strings | apps/web/src/i18n, apps/web/messages | Translations & Locales |
| Database, JWT, file storage, ports | .env | Environment & Configuration |
| Initial data | apps/api/src/cli.module.ts | Seed Data |
| New endpoints, jobs, integrations | apps/api/src/app.module.ts | Extending the API |
| React to CRUD on core entities | apps/api providers with @OnEvent | Domain Events |
| New pages, custom layouts, middleware | apps/web/src/app | Extending the Web App |
| Domain model (without code) | Admin UI: Taxonomies, Archetypes | Taxonomies & Archetypes |
What requires forking
Anything that changes the shape of @marketlum/core entities, the contract of @marketlum/shared Zod schemas, or the internals of @marketlum/ui pages is not customization — it is a fork. If you find yourself wanting to:
- Rename or add columns to a core entity
- Change the meaning of a built-in admin page
- Modify a core service's business rules
…open an issue first. Many of these needs can be met by adding a new module alongside core rather than editing core.
A guiding principle
Treat apps/api and apps/web as your code. Treat node_modules/@marketlum/* as someone else's code. If a customization can be done in the former, do it there. If it cannot, the upstream package is probably missing an extension point — that is a framework gap worth reporting.