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 dev

Open 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 content

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. See AI Skills.

File suffix protocol

SuffixDefines
*.object.tsData model
*.hook.tsServer-side lifecycle logic
*.actions.tsUI actions and AI-callable action bodies
*.flow.tsAutomation
*.skill.tsAI skill
*.page.tsUI page
*.view.tsList or kanban view
*.dashboard.tsDashboard
*.report.tsReport
*.sharing.tsSharing rule
*.profile.tsPermission 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 test

The shortcut is:

pnpm verify

Where to go next

On this page