Skip to content

Quickstart

  • Node.js 18 or newer
  • Docker (for local Mongo) — or any MongoDB connection string
  • About 60 seconds

Pick a template that’s closest to what you’re building. crm is the most fully-featured example; blank if you want to start empty.

Terminal window
npx create-davepi-app my-app --template crm
cd my-app

Templates available:

TemplateWhat you get
blankMinimal — one resource, full-text search.
crmAccounts / contacts / deals (state machine) / activities.
ticketingTickets with two state machines + comments.
contentArticles (editorial workflow), categories, file uploads.
b2b-saasOrgs / workspaces / invites / billing-event ledger.
Terminal window
docker compose up -d

The scaffolder dropped a docker-compose.yml that runs MongoDB on the default port. If you already have a Mongo connection string, edit the MONGO_URI value in the generated .env.

Terminal window
npm install
npm start

The server picks an unused port (default 5050; the scaffolder probes and falls back if it’s busy). The terminal prints the URL it actually bound to.

In another terminal:

Terminal window
npm run seed

This registers a demo user (demo@example.com / demo-password!) and POSTs realistic sample records.

SurfaceURL
RESThttp://localhost:5050/api/v1/<resource>
GraphQL playgroundhttp://localhost:5050/graphql/
Swagger UIhttp://localhost:5050/api-docs
Capability manifesthttp://localhost:5050/_describe
Admin SPAhttp://localhost:5050/admin (if built)

For example:

Terminal window
TOKEN=$(curl -s -X POST http://localhost:5050/login \
-H 'Content-Type: application/json' \
-d '{"email":"demo@example.com","password":"demo-password!"}' \
| jq -r .accessToken)
curl -s http://localhost:5050/api/v1/account \
-H "Authorization: Bearer $TOKEN" | jq '.results'

The scaffolder dropped a .mcp.json with the MCP server pre-configured. Open the project in Claude Code and ask:

Add a lostReason field to deal that’s only populated when stage is lost, and an aggregation that groups lost deals by reason.

Claude reads the schema, drops a new file under schema/versions/v1/, and hot-reload picks it up — no restart.