For Developers
How to clone, run, and extend HotCRM as an ObjectStack marketplace app.
For Developers
This page is for engineers working with the HotCRM source repo.
Prerequisites
- Node.js 20+
- pnpm 10+
- A clone of
objectstack-ai/hotcrm
Run locally
git clone https://github.com/objectstack-ai/hotcrm.git
cd hotcrm
pnpm install
pnpm devOpen http://localhost:4001. The app boots with seed data on first start.
Repository shape
HotCRM is a single ObjectStack app. objectstack.config.ts is the source of truth that registers metadata from src/.
hotcrm/
├── objectstack.config.ts
├── src/
│ ├── objects/ # *.object.ts schemas and *.hook.ts lifecycle logic
│ ├── hooks/ # barrel that hands the object hooks to the stack
│ ├── actions/ # UI actions and executable action bodies
│ ├── flows/ # automation flows
│ ├── skills/ # AI skills
│ ├── apps/, views/, pages/
│ ├── dashboards/, reports/, datasets/
│ ├── mappings/ # import column-to-field projections
│ ├── profiles/, sharing/
│ ├── translations/
│ ├── data/ # seed data
│ ├── docs/ # package docs, shipped inside the built artifact
│ └── interfaces/ # shared types (an empty barrel today)
├── apps/docs/ # Fumadocs app
└── content/docs/ # documentation contentHotCRM 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. See AI Skills.
File suffix protocol
| Suffix | Defines |
|---|---|
*.object.ts | Data model |
*.hook.ts | Server-side lifecycle logic |
*.actions.ts | UI actions and AI-callable action bodies |
*.flow.ts | Automation |
*.skill.ts | AI 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 |
Common tasks
Add or change an object
Edit or add a file under src/objects/, then export it from src/objects/index.ts.
import { ObjectSchema, Field } from '@objectstack/spec/data';
export const Warranty = ObjectSchema.create({
name: 'crm_warranty',
label: 'Warranty',
fields: {
name: Field.text({ label: 'Warranty Name', required: true }),
crm_account: Field.lookup('crm_account', { label: 'Account' }),
},
});Add an AI skill
Create src/skills/<name>.skill.ts and export it from src/skills/index.ts. Exporting it from that barrel is the whole wiring step — the skill attaches to the platform assistant (ask), and this app defines no agent of its own.
Add UI metadata
Use src/views/ for list and kanban views, src/pages/ for record pages, and src/actions/ for buttons and modal actions.
Verify changes
pnpm validate
pnpm typecheck
pnpm build
pnpm testThe shortcut is:
pnpm verify