Build an Application
A RootCX Application is made of three pieces: a manifest that defines your data model and permissions, a backend for custom logic, and a frontend for the UI. The Core handles everything else -- database tables, CRUD API, authentication, access control, and process supervision.
You don't need to write any of this from scratch. Describe what you want and the AI Forge generates the entire structure.
Quick Start
Open the Studio, create a new project, and type a prompt in the AI Forge:
"A CRM to manage contacts, companies, and deals with a sales pipeline."
The Forge scaffolds a manifest, a backend worker, and a React frontend. Hit Run (F5). The Core creates the database tables, starts the worker, and the app launches.

What Gets Generated
The Forge creates a project with this structure:
sales_crm/
├── manifest.json # Data model, permissions, actions
├── backend/
│ └── index.ts # Backend logic
└── src/
└── App.tsx # User interface
You can review and edit every file. The AI generates code you own.
The Manifest
The manifest.json is the single source of truth for your application. It declares your entities (tables), their fields, permissions, and actions. Everything else -- database tables, API endpoints, constraints -- is derived from it automatically.
Here is what a contacts table looks like in the manifest:
{
"appId": "sales_crm",
"name": "Sales CRM",
"dataContract": [
{
"entityName": "contacts",
"fields": [
{ "name": "first_name", "type": "text", "required": true },
{ "name": "last_name", "type": "text", "required": true },
{ "name": "email", "type": "text" },
{ "name": "phone", "type": "text" }
]
}
]
}
Every entity gets id, created_at, and updated_at columns automatically.
Field types
| Type | Description |
|---|---|
text |
Variable-length string. |
number |
Numeric value. |
boolean |
True/false. |
date |
Calendar date. |
timestamp |
Date and time. |
json |
Arbitrary structured data. |
file |
Uploaded file reference. |
entity_link |
Link to another entity (foreign key). |
[text] |
Array of strings. |
[number] |
Array of numbers. |
Relationships
Use entity_link to connect entities. For example, a deal linked to a contact and a company:
{ "name": "contact_id", "type": "entity_link", "references": { "entity": "contacts", "field": "id" } },
{ "name": "company_id", "type": "entity_link", "references": { "entity": "companies", "field": "id" } }
Constrained values
Use enumValues to restrict a field to a set of allowed values:
{ "name": "stage", "type": "text", "enumValues": ["lead", "qualified", "proposal", "won", "lost"], "defaultValue": "lead" }
Permissions
Add permission keys to the manifest to control who can do what:
"permissions": {
"permissions": [
{ "key": "contacts.create", "description": "Create contacts" },
{ "key": "contacts.read", "description": "View contacts" },
{ "key": "deals.update", "description": "Edit deals" },
{ "key": "deals.delete", "description": "Delete deals" }
]
}
Keys follow the entity.action convention. Once deployed, assign them to roles via the Studio Roles & Permissions panel. See RBAC for details.
Evolving Your App
Need to add a field, a new table, or change a type? Edit the manifest (or ask the Forge to do it) and hit Run again. The Schema Sync Engine diffs your manifest against the live database and applies only what changed. No migration files needed.
id, created_at, and updated_at are protected.Actions
Actions are named operations declared in the manifest. Declaring them makes them discoverable by the Studio, integrations, and AI agents:
"actions": [
{
"id": "pipeline",
"name": "Pipeline Summary",
"description": "Returns deal counts per stage"
}
]
To gate access, declare matching keys in the permissions block (e.g. action.pipeline).
File Uploads
Add a file field to any entity to enable file uploads. Max 50 MB per file. Supported formats include PDF, images, spreadsheets, CSV, JSON, and more.
Deploy
Press Run (F5) in Studio. The deployment pipeline:
- Manifest install -- creates or updates database tables and permissions.
- Schema sync -- applies any differences to the live database.
- Backend deploy -- starts the backend worker.
- App running -- the frontend connects and your app is live.
appId is immutable. It becomes the database schema name. Changing it after the first deploy requires manual data migration.What You Can Build
RootCX is purpose-built for custom internal software. Some examples:
- CRM & sales pipeline -- contacts, companies, deals, activities. Row-level access so reps see only their accounts.
- Billing & subscriptions -- plans, invoices, usage events. Workers handle Stripe webhooks and status updates.
- Fleet & field operations -- vehicles, drivers, assignments, maintenance schedules. Nightly jobs flag overdue maintenance.
- Document approval workflows -- documents, versions, approval chains. Each step triggers notifications.
- Industry-specific tools -- construction projects, clinical trials, logistics tracking. Any relational model works.
Next Steps
- Getting Started -- your first app in five minutes.
- Deploying -- deployment flow and production setup.
- For developers: Manifest Reference, Backend & RPC, React SDK.


