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

AreaWhat it covers
Extending objectsFields, objects, hooks, flows, validation, sharing
AI skillsSkills for the platform assistant, and the barrel that registers them
UI extensionsPages, views, dashboards, actions
Testing and CIMetadata 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 implement

Inside 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

SuffixWhat it defines
*.object.tsData model
*.hook.tsObject lifecycle logic
*.actions.tsUI actions and executable actions
*.flow.tsAutomation
*.skill.tsAI Copilot skill
*.page.tsUI page
*.view.tsList or kanban view
*.dashboard.tsDashboard
*.report.tsReport
*.sharing.tsSharing rule
*.profile.tsPermission 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.ts file.
  • Update translations when adding user-visible labels.
  • Run pnpm verify before publishing.

Next

On this page