ENTITY_NAME in a path is a placeholder for your generated entity directory, for example product for Product. EntityName denotes its code type. Replace these with actual project names; the Article examples below illustrate an entity rather than a required project module.
Architectural layers describe code purpose; ownership rules determine who changes a file. Domain, app and adapters can be updated by the generator even when their paths do not contain a generated folder.
The extension contract lives in generated code; your implementation lives in custom. The build connects them. You do not need to insert extensions into generated files and repeat those edits after every Generate.
Backend hooks and dependency composition
ENTITY_NAME/hooks.go implements Hooks: Before/After Create and Update, BeforeDelete, AfterList and AfterGetByID. Add validation, transformations and integrations at these use-case boundaries.
Connect project dependencies through custom/app/composition.go and generated/customcontracts/. Custom routes use custom/app/routes.go and RegisterRoutes. Custom code must also respect layer boundaries and enforce server-side authorization where required.
Frontend additions or complete replacement
Use a targeted extension for an individual cell, action, form control or wrapper. The rest of the form continues to follow the model. For an entirely custom page, configure PageOverride and maintain its full content and behavior yourself.
Starter custom files are created only when missing. Later Generate operations preserve them but do not adapt them to a new contract. Check extension compatibility after model changes: unchanged bytes do not guarantee that the code still works.
One project, parallel changes
For example, add Article.summary and a status filter in Generator UI while developing a custom article action and BeforeCreate/BeforeUpdate checks.
After Preview and Generate, the standard form receives the new field if you have not overridden it, and the backend receives an updated model. Custom files remain. Then apply required migrations, check extension compatibility with the new contract and update the application.