Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions cli/app.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -105,4 +105,6 @@ AI assistants in app-coder sessions use the `deploy_app` MCP tool to deploy your
- Enforces permission checks for deployment access.
- Supports optional URL slug overrides to customize your app's deployment URL.

The orchestrator MCP requires a valid message context (with `message_id`) to resolve the acting user. Message context is retained for 1 hour.

To use this tool in an AI-coder session, the AI assistant will call `deploy_app` with your application context. Deployments respect your organization's RBAC settings.
165 changes: 165 additions & 0 deletions connectors/clerk.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,165 @@
---
title: "Clerk"
description: "Manage users, organizations, and authentication data via the Clerk Backend API."
---

The `ClerkResourceClient` allows you to query and modify user and organization data in your Clerk account using the Clerk Backend API.

## Setup

To set up a Clerk connector, you need your Clerk Secret Key. Find it in your Clerk Dashboard under **API Keys**.

## Usage

```typescript
import { myClerkClient } from "./clients";

// List all users
const users = await myClerkClient.invoke(
"GET",
"/users",
"list-users",
{}
);

if (users.ok && users.result.body.kind === "json") {
console.log("Users:", users.result.body.value);
}
```

## Available Operations

The Clerk connector exposes the following operations via the Backend API:

### List Users

Retrieve a paginated list of users in your Clerk instance.

```typescript
const result = await myClerkClient.invoke(
"GET",
"/users",
"list-users",
{
query: {
limit: "10",
offset: "0",
},
}
);
```

### Get User

Retrieve a specific user by ID.

```typescript
const result = await myClerkClient.invoke(
"GET",
"/users/{user_id}",
"get-user",
{}
);
```

### List Organizations

Retrieve a paginated list of organizations.

```typescript
const result = await myClerkClient.invoke(
"GET",
"/organizations",
"list-organizations",
{
query: {
limit: "10",
offset: "0",
},
}
);
```

### Get Organization

Retrieve a specific organization by ID.

```typescript
const result = await myClerkClient.invoke(
"GET",
"/organizations/{organization_id}",
"get-organization",
{}
);
```

### Custom API Requests

Make arbitrary requests to any Clerk Backend API endpoint not explicitly listed above.

```typescript
const result = await myClerkClient.invoke(
"POST",
"/users/{user_id}/ban",
"ban-user",
{
body: {
type: "json",
value: {},
},
}
);
```

## Inputs

The `invoke` method accepts the following arguments:

<ParamField path="method" type="string" required>
The HTTP method to use: `"GET"`, `"POST"`, `"PUT"`, `"PATCH"`, or `"DELETE"`.
</ParamField>

<ParamField path="path" type="string" required>
The Clerk Backend API path (e.g., `/users`, `/organizations/{organization_id}`).
</ParamField>

<ParamField path="invocationKey" type="string" required>
A unique identifier for this operation.
</ParamField>

<ParamField path="options" type="object">
Optional configuration object.
<Expandable title="properties">
<ParamField path="query" type="Record<string, string | string[]>">
Query parameters.
</ParamField>
<ParamField path="body" type="object">
The request body.
<Expandable title="properties">
<ParamField path="type" type='"json"' required />
<ParamField path="value" type="unknown" required>
The JSON payload.
</ParamField>
</Expandable>
</ParamField>
<ParamField path="timeoutMs" type="number">
Timeout in milliseconds (default: 30000).
</ParamField>
</Expandable>
</ParamField>

## Outputs

The output format is the same as the [Custom API](/connectors/custom-api#outputs) client.

<ResponseField name="kind" type='"api"'>
Discriminator for the response type.
</ResponseField>

<ResponseField name="status" type="number">
The HTTP status code.
</ResponseField>

<ResponseField name="body" type="ResponseBody">
The response body (typically JSON).
</ResponseField>
12 changes: 11 additions & 1 deletion connectors/hubspot.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,17 @@ title: "HubSpot"
description: "Interact with the HubSpot CRM API."
---

The `HubSpotResourceClient` is a specialized client for interacting with the HubSpot API, providing a convenient way to access CRM objects and other HubSpot features.
The `HubSpotResourceClient` is a specialized client for interacting with the HubSpot API, providing a convenient way to access CRM objects and other HubSpot features. It uses OAuth for authentication, so you authorize once and Major handles token management.

## Setup

1. Go to **Organization Settings > Connectors**
2. Click **Add Connector** and select **HubSpot**
3. Click **Connect to HubSpot** to authorize access to your HubSpot account
4. You'll be redirected back to the connectors page with the resource details sheet already open
5. Finish configuring the resource and click **Save**

Attach the resource to your app via `major resource manage` (CLI) or the web editor. Major generates a client in `src/clients/`.

## Usage

Expand Down
3 changes: 3 additions & 0 deletions connectors/index.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -133,6 +133,9 @@ For S3 and DynamoDB resources, you can use Assume Role Identities instead of acc
<Card title="Microsoft Dynamics 365" icon="cloud" href="/connectors/dynamics-365">
Dataverse CRM integration
</Card>
<Card title="Clerk" icon="key" href="/connectors/clerk">
User and organization management
</Card>
</CardGroup>

Don't see the connector you need? Click **Request it** in the Add Connector dialog to submit a request.
12 changes: 11 additions & 1 deletion connectors/salesforce.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,17 @@ title: "Salesforce"
description: "Query and manage Salesforce CRM data with SOQL."
---

The `SalesforceResourceClient` provides access to Salesforce CRM data, allowing you to run SOQL queries and perform CRUD operations on sObjects.
The `SalesforceResourceClient` provides access to Salesforce CRM data, allowing you to run SOQL queries and perform CRUD operations on sObjects. It uses OAuth for authentication, so you authorize once and Major handles token management.

## Setup

1. Go to **Organization Settings > Connectors**
2. Click **Add Connector** and select **Salesforce**
3. Click **Connect to Salesforce** to authorize access to your Salesforce account
4. You'll be redirected back to the connectors page with the resource details sheet already open
5. Finish configuring the resource and click **Save**

Attach the resource to your app via `major resource manage` (CLI) or the web editor. Major generates a client in `src/clients/`.

## Usage

Expand Down
4 changes: 4 additions & 0 deletions connectors/slack.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,10 @@ if (result.ok && result.result.body.kind === "json") {

The Slack integration accepts direct messages from users in addition to app mentions and threaded replies. Top-level DMs start new conversations, and threaded DM replies continue existing ones. This expands how users can interact with your bot via Slack—they can message it directly without mentioning it in a channel.

## Slack Orchestrator Threads

When a Slack orchestrator thread is created, the user who initiated the thread is automatically granted Admin role on the associated application. This allows users to manage the app without requiring pre-existing access or manual permission assignment.

## Channel Access Verification

Before performing any channel operations, the AI agent must verify that the bot has access to the target channel. The agent calls `slack_list_channels` first to confirm bot access.
Expand Down
2 changes: 1 addition & 1 deletion getting-started/billing.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ Team plans increase limits to **15 builders**, **50 viewers**, and unlimited app

Plans are billed monthly or annually.

Annual plans include a **20% credit bonus** on top of the monthly balance. When you select an annual plan, the pricing display breaks down the cost as the base monthly price plus the bonus credit value, making the total benefit more transparent. Unused credits roll over for 30 days on monthly plans and 365 days on annual plans.
Annual plans include a **20% credit bonus** on top of the monthly balance. When you select an annual plan, the pricing display shows the base monthly price and bonus credit separately and prominently—for example, "$X monthly" plus "+$Y extra" highlighted in green. This visual separation makes the bonus value immediately clear.

Team plans also enable **domain auto-enrollment** — new users who sign up with your organization's email domain are automatically added.

Expand Down
4 changes: 4 additions & 0 deletions getting-started/core-concepts.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,10 @@ Persistent memory stores organization-wide knowledge that your AI assistants and

Memory is organized into files that can be viewed, created, edited, and deleted — either through the Memory panel in the editor or through API endpoints. The system tracks which source (user, AI coder, or memory agent) made each change.

### Memory Agent Resilience

The memory agent retries transient failures (network timeouts, HTTP 408, 429, 502, 503, 504) with exponential backoff and enforces a 15-second timeout per request. This improves reliability during temporary service disruptions.

## How they work together

1. **Admins** configure connectors and grant permissions to users and groups
Expand Down
10 changes: 9 additions & 1 deletion getting-started/quickstart-web.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,15 @@ This guide walks you through creating an app using the Major web dashboard. No l

## Step 1 — Sign in

Go to [app.major.build](https://app.major.build) and sign up or sign in. From the dashboard you can create a new app by describing what you need, manage your existing apps, or configure resources.
Go to [app.major.build](https://app.major.build) and sign up or sign in.

The signup flow starts with a "Get a free, personalized demo" screen. If you sign up through a campaign (renewals, health, leadgen, credit, inventory, rfp, or complex-data), you'll see a tailored subtitle describing what will be built for you.

For the renewals campaign, the signup page features an interactive chat experience. You answer three multiple-choice questions about your CRM, contract data source, and notification preferences. The interface then shows a simulated conversation flow: your responses, personalized agent recommendations, an animated todo checklist, and a preview of the generated app. Your email and answers are stored to personalize your onboarding experience.

On desktop, the chat appears on the right side with the signup form on the left. On mobile, the chat fills the screen with email capture presented as a slide-up panel at the end.

Other campaigns display a streamlined email collection screen. Your email is stored along with campaign ID and UTM parameters from your signup URL to track demo follow-ups.

## Step 2 — Create an app

Expand Down
10 changes: 8 additions & 2 deletions web/connectors.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,12 @@ The web dashboard lets you configure and manage connectors for your organization

1. Click **Add Connector** in the Connectors page
2. Select the connector type from the list
3. Complete the configuration and authentication (some connectors use OAuth)
4. Click **Save**
3. Complete the configuration and authentication
- For OAuth-based connectors (Google Sheets, HubSpot, Salesforce, etc.), click **Connect** to authorize access
- You'll be redirected to the provider's authorization screen
- After authorizing, you're automatically redirected back to the connectors page with the resource details sheet already open
4. Finish configuring the resource on the default environment tab
5. Click **Save**

If you don't see the connector you need, click **Request it** to submit a feature request.

Expand All @@ -35,6 +39,8 @@ To configure:
3. Enter the connection details for that environment
4. Click **Save**

Environment lists are sorted by creation date (oldest first), ensuring the default Production environment always appears first.

### Shared Configuration

For organizations with multiple environments, you can enable **shared configuration** on a resource. This uses a single configuration (from the default environment) across all environments instead of requiring per-environment setup.
Expand Down
4 changes: 4 additions & 0 deletions web/crons.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,10 @@ The Crons panel in the editor shows all defined jobs with their schedules and ex
- **Delete jobs** — remove cron jobs from your app
- **View versions** — see cron definitions from different app versions and deploy specific versions

## Viewing Deployed Crons

Deployed cron jobs appear on the home page app cards with a calendar icon indicator. The indicator shows the count and names of active scheduled jobs along with their human-readable schedule format, including specific times (e.g., "Daily at 9:03 AM", "Weekly on Monday at 2:30 PM"). This works for daily, weekly, and monthly schedules.

## Execution

When a cron executes, Major sends an HTTP POST request to the specified URL with an `x-major-cron-jwt` header containing a signed token. Use this to verify the request came from Major.
4 changes: 4 additions & 0 deletions web/deploying.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,10 @@ When your app is published, a **Copy link** button appears, allowing you to quic

The **Share** button lets you manage access to your app with granular role-based permissions (Admin, Editor, Viewer). Add team members by email and control what they can do.

### Social preview metadata

When you share a deployed app link on social platforms (Slack, Twitter, LinkedIn, Facebook), Major generates Open Graph and Twitter Card metadata to create rich preview cards. For customer story pages, the preview uses the story's hero image (or falls back to the main content image if no hero image is set), along with the page title and description. This makes your shared links stand out with custom visuals instead of a generic site preview.

## Public and Private Apps

Deploy apps publicly (no authentication required) or privately (auth-gated). Public apps are accessible to anyone with the URL. Private apps require users to sign in and have the appropriate permissions.
Expand Down
Loading