Customization

For developers — extend HotCRM with custom objects, fields, AI skills, and UI components.

Customization

This section is for developers and technical implementers extending HotCRM with code. If you're a CRM admin configuring profiles and workflows, head to Administration instead.

What you can build

AreaWhat it covers
Extending objectsAdding fields, custom objects, hooks, flows, validation, sharing
AI skillsBuilding new AI Copilot skills wired to knowledge bases
UI extensionsCustom pages, list views, dashboards, dropdown actions

Prerequisites

  • TypeScript and Node.js fundamentals.
  • Familiarity with the @objectstack/runtime engine (HotCRM is built on it).
  • Access to the HotCRM source repo and a development sandbox.

The HotCRM file convention

HotCRM follows the "file suffix protocol" — each kind of artifact lives in a file with a specific suffix:

SuffixWhat it defines
*.object.tsData model — fields, validation, sharing
*.hook.tsServer-side business logic on data lifecycle
*.action.tsAPI endpoints and AI-callable tools
*.flow.tsMulti-step automation
*.skill.tsAn AI Copilot skill definition
*.agent.tsA composite AI agent (multiple skills + knowledge)
*.page.tsA UI page layout
*.view.tsA list view
*.dashboard.tsA dashboard definition
*.sharing.tsSharing rules (criteria-based or owner-based)
*.approval.tsApproval process definition
*.statemachine.tsState transitions
*.permission.tsPermission sets

All files live under packages/{package}/src/. Names are snake_case.

Project structure

hotcrm/
├── packages/
│   ├── crm/           # Sales (account, lead, contact, opportunity, ...)
│   ├── finance/       # Revenue (contract, invoice)
│   ├── products/      # Product catalog
│   ├── service/       # Cases, knowledge base
│   ├── marketing/     # Campaigns
│   └── ai/            # Copilot agents and skills
└── apps/
    └── docs/          # This documentation site

Add your customization in its own package (e.g., packages/acme-crm-extension/) to keep core HotCRM upgradable.

Where to start

  1. Set up a sandbox — clone the repo, install deps, run the dev environment.
  2. Read Extending Objects for the data layer.
  3. Read AI Skills for Copilot extensions.
  4. Read UI Extensions for the front-end.
  5. Validate every metadata file with the corresponding @objectstack/spec schema before committing.

Schema validation

Every metadata file must validate against an @objectstack/spec schema:

File typeSchema
*.object.tsObjectSchema.parse() from @objectstack/spec/data
*.page.tsPageSchema from @objectstack/spec/ui
*.flow.tsWorkflowRuleSchema.parse() from @objectstack/spec/automation
*.statemachine.tsStateMachineSchema.parse() from @objectstack/spec/automation
*.skill.tsSkill schema from @objectstack/spec/ai
*.permission.tsPermissionSetSchema.parse() from @objectstack/spec/security

CI fails if validation fails — so you'll know immediately.

Golden rules

  • Don't fork core packages — extend with hooks and new objects in your own package.
  • Use ObjectQL, not SQLbroker.find('crm_opportunity', {...}) is the only supported data access.
  • Snake_case for object and field names.
  • Validate everything against @objectstack/spec schemas.
  • Test in sandbox before deploying to production.

Next

On this page