From b7d90b9f691a22fa42026ca5ab16a5cdecfc67e6 Mon Sep 17 00:00:00 2001
From: docs-writer-bot <123709173+docs-writer-bot@users.noreply.github.com>
Date: Wed, 13 May 2026 13:45:58 -0700
Subject: [PATCH] =?UTF-8?q?docs:=20update=20from=20mono-builder=20(2026-04?=
=?UTF-8?q?-13=20=E2=86=92=202026-04-20)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
cli/app.mdx | 2 +
connectors/clerk.mdx | 165 +++++++++++++++++++++++++++++
connectors/hubspot.mdx | 12 ++-
connectors/index.mdx | 3 +
connectors/salesforce.mdx | 12 ++-
connectors/slack.mdx | 4 +
getting-started/billing.mdx | 2 +-
getting-started/core-concepts.mdx | 4 +
getting-started/quickstart-web.mdx | 10 +-
web/connectors.mdx | 10 +-
web/crons.mdx | 4 +
web/deploying.mdx | 4 +
web/domains.mdx | 34 +++---
web/editor.mdx | 23 +++-
web/env-vars.mdx | 72 +++++++++++++
web/environments.mdx | 10 ++
web/errors.mdx | 22 ++--
web/index.mdx | 40 +++++++
18 files changed, 402 insertions(+), 31 deletions(-)
create mode 100644 connectors/clerk.mdx
diff --git a/cli/app.mdx b/cli/app.mdx
index 3f7332b..32084e3 100644
--- a/cli/app.mdx
+++ b/cli/app.mdx
@@ -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.
diff --git a/connectors/clerk.mdx b/connectors/clerk.mdx
new file mode 100644
index 0000000..06660ed
--- /dev/null
+++ b/connectors/clerk.mdx
@@ -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:
+
+
+ The HTTP method to use: `"GET"`, `"POST"`, `"PUT"`, `"PATCH"`, or `"DELETE"`.
+
+
+
+ The Clerk Backend API path (e.g., `/users`, `/organizations/{organization_id}`).
+
+
+
+ A unique identifier for this operation.
+
+
+
+ Optional configuration object.
+
+
+ Query parameters.
+
+
+ The request body.
+
+
+
+ The JSON payload.
+
+
+
+
+ Timeout in milliseconds (default: 30000).
+
+
+
+
+## Outputs
+
+The output format is the same as the [Custom API](/connectors/custom-api#outputs) client.
+
+
+ Discriminator for the response type.
+
+
+
+ The HTTP status code.
+
+
+
+ The response body (typically JSON).
+
diff --git a/connectors/hubspot.mdx b/connectors/hubspot.mdx
index fbea528..26ff09b 100644
--- a/connectors/hubspot.mdx
+++ b/connectors/hubspot.mdx
@@ -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
diff --git a/connectors/index.mdx b/connectors/index.mdx
index 9bc79e0..4a6f728 100644
--- a/connectors/index.mdx
+++ b/connectors/index.mdx
@@ -133,6 +133,9 @@ For S3 and DynamoDB resources, you can use Assume Role Identities instead of acc
Dataverse CRM integration
+
+ User and organization management
+
Don't see the connector you need? Click **Request it** in the Add Connector dialog to submit a request.
diff --git a/connectors/salesforce.mdx b/connectors/salesforce.mdx
index f4ae71a..ce0dac0 100644
--- a/connectors/salesforce.mdx
+++ b/connectors/salesforce.mdx
@@ -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
diff --git a/connectors/slack.mdx b/connectors/slack.mdx
index cc59c4c..4835380 100644
--- a/connectors/slack.mdx
+++ b/connectors/slack.mdx
@@ -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.
diff --git a/getting-started/billing.mdx b/getting-started/billing.mdx
index 2177728..2f7635c 100644
--- a/getting-started/billing.mdx
+++ b/getting-started/billing.mdx
@@ -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.
diff --git a/getting-started/core-concepts.mdx b/getting-started/core-concepts.mdx
index 280ead6..068b556 100644
--- a/getting-started/core-concepts.mdx
+++ b/getting-started/core-concepts.mdx
@@ -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
diff --git a/getting-started/quickstart-web.mdx b/getting-started/quickstart-web.mdx
index b7ec3ce..80ace19 100644
--- a/getting-started/quickstart-web.mdx
+++ b/getting-started/quickstart-web.mdx
@@ -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
diff --git a/web/connectors.mdx b/web/connectors.mdx
index fcc6ec9..f777c98 100644
--- a/web/connectors.mdx
+++ b/web/connectors.mdx
@@ -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.
@@ -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.
diff --git a/web/crons.mdx b/web/crons.mdx
index 6497498..727abc4 100644
--- a/web/crons.mdx
+++ b/web/crons.mdx
@@ -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.
diff --git a/web/deploying.mdx b/web/deploying.mdx
index 611fbc1..8b4f410 100644
--- a/web/deploying.mdx
+++ b/web/deploying.mdx
@@ -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.
diff --git a/web/domains.mdx b/web/domains.mdx
index c70a77b..258ae6d 100644
--- a/web/domains.mdx
+++ b/web/domains.mdx
@@ -3,33 +3,35 @@ title: "Domains"
description: "Connect your application to a branded domain name."
---
-When you publish an app on Major, it always gets an internet-accessible URL. By default that's a `usemajor.dev` subdomain, but you can also serve apps from your own branded domain — for example, `dashboard.acme.com` instead of `acme-dashboard.usemajor.dev`.
+When you publish an app on Major, it always gets an internet-accessible URL. By default that's a `usemajor.dev` subdomain, but you can also serve apps from your own branded domain — for example, `app1.coolapp.com` instead of `app1.usemajor.dev`.
-Custom domains are configured in two steps:
+Major uses a two-level domain structure:
-1. An **organization admin** verifies a domain you own (e.g. `acme.com`) by adding two DNS records.
-2. Any **builder** can then pick a subdomain (e.g. `dashboard.acme.com`) when publishing an app on the verified domain.
+1. **Organization domains** — A root domain (e.g., `coolapp.com`) registered and verified once at the organization level by an admin.
+2. **Application subdomains** — Each app claims a subdomain (e.g., `app1`) under the organization domain, resulting in `app1.coolapp.com`.
+
+This lets you register a single domain for your organization and map multiple apps to different subdomains under it.
Custom domains are currently **free of charge**.
## Set up an organization domain
-Adding a domain is a one-time, organization-level action that any admin can perform from **Settings > Domains**.
+Adding a domain is a one-time, organization-level action that any admin can perform from **Settings > Domains**. Once verified, all builders in your organization can assign subdomains of this domain to their apps.
1. Go to **Settings > Domains** and click **Add Domain**.
-2. Enter the root domain you own (e.g. `acme.com`).
+2. Enter the root domain you own (e.g., `coolapp.com`).
3. Major shows you two CNAME records to add at your DNS provider:
| Record | Type | Target |
| --- | --- | --- |
-| `*.acme.com` | CNAME | `cname.major.build` |
-| `_acme-challenge.acme.com` | CNAME | `_acme-challenge.acme.major.build` |
+| `*.coolapp.com` | CNAME | `cname.major.build` |
+| `_acme-challenge.coolapp.com` | CNAME | `_acme-challenge.acme.major.build` |
4. Add both records in your DNS provider's dashboard.
5. Major automatically polls DNS, validates ownership, and issues an SSL certificate.
-The wildcard CNAME (`*.acme.com`) is what makes the rest of the flow zero-touch. Once it's in place, every new subdomain you assign to an app routes to Major's infrastructure without any further DNS changes.
+The wildcard CNAME (`*.coolapp.com`) is what makes the rest of the flow zero-touch. Once it's in place, every new subdomain you assign to an app routes to Major's infrastructure without any further DNS changes.
### Verification status
@@ -50,13 +52,13 @@ Note: If DNS verification has not succeeded in 48 hours, you can make another ve
SSL certificates are issued by Let's Encrypt using a DNS-01 challenge against the `_acme-challenge` CNAME. Renewals happen automatically before expiry — you never need to touch the records again.
-## Assign a domain to an app
+## Assign an application subdomain
-Once an organization domain is **Active**, any builder with edit access on an app can pick a subdomain on it:
+Once an organization domain is **Active**, any builder with edit access on an app can claim a subdomain under it:
1. Open the app in the editor and click **Publish**.
2. In the URL picker, choose the verified organization domain.
-3. Enter the subdomain you want (e.g. `dashboard` for `dashboard.acme.com`).
+3. Enter the subdomain you want (e.g., `app1` for `app1.coolapp.com`).
4. Click **Publish**.
You can assign a custom domain on the very first deploy of an app — there's no need to publish to a `usemajor.dev` URL first. The subdomain is reserved as soon as you confirm it; routing goes live as soon as the deployment completes.
@@ -65,7 +67,7 @@ You can also assign a custom subdomain to an already-deployed app — it becomes
### Multiple subdomains per app
-A single app can be served from multiple subdomains at once (for example, both `dashboard.acme.com` and `app.acme.com`). Add additional subdomains from the app's URL settings.
+A single app can be served from multiple subdomains at once (for example, both `app1.coolapp.com` and `dashboard.coolapp.com`). Add additional subdomains from the app's URL settings.
## Authentication on custom domains
@@ -84,7 +86,7 @@ Permissions are re-checked on every request, so removing a user's access takes e
| Resource | Limit |
| --- | --- |
| Organization domains | 10 per organization |
-| Subdomains | 20 per application |
+| Application subdomains | 20 per application |
## Removing a domain
@@ -95,7 +97,7 @@ Permissions are re-checked on every request, so removing a user's access takes e
A few configurations are intentionally not available today:
-- **Apex domains.** You can use `dashboard.acme.com` but not `acme.com` itself as an app URL.
-- **Multi-level subdomains.** `api.acme.com` works; `api.v2.acme.com` does not — the wildcard certificate covers exactly one level.
+- **Apex domains.** You can use `app1.coolapp.com` but not `coolapp.com` itself as an app URL.
+- **Multi-level subdomains.** `api.coolapp.com` works; `api.v2.coolapp.com` does not — the wildcard certificate covers exactly one level.
- **Bring-your-own certificates.** All certificates are issued by Major via Let's Encrypt.
- **Frontend-only (Vite) apps.** Custom domains are available for full-stack (Next.js) apps only.
diff --git a/web/editor.mdx b/web/editor.mdx
index f23e3c2..b321606 100644
--- a/web/editor.mdx
+++ b/web/editor.mdx
@@ -24,7 +24,18 @@ The AI uses these attachments as context when building or modifying your app —
## @ Mentions
-Type `@` in the chat to explicitly reference connectors, attachments, and workspace files in your message. This tells the AI exactly which resource or file you're talking about.
+Type `@` in the chat to explicitly reference connectors, attachments, and workspace files in your message. This tells the AI exactly which resource or file you're talking about. Workspace files appear immediately in the mention popover when you start a new session, so you can reference them right away without waiting for the AI to make initial changes.
+
+## Session State and Readiness
+
+The editor tracks the session state to show you whether the AI agent is ready and actively running. When you start a new chat session, the AI agent initializes and marks the session as READY once it's fully operational and has loaded your application context.
+
+The session state helps you understand:
+
+- Whether the AI is ready to accept your next request
+- When the agent has completed its startup sequence and loaded your codebase
+
+You'll see visual indicators in the chat interface showing when the agent is initializing versus ready to respond.
## Tool Cards
@@ -35,6 +46,15 @@ When the AI executes resource operations in the chat, tool cards display the ope
- **Arguments with descriptions**: Input parameters are labeled with human-readable descriptions and resolved resource names where applicable.
- **Formatted output**: Results are displayed with proper JSON formatting for clarity.
+## Error Notifications
+
+When your deployed or previewed app encounters a runtime error, an error card appears in the chat panel with the error message, stack trace, and context. Error cards include two action buttons:
+
+- **Fix with AI** — sends the error details to the AI assistant, which analyzes the issue and proposes code changes
+- **Ignore** — marks the error as ignored and hides it from the errors panel
+
+This gives you real-time visibility into app errors without switching to the Errors panel, and lets you request AI fixes directly from the error notification.
+
## Approvals & User Input
When your app requires approval before executing a tool or needs input from you, approval and ask-user cards render directly within the chat message flow. You no longer see separate overlay windows — everything stays in context within the chat.
@@ -90,4 +110,3 @@ The AI assistant has built-in TypeScript language server support, giving it prec
The AI assistant can query production logs from your deployed applications. Ask the AI to investigate runtime errors, search specific log patterns, or examine application behavior in production. The AI searches logs collected from your app's container stdout and stderr, filtered by organization and app ID.
Use this to debug issues in deployed apps without leaving the editor. The AI can correlate log messages with your code to identify root causes and suggest fixes.
-
diff --git a/web/env-vars.mdx b/web/env-vars.mdx
index 504843d..a43dd1e 100644
--- a/web/env-vars.mdx
+++ b/web/env-vars.mdx
@@ -13,10 +13,82 @@ When you update or delete an environment variable, the preview automatically rel
System variables like `MAJOR_API_BASE_URL` cannot be overridden. Any variable with the `MAJOR_` prefix is reserved.
+## User Environment Variable Isolation
+
+User-defined environment variables are isolated and passed only to your build and application subprocesses. They cannot override the builder's or runner's internal environment variables (such as AWS credentials). This isolation prevents user environment variables from compromising access to internal infrastructure.
+
## Deployed Apps
After changing environment variables in a deployed app, click **Redeploy** to apply them to the live deployment. Environment variable changes do not take effect on deployed apps until redeployed.
+### Next.js v1 Redeploy Recovery
+
+If you redeployed a Next.js v1 app between April 7 and now without making code changes, your environment variables may not have been applied to the deployment due to a regression. Click **Redeploy** again to restore your configured environment variables to the live app.
+
## CLI
You can also manage environment variables from the CLI. Environment names are case-insensitive, so `--env staging` and `--env Staging` resolve to the same environment. See the [CLI Resource docs](/cli/resource) for details.
+
+## Environment variables via CLI API
+
+Manage environment variables programmatically using the CLI API. All endpoints require your application ID.
+
+### List environment variables
+
+```
+GET /cli/application/:applicationId/env-variables
+```
+
+Returns all environment variables with their values across each environment.
+
+**Response:**
+```json
+{
+ "variables": [
+ {
+ "key": "DATABASE_URL",
+ "values": {
+ "staging": "postgres://...",
+ "production": "postgres://..."
+ }
+ }
+ ]
+}
+```
+
+### Set an environment variable
+
+```
+POST /cli/application/:applicationId/env-variables/set
+```
+
+Set a single environment variable for a specific environment.
+
+**Request body:**
+```json
+{
+ "key": "API_KEY",
+ "value": "secret123",
+ "environment": "staging"
+}
+```
+
+### Delete an environment variable
+
+```
+DELETE /cli/application/:applicationId/env-variables/by-key/:key
+```
+
+Delete an environment variable. You can delete it from a single environment or all environments.
+
+**Query parameters:**
+- `environment` (optional) – Delete from a specific environment only. If omitted, deletes the variable from all environments.
+
+**Example:**
+```bash
+# Delete from staging only
+DELETE /cli/application/app-123/env-variables/by-key/API_KEY?environment=staging
+
+# Delete from all environments
+DELETE /cli/application/app-123/env-variables/by-key/API_KEY
+```
diff --git a/web/environments.mdx b/web/environments.mdx
index cff7389..9851aed 100644
--- a/web/environments.mdx
+++ b/web/environments.mdx
@@ -63,3 +63,13 @@ When you switch environments:
Production deployments always use the default environment.
+
+## Selecting environments via CLI MCP
+
+The CLI MCP exposes separate environment selection tools for resource operations. If you're using AI tools like Claude Desktop or Cursor with the Major CLI MCP, you can use `set_environment` and `get_environment` to switch environments without changing your web editor selection.
+
+This CLI environment selection is independent from the web editor's environment selector, allowing you to work with different environments in each context.
+
+
+ See how to access organization resources through the CLI MCP.
+
diff --git a/web/errors.mdx b/web/errors.mdx
index aeb216a..d73a1a3 100644
--- a/web/errors.mdx
+++ b/web/errors.mdx
@@ -3,7 +3,7 @@ title: "Errors"
description: "Monitor and debug runtime errors from your deployed apps."
---
-The **Errors** panel displays runtime errors from your deployed applications. Use it to identify issues in production, understand error patterns, and resolve problems quickly.
+The **Errors** panel displays runtime errors from your deployed applications. Errors from deployed and previewed apps appear as real-time notifications in the chat panel, so you catch issues as they occur and fix them immediately.
## Error Details
@@ -20,16 +20,24 @@ Errors are automatically collected from your app's container runtime and organiz
Errors from your application are automatically collected and aggregated — no additional configuration needed. Major captures runtime errors from your app code and surfaces them in the Errors panel.
-## Ask AI to Fix
+## Real-time Error Notifications
-Click the **Ask AI to fix** button on any error to send the full error details to the AI chat in the editor. The AI uses the message, stack trace, and context to:
+When an error occurs in your deployed or previewed app, it appears as a notification in the chat panel. Error cards in the chat show the error message, stack trace, and environment context, with two action buttons:
-- Identify the root cause
-- Suggest code changes to resolve the issue
-- Walk you through the fix step-by-step
+- **Fix with AI** — sends the error directly to the AI assistant, which analyzes the full error details and proposes code changes to resolve the issue
+- **Ignore** — marks the error as ignored and hides it from the errors panel
-This shortcut skips copying and pasting error details manually — the AI has everything it needs to start debugging immediately.
+This lets you see errors as they happen and request fixes without leaving the chat.
+
+## Ignoring Errors
+
+When you click **Ignore** on an error card in the chat, the error is marked as ignored and hidden from the errors panel. You can toggle between active and ignored errors using the Active/Ignored filter in the errors panel to review previously ignored errors if needed.
## Filtering and Search
+The errors panel includes filters to help you focus on the errors that matter:
+
+- **Environment** — filter by coding-session (live preview), deployment (production), or local-dev errors
+- **Active/Ignored** — toggle between active errors and errors you've marked as ignored
+
The panel updates automatically as new errors occur in your deployed app. You can review error history to spot patterns and address systemic issues before they affect more users.
diff --git a/web/index.mdx b/web/index.mdx
index 57ddf80..a7c91c1 100644
--- a/web/index.mdx
+++ b/web/index.mdx
@@ -4,3 +4,43 @@ description: "Build, configure, and deploy your internal tools."
---
The Major web dashboard is where you build, configure, and ship your internal tools. Use the AI-powered [editor](/web/editor) to develop your app, [deploy](/web/deploying) to production, configure [environments](/web/environments) for staging and production, and manage [permissions](/web/permissions) to control who can access what.
+
+## Home Page
+
+The home page displays all your apps as cards. Each card shows the app name, status, and any deployed [scheduled jobs](/web/crons). Apps with scheduled cron jobs display a calendar icon indicator with the count and names of active crons in human-readable schedule format, including specific times (e.g., "Daily at 9:03 AM", "Weekly on Monday at 2:30 PM"). Click the indicator to jump directly to the app's cron management tab.
+
+Use the "Filter Scheduled Jobs" button to view only apps with deployed cron jobs.
+
+### Pinning Apps
+
+Pin your most-used apps to keep them at the top of the app grid. Hover over an app card to reveal the pin icon, then click it to pin or unpin the app. Pinned apps appear in a dedicated "Pinned" section above all other apps. Your pins persist across "My Apps" and "All Apps" tabs, and across search results, so your most important apps are always easy to find.
+
+Pins are scoped to your user and organization.
+
+## API
+
+### Get Pinned Applications
+
+Retrieve the list of apps you've pinned in your current organization.
+
+```bash
+GET /applications/pins
+```
+
+Returns an array of pinned app IDs in the order you've pinned them.
+
+### Pin an Application
+
+Pin an app to your dashboard.
+
+```bash
+PUT /applications/:id/pin
+```
+
+### Unpin an Application
+
+Unpin an app from your dashboard.
+
+```bash
+DELETE /applications/:id/pin
+```