Customization
Extend HotCRM with ObjectStack metadata, actions, flows, AI skills, and UI definitions.
Customization
This section is for developers and technical implementers extending HotCRM with code. If you are configuring users, profiles, flows, or sharing from the app, start with Administration.
What you can build
| Area | What it covers |
|---|---|
| Extending objects | Fields, objects, hooks, flows, validation, sharing |
| AI skills | Skills for the platform assistant, and the barrel that registers them |
| UI extensions | Pages, views, dashboards, actions |
| Testing and CI | Metadata validation and automated checks |
Current source layout
HotCRM builds one ObjectStack artifact that carries two packages (ADR-0130) — the type: app package in src/sales/ and the service module in src/service/ — and a directory under src/ is a package: src/revenue/ and src/marketing/ are registered by the app package until each is packaged on its own. Add or modify metadata under the package that owns the object, then export it from that package's matching barrel file. A file may import from its own directory or from src/sales/ — never sideways between modules.
src/
├── sales/ # the `type: app` package — customers, pipeline, activities, and everything app-level
├── service/ # module — cases and the knowledge base
├── revenue/ # module — products, quotes, line items, contracts
├── marketing/ # module — campaigns and campaign members
└── docs/ # package docs stating the business rules the flows implementInside a package, the metadata-type subdirectories it uses:
src/sales/
├── objects/ # *.object.ts schemas, and the *.hook.ts beside each one
├── actions/ # UI actions and executable action bodies
├── flows/ # automation
├── skills/ # AI skills
├── apps/
├── views/
├── pages/
├── dashboards/
├── reports/
├── datasets/ # dimensions and measures the dashboards and reports query
├── mappings/ # import column-to-field projections
├── profiles/
├── sharing/
├── translations/
├── data/ # seed data
└── interfaces/ # shared types (an empty barrel today)HotCRM authors skills, not agents: the two app-owned copilots and the directory that held them were retired, and AI capability now comes from the platform assistant every ObjectStack environment provides. Exporting a skill from src/*/skills/index.ts is the whole wiring step. See AI Skills.
File suffix protocol
| Suffix | What it defines |
|---|---|
*.object.ts | Data model |
*.hook.ts | Object lifecycle logic |
*.actions.ts | UI actions and executable actions |
*.flow.ts | Automation |
*.skill.ts | AI Copilot skill |
*.page.ts | UI page |
*.view.ts | List or kanban view |
*.dashboard.ts | Dashboard |
*.report.ts | Report |
*.sharing.ts | Sharing rule |
*.profile.ts | Permission profile |
Golden rules
- Use the
crm_prefix for HotCRM object names. - Use ObjectQL and ObjectStack APIs, not raw SQL.
- Keep metadata exported from the relevant
src/**/index.tsfile. - Update translations when adding user-visible labels.
- Run
pnpm verifybefore publishing.