Sign up and create a workspace
- 1Go to the Sign up page and create your account.
- 2Add your organization name and confirm your email.
- 3Create your first workspace and project.
Documentation
Set up AI providers, manage secrets, and enable cloud deployment targets.
Create a workspace and ship your first deployment.
Generate code and deploy it as a container in one flow.
Comprehensive REST API guide for end users, including authentication, deployment flows, and practical examples.
Use `/api` as the base path and choose the auth type based on the endpoint family.
Command
export NEXUS_API_BASE="https://nexusai.run/api"
export NEXUS_JWT="YOUR_JWT_FROM_LOGIN"
export NEXUS_TOKEN="nxk_YOUR_ACCESS_TOKEN"Command
curl -s "$NEXUS_API_BASE/projects" \
-H "Authorization: Bearer $NEXUS_JWT"Command
curl -s "$NEXUS_API_BASE/gpt/providers" \
-H "Authorization: Bearer $NEXUS_TOKEN"Command
{
"success": true,
"data": { ... }
}Command
curl -s "$NEXUS_API_BASE/openapi.yaml"Register or login, then reuse the JWT for project, deployment, secrets, GitHub, and database APIs.
Command
curl -s -X POST "$NEXUS_API_BASE/auth/login" \
-H "Content-Type: application/json" \
-d '{
"email": "[email protected]",
"password": "your-password"
}'Command
curl -s "$NEXUS_API_BASE/auth/verify" \
-H "Authorization: Bearer $NEXUS_JWT"Command
const api = async (path, options = {}) => {
const res = await fetch(`${NEXUS_API_BASE}${path}`, {
...options,
headers: {
'Content-Type': 'application/json',
Authorization: `Bearer ${NEXUS_JWT}`,
...(options.headers || {}),
},
});
return res.json();
};
const projects = await api('/projects');Create scoped access tokens for machine workflows such as GPT actions and runtime secret retrieval.
Command
GPT automation:
deployments:create, deployments:read, deployments:logs, deployments:delete
Runtime secrets fetch:
secrets:read (or secrets:read:values if values are required)Command
curl -s "$NEXUS_API_BASE/gpt/deployments" \
-H "Authorization: Bearer $NEXUS_TOKEN"Command
curl -s "$NEXUS_API_BASE/secrets/runtime?includeValues=false" \
-H "Authorization: Bearer $NEXUS_TOKEN"Use OAuth for NexusAI as a ChatGPT App so each user connects with tenant-scoped identity.
Command
Authorization URL: https://nexusai.run/oauth/authorize
Token URL: https://nexusai.run/api/oauth/token
User info URL: https://nexusai.run/api/oauth/meCommand
OAUTH_CLIENT_ID=<chatgpt_client_id>
OAUTH_CLIENT_SECRET=<chatgpt_client_secret_optional_for_public_client>
OAUTH_REDIRECT_URIS=<comma-separated-allowed-callback-urls>
OAUTH_ISSUER=https://nexusai.run
OAUTH_SIGNING_SECRET=<strong-random-secret>Command
curl -s -X POST "https://nexusai.run/api/oauth/token" \
-H "Content-Type: application/json" \
-d '{
"grant_type":"authorization_code",
"client_id":"<client_id>",
"code":"<authorization_code>",
"redirect_uri":"<redirect_uri>",
"code_verifier":"<pkce_verifier_if_used>"
}'Command
curl -s "https://nexusai.run/api/oauth/me" \
-H "Authorization: Bearer <oauth_access_token>"Create and manage projects, then use the projectId for deployment APIs.
Command
curl -s -X POST "$NEXUS_API_BASE/projects" \
-H "Authorization: Bearer $NEXUS_JWT" \
-H "Content-Type: application/json" \
-d '{
"name": "my-api",
"description": "Customer API",
"framework": "Express",
"vaultEnvironment": "Development",
"repoUrl": "https://github.com/acme/my-api",
"gitBranch": "main"
}'Command
curl -s "$NEXUS_API_BASE/projects" -H "Authorization: Bearer $NEXUS_JWT"
curl -s "$NEXUS_API_BASE/projects/<projectId>" -H "Authorization: Bearer $NEXUS_JWT"Command
curl -s -X PUT "$NEXUS_API_BASE/projects/<projectId>" \
-H "Authorization: Bearer $NEXUS_JWT" \
-H "Content-Type: application/json" \
-d '{"gitBranch":"main","vaultEnvironment":"Staging"}'Use simple deploy, full deploy, logs, lifecycle actions, and redeploy templates.
Command
curl -s -X POST "$NEXUS_API_BASE/deployments" \
-H "Authorization: Bearer $NEXUS_JWT" \
-H "Content-Type: application/json" \
-d '{
"projectId":"<projectId>",
"name":"my-api-quick",
"code":"console.log(\"Hello NEXUS AI\")",
"framework":"node",
"deploymentProvider":"local-docker",
"envVars":{"NODE_ENV":"production"},
"healthCheckEnabled":true,
"healthCheckType":"tcp"
}'Command
curl -s -X POST "$NEXUS_API_BASE/deployments/full" \
-H "Authorization: Bearer $NEXUS_JWT" \
-F "projectId=<projectId>" \
-F "name=my-api-full" \
-F "sourceType=repo" \
-F "repoUrl=https://github.com/acme/my-api" \
-F "repoBranch=main" \
-F "deploymentProvider=gcp-cloud-run" \
-F "region=us-central1" \
-F "buildCommand=npm run build" \
-F "startCommand=npm run start" \
-F "outputDir=dist" \
-F "healthCheckEnabled=true" \
-F "healthCheckType=http" \
-F "healthCheckUrl=/health"Command
curl -s "$NEXUS_API_BASE/deployments" -H "Authorization: Bearer $NEXUS_JWT"
curl -s "$NEXUS_API_BASE/deployments/<deploymentId>" -H "Authorization: Bearer $NEXUS_JWT"
curl -s "$NEXUS_API_BASE/deployments/<deploymentId>/logs" -H "Authorization: Bearer $NEXUS_JWT"
curl -s -X POST "$NEXUS_API_BASE/deployments/<deploymentId>/stop" -H "Authorization: Bearer $NEXUS_JWT"
curl -s -X POST "$NEXUS_API_BASE/deployments/<deploymentId>/start" -H "Authorization: Bearer $NEXUS_JWT"
curl -s -X DELETE "$NEXUS_API_BASE/deployments/<deploymentId>" -H "Authorization: Bearer $NEXUS_JWT"Command
curl -s "$NEXUS_API_BASE/deployments/<deploymentId>/redeploy-template" \
-H "Authorization: Bearer $NEXUS_JWT"Connect the GitHub App, list repos, create bindings, and trigger manual deployments.
Command
curl -s "$NEXUS_API_BASE/github/install/start?format=json&redirectPath=/github" \
-H "Authorization: Bearer $NEXUS_JWT"Command
curl -s "$NEXUS_API_BASE/github/repos?installationId=<installationId>" \
-H "Authorization: Bearer $NEXUS_JWT"Command
curl -s -X POST "$NEXUS_API_BASE/github/bindings" \
-H "Authorization: Bearer $NEXUS_JWT" \
-H "Content-Type: application/json" \
-d '{
"installationId":"<installationId>",
"repoId":"123456789",
"owner":"acme",
"name":"my-api",
"fullName":"acme/my-api",
"defaultBranch":"main",
"allowedBranches":["main","prod"],
"autoDeploy":true,
"runtimeTarget":"cloudrun",
"servicePort":3000,
"buildMode":"auto"
}'Command
curl -s -X POST "$NEXUS_API_BASE/github/bindings/<bindingId>/deploy" \
-H "Authorization: Bearer $NEXUS_JWT" \
-H "Content-Type: application/json" \
-d '{"branch":"main"}'
curl -s "$NEXUS_API_BASE/github/deployments?page=1&limit=30" -H "Authorization: Bearer $NEXUS_JWT"
curl -s "$NEXUS_API_BASE/github/webhook-deliveries?page=1&limit=50" -H "Authorization: Bearer $NEXUS_JWT"Query and manage deployment-attached databases from the Databases tab APIs.
Command
curl -s "$NEXUS_API_BASE/deployments/<deploymentId>/databases" \
-H "Authorization: Bearer $NEXUS_JWT"
curl -s -X POST "$NEXUS_API_BASE/deployments/<deploymentId>/databases/<serviceId>/connection" \
-H "Authorization: Bearer $NEXUS_JWT" \
-H "Content-Type: application/json" \
-d '{"format":"uri"}'Command
curl -s "$NEXUS_API_BASE/deployments/<deploymentId>/databases/<serviceId>/browse/schema" \
-H "Authorization: Bearer $NEXUS_JWT"
curl -s -X POST "$NEXUS_API_BASE/deployments/<deploymentId>/databases/<serviceId>/browse/query" \
-H "Authorization: Bearer $NEXUS_JWT" \
-H "Content-Type: application/json" \
-d '{
"query":"SELECT * FROM users ORDER BY created_at DESC LIMIT 10",
"params":[]
}'Command
curl -s -X POST "$NEXUS_API_BASE/deployments/<deploymentId>/databases/<serviceId>/restart" -H "Authorization: Bearer $NEXUS_JWT"
curl -s -X POST "$NEXUS_API_BASE/deployments/<deploymentId>/databases/<serviceId>/rotate-credentials" -H "Authorization: Bearer $NEXUS_JWT"
curl -s "$NEXUS_API_BASE/deployments/<deploymentId>/databases/<serviceId>/metrics" -H "Authorization: Bearer $NEXUS_JWT"200/201/202: Request succeeded. 400: Invalid input or missing required fields. 401: Missing/invalid token. 403: Permission/scope blocked or account setup required. 404: Resource not found. 409: Duplicate/conflict (for example existing resource). 429: Rate limit reached. 500: Unexpected server error.
Some authenticated endpoints require verified email and payment setup. Example 403 payloads include: - code: EMAIL_NOT_VERIFIED - code: PAYMENT_METHOD_REQUIRED
Use this checklist: 1. Confirm base URL includes /api. 2. Confirm token type matches endpoint family (JWT vs nxk access token). 3. Confirm your role or token scopes allow the action. 4. Validate required fields exactly as expected by the endpoint. 5. Retry with curl -v to inspect headers and response body.
Command
curl -v -X POST "$NEXUS_API_BASE/deployments" \
-H "Authorization: Bearer $NEXUS_JWT" \
-H "Content-Type: application/json" \
-d '{"projectId":"...","name":"...","code":"..."}'Connect the GitHub App, bind repositories, and monitor automated deployments.
Install the NEXUS AI GitHub App and grant repository permissions.
Create deployment rules for a repository in your tenant.
Push events to allowed branches create deployments automatically.
The backend is missing GitHub App slug configuration. Fix: set GITHUB_APP_SLUG in backend environment variables (or set GITHUB_APP_NAME so the slug can be derived), then restart the backend.
This usually means the app slug or account access is wrong. Fix: verify the app exists at https://github.com/apps/<your-app-slug> and confirm you are signed into a GitHub account allowed to install that app.
Your GitHub App setup callback URL may be incorrect. Fix: set the GitHub App Setup URL to your backend callback endpoint, for example https://nexusai.run/api/github/install/callback. Do not use the OAuth login callback for app installation flow.
Most often, one of these conditions failed: repository not bound, branch not allowlisted, or auto-deploy disabled. Fix: review the Repo Binding and Webhook Deliveries tabs to confirm the exact ignore reason.
Tenant Owner and Admin roles can install the GitHub App, create bindings, and change deployment rules.
Developers can view deployment status and logs for bound repositories, and can trigger manual redeploy if enabled by your organization policy.
Deploy MySQL, PostgreSQL, MongoDB, and Redis alongside your app and manage them from Deployment Details.
Command
mysql:3306
postgresql:5432
mongodb:27017
redis:6379Command
MYSQL_HOST=mysql
POSTGRES_HOST=postgresql
MONGO_HOST=mongodb
REDIS_HOST=redisThis deployment was created without Additional Services enabled. Fix: create a new deployment and select MySQL, PostgreSQL, MongoDB, or Redis before deploying.
Additional Services are disabled for Cloud Run, App Runner, and Container Apps providers. Fix: use a managed external database for those providers, or use Local Docker provider for compose-based sidecar services.
Most connection issues are host/port mismatches or service startup timing. Fix: use the internal service hostname (for example mysql/postgresql/mongodb/redis) and default internal port, then confirm the deployment status is RUNNING.
NEXUS AI rotates credentials and recreates the service container with the new values. Fix: update your application credentials immediately and redeploy if your app caches old values.
Securely store API keys and connect cloud AI providers.
Add provider credentials once, then select them per project.
Deploy and manage containers from ChatGPT using NEXUS AI.
Use deployments:create, deployments:read, deployments:logs, deployments:delete for full GPT actions.
Command
Deploy nginx:latest on port 80 and name it my-nginx.
Upload this zip and deploy it as zip-app.
Deploy https://github.com/org/repo.git on main using secret github-token.
List my deployments and show the status of the most recent one.
Show the last 50 log lines for my latest deployment.
Destroy the deployment named my-nginx (confirm before deleting).Use repoSecretName with the Secrets Vault name that stores your repo token.
Upload a zip archive, then deploy with sourceType=zip and the uploadId returned by the upload call.
Use an access token that starts with nxk_. Ensure it was created in the same environment (local vs production).
Add deployments:read (and other GPT scopes) to the access token and try again.
Comprehensive MCP documentation for ChatGPT, Claude, and custom clients using OAuth-protected JSON-RPC on NEXUS AI.
NEXUS AI exposes MCP as an OAuth-protected HTTP JSON-RPC endpoint.
Command
MCP endpoint: https://api.zollo.live/mcp
Transport: HTTP JSON-RPC 2.0
Methods: ping, initialize, tools/list, tools/call
Notifications: notifications/initialized, notifications/cancelled
Protocol version: 2026-01-16Command
https://nexusai.run/.well-known/oauth-authorization-server
https://nexusai.run/.well-known/oauth-protected-resource/mcp
https://nexusai.run/.well-known/openid-configurationCommand
curl -i -X GET "https://api.zollo.live/mcp"
curl -i -X DELETE "https://api.zollo.live/mcp"Use this for no-code setup inside ChatGPT.
Command
https://api.zollo.live/mcpCommand
List my NEXUS AI deployments and show their status.Use standard authorization code flow with PKCE for public clients.
Command
curl -s -X POST "https://nexusai.run/register" \
-H "Content-Type: application/json" \
-d '{
"client_name":"my-mcp-client",
"redirect_uris":["https://example.com/callback"],
"token_endpoint_auth_method":"none",
"grant_types":["authorization_code","refresh_token"],
"response_types":["code"],
"scope":"deployments:read deployments:create deployments:logs deployments:delete"
}'Command
curl -s -X POST "https://nexusai.run/oauth/token" \
-H "Content-Type: application/json" \
-d '{
"grant_type":"authorization_code",
"client_id":"<client_id>",
"code":"<authorization_code>",
"redirect_uri":"https://example.com/callback",
"code_verifier":"<pkce_code_verifier>"
}'Command
curl -s "https://nexusai.run/oauth/me" \
-H "Authorization: Bearer <oauth_access_token>"Command
Authorization: Bearer <oauth_access_token>NEXUS AI also supports creating auth codes from a logged-in user session.
Command
curl -s -X POST "https://nexusai.run/oauth/authorize/code" \
-H "Authorization: Bearer <nexus_jwt>" \
-H "Content-Type: application/json" \
-d '{
"response_type":"code",
"client_id":"<client_id>",
"redirect_uri":"https://example.com/callback",
"scope":"deployments:read deployments:logs",
"code_challenge":"<pkce_code_challenge>",
"code_challenge_method":"S256",
"state":"state-123"
}'DCR endpoint validates redirect URIs and client metadata.
Use POST /register (or POST /api/oauth/register).
Command
https://nexusai.run/register
https://nexusai.run/api/oauth/registerRules: 1. At least one redirect URI is required. 2. Maximum 10 redirect URIs. 3. Each URI must be <= 2000 chars. 4. URI fragments (#...) are not allowed. 5. Must use https, except localhost/127.0.0.1 can use http for development.
Supported values are none, client_secret_post, and client_secret_basic. Public MCP clients should usually use none + PKCE.
Supported scopes are deployments:read, deployments:create, deployments:logs, deployments:delete.
Use these examples to test connectivity and tool execution.
Command
curl -s -X POST "https://api.zollo.live/mcp" \
-H "Authorization: Bearer <oauth_access_token>" \
-H "Content-Type: application/json" \
-d '{
"jsonrpc":"2.0",
"id":1,
"method":"initialize",
"params":{"protocolVersion":"2025-06-18"}
}'Command
curl -s -X POST "https://api.zollo.live/mcp" \
-H "Authorization: Bearer <oauth_access_token>" \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":2,"method":"tools/list"}'Command
curl -s -X POST "https://api.zollo.live/mcp" \
-H "Authorization: Bearer <oauth_access_token>" \
-H "Content-Type: application/json" \
-d '{
"jsonrpc":"2.0",
"id":3,
"method":"tools/call",
"params":{"name":"nexusai_whoami","arguments":{}}
}'Tool names are underscore-based and case-sensitive.
Command
nexusai_whoami
nexusai_projects_list
nexusai_providers_listCommand
nexusai_deploy_list
nexusai_deploy_status
nexusai_deploy_logs
nexusai_deploy_create
nexusai_deploy_source
nexusai_deploy_redeploy
nexusai_deploy_rollback
nexusai_deploy_stop
nexusai_deploy_start
nexusai_deploy_delete
nexusai_deploy_scale
nexusai_deploy_healthCommand
nexusai_secrets_list
nexusai_secrets_create
nexusai_secrets_update
nexusai_secrets_delete
nexusai_domains_add
nexusai_domains_list
nexusai_domains_verify
nexusai_domains_remove
nexusai_usage_statsEach tool checks OAuth scopes at call time.
Command
No scope required:
nexusai_whoami
deployments:read:
nexusai_projects_list, nexusai_providers_list, nexusai_deploy_list,
nexusai_deploy_status, nexusai_deploy_health, nexusai_secrets_list,
nexusai_domains_list, nexusai_usage_stats
deployments:logs:
nexusai_deploy_logs
deployments:create:
nexusai_deploy_create, nexusai_deploy_source, nexusai_deploy_redeploy,
nexusai_deploy_rollback, nexusai_deploy_stop, nexusai_deploy_start,
nexusai_deploy_scale, nexusai_secrets_create, nexusai_secrets_update,
nexusai_domains_add, nexusai_domains_verify
deployments:delete:
nexusai_deploy_delete, nexusai_secrets_delete, nexusai_domains_removeMost frequent arguments used in production MCP flows.
Command
required: image, port
optional: name, environment (DEVELOPMENT|STAGING|PRODUCTION),
envVars, provider, region, autoDestroyHours, requestIdCommand
required: repoUrl
optional: name, environment, repoBranch, repoSecretName, envVars,
provider, region, autoDestroyHours, requestId, framework, dockerfile,
buildCommand, startCommand, installCommand, outputDirCommand
required: deploymentId
optional: overrides {
name, displayName, provider, region, envVars, code, dockerfile, framework,
autoDestroyHours, healthCheckEnabled, healthCheckType, healthCheckUrl
}Command
deploy status/logs/start/stop/delete/health: deploymentId
deploy scale: deploymentId + replicas (1-10)
secret update/delete: secretId
domains add: deploymentId + domain
domains verify/remove: deploymentId + domainIdSet these environment variables for reliable external client integration.
Command
MCP_ORIGIN=https://api.example.com
OAUTH_ISSUER=https://api.example.com
OAUTH_SIGNING_SECRET=<strong-random-secret>
OAUTH_CLIENT_ID=<optional-static-client-id>
OAUTH_CLIENT_SECRET=<optional-static-client-secret>
OAUTH_REDIRECT_URIS=https://chat.openai.com/aip/callback,https://claude.ai/api/mcp/auth_callbackCommand
If client secret is not configured, PKCE is required.
redirect_uri must exactly match allowed client redirect URIs.
issuer/discovery/token signing must stay consistent across all backend nodes.Use an OAuth access token from /oauth/token, not a regular app JWT or nxk token. Confirm the request uses Authorization: Bearer <oauth_access_token>.
Check token_endpoint_auth_method for your registered client. If token_endpoint_auth_method is none, do not send client_secret and use PKCE.
The redirect_uri must exactly match one of the registered redirect_uris for that client.
Use the exact code_verifier pair that generated the code_challenge for that authorization request.
Request the required scopes during authorization and re-run the OAuth flow so the new token includes them.
Use exact tool names from tools/list. NEXUS AI tool names use underscores (for example nexusai_whoami), not dotted names.
Verify discovery issuer and JWT issuer are consistent. In self-hosted setups, align MCP_ORIGIN, OAUTH_ISSUER, and external domain/proxy configuration.
Role-based access control for projects, environments, and deployment providers.
NEXUS AI uses role-based access control (RBAC) to manage what users can do within an organization.
NEXUS AI provides six user roles with different permission levels: • Owner - Full control over the organization, projects, and all settings • Admin - Similar to Owner, can manage users and most settings • Deployment Manager - Can manage deployments across all environments • Member (Developer) - Can create projects and deploy to Development/Staging • Auditor - Read-only access for compliance and monitoring • Billing Manager - Manages billing and views usage data
Organization roles define what a user can do across the entire organization. Project-level permissions can further restrict or grant access to specific projects. For example, a Member can be granted access to deploy to Production for a specific project through the Team Management page.
Control which environments users can create projects in and deploy to.
Default environment permissions by role: • Owner / Admin / Super Admin Development, Staging, Production (full access) • Deployment Manager Development, Staging, Production (full access) • Member (Developer) Development, Staging only • Auditor Read-only (cannot create projects or deploy) • Billing Manager Read-only (cannot create projects or deploy) Members (Developers) cannot create projects in or deploy to Production by default. This protects production environments from unauthorized changes.
To grant Production access to a specific user: 1. Go to Team Management in the sidebar 2. Find the user and click the actions menu (three dots) 3. Select "Manage Permissions" 4. Check "Production" in the Allowed Environments section 5. Click "Save Permissions" This grants Production access only for projects the user is assigned to.
By default, Members can only create projects in Development and Staging environments. This is a security feature to prevent accidental production deployments. If you need Production access, ask your organization Owner or Admin to grant you permission via Team Management.
Control which cloud providers users can deploy to.
Default provider permissions by role: • Owner / Admin / Super Admin Local Docker, GCP Cloud Run, AWS App Runner, Azure Container Apps (all providers) • Deployment Manager Local Docker only (can be expanded via Team Management) • Member (Developer) Local Docker only • Auditor Read-only (cannot deploy) • Billing Manager Read-only (cannot deploy) Cloud providers (GCP Cloud Run, AWS App Runner, Azure Container Apps) require explicit permission for non-admin users.
To grant cloud provider access to a specific user: 1. Go to Team Management in the sidebar 2. Find the user and click the actions menu (three dots) 3. Select "Manage Permissions" 4. Check the desired providers (GCP Cloud Run, AWS App Runner, Azure Container Apps) 5. Click "Save Permissions" Note: Cloud provider access also depends on your organization's plan tier.
Complete overview of all permissions by role.
View Organization Owner: ✓ Admin: ✓ Deploy Mgr: ✓ Member: ✓ Auditor: ✓ Billing Mgr: ✓ Manage Organization Owner: ✓ Admin: ✓ Deploy Mgr: ✗ Member: ✗ Auditor: ✗ Billing Mgr: ✗ Manage Users Owner: ✓ Admin: ✓ Deploy Mgr: ✗ Member: ✗ Auditor: ✗ Billing Mgr: ✗ View Billing Owner: ✓ Admin: ✓ Deploy Mgr: ✗ Member: ✗ Auditor: ✗ Billing Mgr: ✓ Manage Billing Owner: ✓ Admin: ✗ Deploy Mgr: ✗ Member: ✗ Auditor: ✗ Billing Mgr: ✓ View Audit Logs Owner: ✓ Admin: ✓ Deploy Mgr: ✗ Member: ✗ Auditor: ✓ Billing Mgr: ✗ View Usage Owner: ✓ Admin: ✓ Deploy Mgr: ✗ Member: ✗ Auditor: ✓ Billing Mgr: ✓ Manage Secrets Owner: ✓ Admin: ✓ Deploy Mgr: ✓ Member: ✓ Auditor: ✗ Billing Mgr: ✗ Manage AI Providers Owner: ✓ Admin: ✓ Deploy Mgr: ✗ Member: ✗ Auditor: ✗ Billing Mgr: ✗ Manage Custom Domains Owner: ✓ Admin: ✓ Deploy Mgr: ✓ Member: ✗ Auditor: ✗ Billing Mgr: ✗
Create Projects Owner: ✓ Admin: ✓ Deploy Mgr: ✗ Member: ✓ Auditor: ✗ Billing Mgr: ✗ View Projects Owner: All Admin: All Deploy Mgr: Assigned Member: Assigned Auditor: All Billing Mgr: All Update Projects Owner: ✓ Admin: ✓ Deploy Mgr: ✗ Member: ✓ Auditor: ✗ Billing Mgr: ✗ Delete Projects Owner: ✓ Admin: ✓ Deploy Mgr: ✗ Member: ✗ Auditor: ✗ Billing Mgr: ✗ Manage Project Members Owner: ✓ Admin: ✓ Deploy Mgr: ✗ Member: ✗ Auditor: ✗ Billing Mgr: ✗ View Deployments Owner: ✓ Admin: ✓ Deploy Mgr: ✓ Member: ✓ Auditor: ✓ Billing Mgr: ✗ Create Deployments Owner: ✓ Admin: ✓ Deploy Mgr: ✓ Member: ✓ Auditor: ✗ Billing Mgr: ✗ Manage Deployments Owner: ✓ Admin: ✓ Deploy Mgr: ✓ Member: ✓ Auditor: ✗ Billing Mgr: ✗ View Deployment Logs Owner: ✓ Admin: ✓ Deploy Mgr: ✓ Member: ✓ Auditor: ✓ Billing Mgr: ✗ Legend: • "All" = Access to all projects in the organization • "Assigned" = Only projects where the user is explicitly added as a member
Project scope determines which projects a user can access: • All Projects: Owner, Admin, Auditor, and Billing Manager can see all projects in the organization. • Assigned Projects Only: Members and Deployment Managers can only see projects they have been explicitly added to. To add a user to a project, go to the project settings and add them as a project member.
Bring your own domain to production deployments.
Enable Cloud Run, App Runner, or Container Apps as deployment targets for your NEXUS AI.
Cloud Build builds images, Artifact Registry stores them, and Cloud Run runs them.
Command
gcloud services enable \
run.googleapis.com \
cloudbuild.googleapis.com \
artifactregistry.googleapis.com \
storage.googleapis.com \
logging.googleapis.comCommand
gcloud artifacts repositories create nexusai-deployments \
--repository-format=docker \
--location=us-central1Command
gsutil mb -l us-central1 gs://YOUR_UNIQUE_BUILD_BUCKET_NAMECommand
# Replace: PROJECT_ID, BACKEND_SA, PROJECT_NUMBER, BUCKET
gcloud projects add-iam-policy-binding PROJECT_ID \
--member=serviceAccount:BACKEND_SA \
--role=roles/run.admin
gcloud projects add-iam-policy-binding PROJECT_ID \
--member=serviceAccount:BACKEND_SA \
--role=roles/cloudbuild.builds.editor
gcloud projects add-iam-policy-binding PROJECT_ID \
--member=serviceAccount:BACKEND_SA \
--role=roles/logging.viewer
gsutil iam ch serviceAccount:BACKEND_SA:objectAdmin gs://BUCKET
gcloud projects add-iam-policy-binding PROJECT_ID \
--member=serviceAccount:[email protected] \
--role=roles/artifactregistry.writer
gsutil iam ch serviceAccount:[email protected]:objectViewer gs://BUCKETCodeBuild builds and pushes to ECR, and App Runner runs the service.
Command
aws ecr create-repository --repository-name nexusai-apps --region us-east-1Command
aws s3api create-bucket --bucket YOUR_UNIQUE_BUCKET_NAME --region us-east-1 --create-bucket-configuration LocationConstraint=us-east-1ACR Tasks builds and pushes images, and Container Apps runs the service.
Command
az login
az account set --subscription "YOUR_SUBSCRIPTION_ID"
az provider register --namespace Microsoft.App
az provider register --namespace Microsoft.ContainerRegistry
az provider register --namespace Microsoft.OperationalInsights
az provider register --namespace Microsoft.StorageCommand
RG_NAME="nexusai-core"
RG_LOCATION="eastus"
az group create --name "$RG_NAME" --location "$RG_LOCATION"
SUB_ID=$(az account show --query id -o tsv)
az ad sp create-for-rbac \
--name "nexusai-backend" \
--role Contributor \
--scopes "/subscriptions/$SUB_ID/resourceGroups/$RG_NAME" \
--query "{AZURE_CLIENT_ID:appId,AZURE_CLIENT_SECRET:password,AZURE_TENANT_ID:tenant}" \
-o table
echo "AZURE_SUBSCRIPTION_ID=$SUB_ID"Command
AZURE_TENANT_ID=...
AZURE_CLIENT_ID=...
AZURE_CLIENT_SECRET=...
AZURE_SUBSCRIPTION_ID=...
AZURE_DEFAULT_REGION=eastus
AZURE_RESOURCE_GROUP_PREFIX=nexusai
AZURE_ACR_NAME_PREFIX=nexusai
AZURE_ACR_REPO=nexusai-apps
AZURE_CONTAINERAPPS_ENV_PREFIX=nexusai
AZURE_LOG_ANALYTICS_WORKSPACE_PREFIX=nexusai
AZURE_STORAGE_ACCOUNT_PREFIX=nexusai
AZURE_STORAGE_CONTAINER=build-sourcesCommand
SUB_ID=YOUR_SUBSCRIPTION_ID
SP_APP_ID=YOUR_SERVICE_PRINCIPAL_APP_ID
az role assignment create --assignee "$SP_APP_ID" --role Contributor \
--scope "/subscriptions/$SUB_ID"Use this when deployments fail with `Microsoft.Resources/subscriptions/resourcegroups/write`.
Command
SUB_ID="YOUR_SUBSCRIPTION_ID"
RG_NAME="nexusai-shared"
SP_APP_ID="YOUR_AZURE_CLIENT_ID"Command
RG_LOCATION="eastus"
az group show --name "$RG_NAME" --subscription "$SUB_ID" >/dev/null 2>&1 || \
az group create --name "$RG_NAME" --location "$RG_LOCATION" --subscription "$SUB_ID"Command
az role assignment create \
--assignee "$SP_APP_ID" \
--role Contributor \
--scope "/subscriptions/$SUB_ID/resourceGroups/$RG_NAME"Command
az role assignment list \
--assignee "$SP_APP_ID" \
--scope "/subscriptions/$SUB_ID/resourceGroups/$RG_NAME" \
--include-inherited -o tableCommand
az role assignment create \
--assignee "$SP_APP_ID" \
--role Contributor \
--scope "/subscriptions/$SUB_ID"Common deployment validation errors, cloud permissions, and how to unblock yourself fast.
Dockerfile validation is enforced to keep deployments secure and predictable.
This means your Dockerfile violates a security policy (base image allowlist, blocked ports, or dangerous build patterns). Fix: check your base image prefix, EXPOSE ports, and avoid restricted patterns like piping remote scripts into a shell.
Issue: Your Dockerfile contains an `EXPOSE 25` instruction. In hardened environments, ports below 1024 are privileged and blocked by NEXUS AI deployments. Solution: Move the service to a non-privileged port (for example `2525` or `587`) and update your app configuration and Dockerfile accordingly.
Command
# Example (Postfix or SMTP-like service)
# Use a non-privileged port and update your service config accordingly.
ENV PORT=2525
EXPOSE 2525Ports below 1024 are considered privileged. NEXUS AI blocks privileged ports by default (common exceptions are 80 and 443). Fix: move your app to a non-privileged port like 3000 or 8080 and update your Dockerfile and app to listen on that port.
Ports associated with remote access protocols (SSH/Telnet/RDP/VNC) are blocked for safety. Fix: do not expose these ports. If you need admin access, use logs/metrics and application-level endpoints instead.
Issue: NEXUS AI enforces a base-image allowlist so builds start from trusted, maintained sources. The `postfix:` prefix is not on the approved list. Solution: Rebuild using an approved base image prefix and install the needed mail utilities through the package manager. Approved prefixes: node:, python:, nginx:, alpine:, ubuntu:, debian:, postgres:, redis:, mongo:, mysql:, httpd:, php:, ruby:, golang:, openjdk:, rust:, gcc:.
Command
# Example approach: start from Debian and install packages
FROM debian:bookworm-slim
RUN apt-get update && apt-get install -y --no-install-recommends postfix && rm -rf /var/lib/apt/lists/*
# Configure Postfix to listen on a non-privileged port (e.g., 2525) in your main.cf
EXPOSE 2525NEXUS AI only allows builds that start from approved base image prefixes. Fix: switch your Dockerfile `FROM` to an approved prefix such as `debian:`, `ubuntu:`, `alpine:`, `node:`, or `python:` and install what you need via the package manager.
Piping a remote script directly into a shell is a common supply-chain attack vector and is blocked. Fix: install packages using the OS package manager, pin versions where possible, and avoid remote script execution in Docker builds.
These options can allow container escape or host compromise and are blocked by policy. Fix: remove privileged flags and redesign the service to run without elevated host access.
Very large Dockerfiles or extremely high instruction counts can be used for resource exhaustion and are blocked. Fix: reduce layers, remove repeated RUN steps, and prefer package manager installs in fewer commands.
Mounting the Docker socket into a container can allow full host control and is treated as a container escape risk. Fix: remove Docker socket usage. If you need to build/run containers, use the platform's deployment workflow instead.
The validator detects secret-like values in Dockerfiles to prevent accidental credential leaks. Fix: remove secrets from Dockerfile and provide them at runtime using Secrets Vault and environment variables.
If you receive `DEPLOYMENT_FAILED` after a validation error, use this checklist:
Command
Error Message | Meaning | Action Item
------------------------------------- | ------------------------------------- | -------------------------------------------
Dockerfile validation failed | Configuration violates security policy | Check port numbers and base image prefixes
Base image ... is not allowed | Image source is untrusted | Switch to an approved prefix (ubuntu/alpine)
Exposing privileged port | Port is < 1024 | Move app to a port like 8080/3000/2525If your project strictly requires a base image or port that is not allowed by default, open a security review ticket with a clear business justification. Email: [email protected]
Most "service won't start" issues come down to the container port and startup behavior.
Your container must listen on the same port that Cloud Run routes traffic to. In NEXUS AI, the port is typically derived from your Dockerfile `EXPOSE` instruction (or defaults based on the generated Dockerfile). Fix: ensure your app listens on the exposed port and does not bind to localhost-only. Use 0.0.0.0 where applicable.
Cloud Run provides its own `PORT` environment variable and expects your app to bind to it. NEXUS AI also filters out user-provided `PORT` to avoid conflicts. Fix: update your app to read the `PORT` variable at runtime OR explicitly `EXPOSE` the correct port and configure your server to bind to that port.
DNS and SSL are the most common sources of custom domain issues.
Common causes: DNS propagation delay, wrong record name (host), or a conflicting existing record. Fix: confirm the exact record name/value from the UI and verify it from multiple resolvers.
Command
# Example checks
dig CNAME app.example.com +short
dig TXT example.com +short
dig A example.com +shortWhen Cloudflare proxy is enabled, DNS responses and TLS termination can differ from what NEXUS AI expects for verification and certificate issuance. Fix: disable proxy (set the record to DNS-only) during verification and certificate issuance.
Certificate issuance can lag behind DNS verification, especially right after a DNS change. Fix: wait a few minutes and re-check. If it persists, verify there are no restrictive CAA records blocking Let's Encrypt.
CAA records can restrict which certificate authorities are allowed to issue certificates for your domain. Fix: ensure your CAA records allow Let's Encrypt (or remove restrictive CAA records).
Command
dig CAA example.com +shortMany DNS providers do not allow CNAME records at the root/apex (`example.com`). Fix: use the platform's apex-domain flow (A + TXT) or use a provider feature like ALIAS/ANAME if supported.
DNS and browser caches can keep old values temporarily. Fix: verify with `dig` from your terminal, wait for TTL expiry, and try an incognito window or flush DNS cache.
Most Cloud Run issues are IAM permissions or service accessibility.
This means the service account running NEXUS AI does not have enough IAM permissions in your GCP project (or the service account does not exist). Fix: grant the required roles to the backend service account. Replace `PROJECT_ID` and `BACKEND_SA`.
Command
PROJECT_ID="your-project-id"
BACKEND_SA="[email protected]"
gcloud projects add-iam-policy-binding "$PROJECT_ID" \
--member="serviceAccount:$BACKEND_SA" \
--role="roles/cloudbuild.builds.editor"
gcloud projects add-iam-policy-binding "$PROJECT_ID" \
--member="serviceAccount:$BACKEND_SA" \
--role="roles/run.admin"
gcloud projects add-iam-policy-binding "$PROJECT_ID" \
--member="serviceAccount:$BACKEND_SA" \
--role="roles/storage.admin"
gcloud projects add-iam-policy-binding "$PROJECT_ID" \
--member="serviceAccount:$BACKEND_SA" \
--role="roles/iam.serviceAccountUser"
gcloud projects add-iam-policy-binding "$PROJECT_ID" \
--member="serviceAccount:$BACKEND_SA" \
--role="roles/artifactregistry.writer"Use the build ID shown in the deployment logs and fetch logs from Cloud Build.
Command
gcloud builds log BUILD_ID --project=PROJECT_IDThe default Cloud Build service account uses the project number: `[email protected]`
Command
gcloud projects describe PROJECT_ID --format="value(projectNumber)"Most commonly, the Cloud Build service account is missing Artifact Registry write permission. Fix: grant `roles/artifactregistry.writer` to `[email protected]` in the same project/region as your repo.
A frequent cause is a mismatch between: - Artifact Registry repo name/region - `GCP_ARTIFACT_REGISTRY_HOST` (should be `REGION-docker.pkg.dev`, no `https://`) Fix: confirm the repo exists and the host matches its region.
There are two identities involved: - The backend runtime service account (creates builds, reads logs, uploads source archives). - The Cloud Build service account (executes the build and pushes images). Fix: grant roles to the correct identity. A common miss is Artifact Registry write access for the Cloud Build service account and bucket read access for the build source archive.
Check that your service has a ready revision and that it is publicly invokable (or that you have authentication configured correctly).
Command
gcloud run services describe SERVICE_NAME \
--region=us-central1 \
--project=PROJECT_ID \
--format="value(status.latestReadyRevisionName,status.latestCreatedRevisionName)"
# Check if the service is public (allUsers has roles/run.invoker)
gcloud run services get-iam-policy SERVICE_NAME \
--region=us-central1 \
--project=PROJECT_IDList repositories in Artifact Registry for your project and confirm the repo/region match your backend configuration.
Command
gcloud artifacts repositories list --project=PROJECT_IDNEXUS AI does not support Cloud Run custom domains in-app yet, but you can configure it directly using Cloud Run domain mapping. 1) Create the mapping 2) Add the DNS records returned by the mapping status 3) Wait for the certificate to become ready
Command
gcloud config set project PROJECT_ID
gcloud run domain-mappings create \
--service SERVICE_NAME \
--domain app.example.com \
--region us-central1
gcloud run domain-mappings describe app.example.com \
--region us-central1 \
--format="yaml(status.resourceRecords)"Most App Runner issues are ECR/CodeBuild/IAM configuration or container startup behavior.
Check that: - CodeBuild can read the S3 source archive bucket. - CodeBuild can authenticate to ECR and push images. - App Runner can pull from ECR (service role permissions).
When AWS needs to attach a role to CodeBuild or App Runner, the caller must have permission to pass that role. Fix: ensure the IAM identity used by the backend has `iam:PassRole` for the specific role ARNs you are using.
List repositories and verify the expected repo is present in the region you configured.
Command
aws ecr describe-repositories --region us-east-1Build logs are typically in CodeBuild (CloudWatch Logs). Runtime logs are in App Runner (CloudWatch Logs). Fix: open the related CodeBuild project and App Runner service in AWS Console and inspect CloudWatch logs.
In `us-east-1`, S3 bucket creation differs slightly from other regions and LocationConstraint can cause errors depending on the command used. Fix: for us-east-1, create the bucket without the LocationConstraint field.
Command
aws s3api create-bucket --bucket YOUR_UNIQUE_BUCKET_NAME --region us-east-1Most Azure deployment issues are permissions, ACR builds (Tasks), or Log Analytics setup.
Error (rewritten): Azure is blocking ACR Tasks for your Container Registry, so the platform cannot run the registry-side build step (ACR Tasks). This is not a Dockerfile validation issue—your Azure subscription/tenant/registry configuration is rejecting task requests. Fix options: 1) Check the registry SKU and upgrade if needed (Standard/Premium recommended). 2) Check for Azure Policy restrictions blocking ACR Tasks in your subscription. 3) If required, open an Azure Support request to allow ACR Tasks for the registry: http://aka.ms/azuresupport
Command
# Check ACR SKU
az acr show -n REGISTRY_NAME --query sku.name -o tsv
# Upgrade SKU (example: Standard)
az acr update -n REGISTRY_NAME --sku StandardEnsure the backend service principal has Contributor on the Resource Group. Confirm `AZURE_TENANT_ID`, `AZURE_CLIENT_ID`, `AZURE_CLIENT_SECRET`, and `AZURE_SUBSCRIPTION_ID` are correct.
The Azure service principal used by NEXUS AI does not have enough RBAC permissions on the target resource group (or subscription). Fix: grant Contributor on the target resource group for shared-RG mode, or Contributor on the subscription for per-project RG mode. Then wait for IAM propagation and retry deployment.
Command
SUB_ID="YOUR_SUBSCRIPTION_ID"
RG_NAME="nexusai-shared"
SP_APP_ID="YOUR_AZURE_CLIENT_ID"
RG_LOCATION="eastus"
az group show --name "$RG_NAME" --subscription "$SUB_ID" >/dev/null 2>&1 || \
az group create --name "$RG_NAME" --location "$RG_LOCATION" --subscription "$SUB_ID"
az role assignment create \
--assignee "$SP_APP_ID" \
--role Contributor \
--scope "/subscriptions/$SUB_ID/resourceGroups/$RG_NAME"
az role assignment list \
--assignee "$SP_APP_ID" \
--scope "/subscriptions/$SUB_ID/resourceGroups/$RG_NAME" \
--include-inherited -o tableContainer Apps logs are streamed via Log Analytics. Fix: verify the Log Analytics workspace exists and is attached to the Container Apps environment.
Confirm the ACR registry exists and the image tag was pushed by the ACR Task. Check that the Container App registry settings reference the correct login server.
Keys are encrypted at rest. Keep your encryption key stable.
Provider API keys stored by NEXUS AI are encrypted using `ENCRYPTION_KEY`. If you change it, previously stored encrypted values can't be decrypted anymore. Fix: restore the original `ENCRYPTION_KEY` OR re-save your provider credentials and secrets after changing it.
Plan limits affect AI requests and deployments.
Your organization hit its monthly AI request limit for the current plan tier. Fix: upgrade your plan or wait for the monthly quota reset.
Your organization may have reached the concurrent deployment limit (running/building deployments). Fix: stop unused deployments or upgrade your plan limits.
Deployments can auto-stop due to plan max runtime (or an auto-destroy setting) to control cost and resource usage. Fix: increase allowed runtime on your plan (if available) or redeploy when needed.
Request quota limits the number of generation calls you can make. Token usage measures the size of prompts and outputs (and impacts cost). Fix: if you hit request quota, upgrade or wait for reset. If costs are high, reduce max tokens and use smaller models.
Connect your own Postgres, Supabase, or any external database. Run safe SQL, inspect schema, and let AI fix deployment errors automatically.
Supabase runs on PostgreSQL. Use the Session Pooler for best compatibility with NEXUS AI short-lived connections.
Command
Host: aws-0-us-east-1.pooler.supabase.com
Port: 5432
Database: postgres
Username: postgres.<your-project-ref>
Password: <your-database-password>
SSL mode: requireCommand
POST /api/db-sources
Authorization: Bearer <token>
{
"name": "my-supabase",
"host": "aws-0-us-east-1.pooler.supabase.com",
"port": 5432,
"dbName": "postgres",
"username": "postgres.abcdefghijklmnop",
"password": "<db-password>",
"sslMode": "require",
"engine": "POSTGRESQL"
}Command
Direct connection port 5432 — long-lived, migrations, admin tasks
Session pooler port 5432 — recommended for NEXUS AI
Transaction pooler port 6543 — ultra-short-lived (pgBouncer, limited SET support)Command
POST /api/db-sources/<id>/query
{
"sql": "SELECT id, email FROM users LIMIT 10",
"mode": "preview"
}Command
POST /api/db-sources/<id>/query
{
"sql": "UPDATE users SET status = 'active' WHERE id = 'abc'",
"mode": "execute",
"confirmed": true
}Command
GET /api/db-sources/<id>/schemaPaste a deployment log containing database errors. NEXUS AI extracts the error, inspects the live schema, and proposes a DDL fix.
Command
POST /api/db-sources/<id>/propose-fix
{
"logSnippet": "ERROR: relation \"profiles\" does not exist\nLINE 1: SELECT * FROM profiles WHERE user_id = $1",
"deploymentId": "<optional-deployment-id>"
}Command
{
"proposedSql": "CREATE TABLE profiles (id UUID PRIMARY KEY, user_id UUID NOT NULL, ...);",
"explanation": "The profiles table is missing. This creates it with a user_id foreign key.",
"riskLevel": "LOW"
}Command
POST /api/db-fix-proposals/<proposalId>/apply
{ "dbSourceId": "<id>" }Command
nexusai_db_source_list — list all registered DB sources
nexusai_db_source_connect — register a new external DB
nexusai_db_source_delete — remove a DB source
nexusai_db_inspect_schema — get full schema graph
nexusai_db_query_preview — dry-run a SQL query
nexusai_db_query_execute — run SQL (confirmed=true for writes)
nexusai_db_propose_fix — analyze logs → propose DDL
nexusai_db_apply_fix — apply a reviewed fix proposalCommand
DROP DATABASE
ALTER ROLE / CREATE ROLE
CREATE EXTENSION
COPY ... PROGRAM
pg_read_file, pg_ls_dir, pg_exec
Multi-statement SQL (more than one statement per request)
DELETE or UPDATE without a WHERE clauseMost likely cause: wrong port or username format. Fix: In Supabase Project Settings → Database → Connection string, set the "Connection pooler" dropdown to "Session pooler". Use the Host and Port shown there (port 5432) with username format postgres.<project-ref>.
PgBouncer in transaction mode blocks certain SET commands outside a transaction. Fix: NEXUS AI uses SET LOCAL inside the transaction, which pgBouncer allows. If you see this error on a custom query, avoid session-level SET commands in your SQL.
The safety service rejected the statement before it reached the database. Fix: check the reasons field in the response. Common causes are: DELETE/UPDATE without WHERE, blocked keywords (DROP DATABASE, pg_exec), or multiple statements separated by semicolons.
The connected user may not have access to the public schema, or your tables are in a different schema. Fix: grant SELECT on information_schema to the connecting user, or ensure tables are in the public schema. Supabase users should use the postgres superuser or a role with schema access.
The AI proposal is validated through the SQL safety layer before being stored. If it fails, the endpoint returns an error instead of a bad proposal. Fix: provide more context in the logSnippet (include the full stack trace and error line). You can also manually write the DDL and execute it via /query with confirmed: true.
Deploy, manage, and automate everything from your terminal using the nexus command-line interface.
Command
npm i nexusapp-cliCommand
npx nexusapp-cli auth loginCommand
nexus --version
nexus --helpThe CLI uses browser-based login (like GitHub CLI) to obtain a persistent access token.
Command
nexus auth loginCommand
nexus auth login --api-url http://localhost:3001 --web-url http://localhost:3002Command
nexus auth login --token nxk_abc123...Command
nexus auth whoamiCommand
nexus auth logoutCommand
export NEXUSAI_TOKEN=nxk_your_token_here
export NEXUSAI_API_URL=https://nexusai.run
nexus deploy listUse nexus deploy create to deploy any pre-built container image.
Command
nexus deploy create --image nginx:latest --port 80 --name my-site --provider dockerCommand
nexus deploy create \
--image node:20-alpine \
--port 3000 \
--name api-prod \
--provider gcp_cloud_run \
--env NODE_ENV=production \
--env PORT=3000 \
--waitUse nexus deploy source to build and deploy directly from a repo — no Dockerfile required.
Command
nexus deploy source --repo https://github.com/you/app --name my-app --waitCommand
nexus deploy source \
--repo https://github.com/you/api \
--branch main \
--framework node \
--install-command "npm ci" \
--build-command "npm run build" \
--start-command "node dist/index.js" \
--environment PRODUCTION \
--waitCommand
# First store the token as a secret
nexus secret create --name GITHUB_TOKEN --environment production
# Then deploy referencing that secret
nexus deploy source \
--repo https://github.com/you/private-app \
--repo-secret GITHUB_TOKEN \
--waitCommand
nexus deploy source \
--repo https://github.com/you/app \
--branch feature/new-ui \
--environment STAGING \
--auto-destroy 4 \
--waitAll commands accept a deployment name or UUID interchangeably.
Command
nexus deploy list
nexus deploy list --status RUNNING
nexus deploy list --project <project-id>Command
nexus deploy get my-appCommand
nexus deploy status my-app --watchCommand
nexus deploy logs my-app --follow
nexus deploy logs my-app --type build --lines 200Command
nexus deploy stop my-app
nexus deploy start my-app
nexus deploy delete my-app --yesCommand
nexus deploy scale my-app 3Command
nexus deploy redeploy my-app --waitCommand
nexus deploy rollback my-app
# Roll back to a specific prior deployment:
nexus deploy rollback my-app --target <old-deployment-id>Command
nexus secret list
nexus secret list --environment productionCommand
nexus secret create --name DATABASE_URL --environment production
# or inline (not recommended — stays in shell history):
nexus secret create --name API_KEY --environment staging --value "sk-abc123"Command
nexus secret update <secret-id>Command
nexus secret delete <secret-id> --yesCommand
nexus project listCommand
nexus project create --name "Backend API"Command
nexus project delete <project-id> --yesCommand
nexus domain add my-app api.example.comCommand
# List domains to get the domain ID
nexus domain list my-app
# Verify (DNS changes can take up to 48h)
nexus domain verify my-app <domain-id>Command
nexus domain remove my-app <domain-id>Use NEXUSAI_TOKEN and NEXUSAI_API_URL environment variables for non-interactive pipeline use.
Command
name: Deploy to NEXUS AI
on:
push:
branches: [main]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install NEXUS AI CLI
run: npm install -g nexusapp-cli
- name: Deploy
env:
NEXUSAI_TOKEN: ${{ secrets.NEXUSAI_TOKEN }}
NEXUSAI_API_URL: https://nexusai.run
run: |
nexus deploy source \
--repo ${{ github.repositoryUrl }} \
--branch ${{ github.ref_name }} \
--name my-app \
--environment PRODUCTION \
--waitCommand
- name: Build and push image
run: |
docker build -t myregistry/app:${{ github.sha }} .
docker push myregistry/app:${{ github.sha }}
- name: Deploy to NEXUS AI
env:
NEXUSAI_TOKEN: ${{ secrets.NEXUSAI_TOKEN }}
run: |
nexus deploy create \
--image myregistry/app:${{ github.sha }} \
--port 8080 \
--name api-prod \
--provider gcp_cloud_run \
--waitAfter login, credentials are saved to ~/.nexusai/config.json with mode 0600 (owner read/write only). The file contains apiUrl, token, and tokenId.
Command
cat ~/.nexusai/config.jsonNEXUSAI_TOKEN overrides the saved token (useful in CI/CD). NEXUSAI_API_URL overrides the saved API base URL. NEXUSAI_WEB_URL overrides the frontend URL used during browser login.
Command
NEXUSAI_TOKEN=nxk_... NEXUSAI_API_URL=https://nexusai.run nexus deploy listEvery read command supports --json to output raw API data, making it easy to pipe into jq or other tools.
Command
nexus deploy list --json | jq '.[] | {name, status, url}'Pass --yes to any destructive command (stop, delete, rollback, redeploy, domain remove) to skip the interactive confirmation.
Command
nexus deploy delete old-app --yes
nexus deploy stop my-app --yesThe CLI cannot connect to the API. Check the API URL in your config or set NEXUSAI_API_URL to the correct address.
Command
cat ~/.nexusai/config.json
# Fix:
nexus auth login --api-url http://localhost:3001 --web-url http://localhost:3002Your access token was revoked or expired. Log in again to get a fresh token.
Command
nexus auth logout
nexus auth loginThe token was created with the wrong scopes. Log out and back in — the browser auth page now creates tokens with all required scopes automatically.
Command
nexus auth logout
nexus auth loginThe name does not match any deployment in your organization. Run nexus deploy list to see all deployment names and IDs.
Command
nexus deploy listImages must include a tag (e.g. nginx:latest, not nginx). Allowed base images: node:, python:, nginx:, alpine:, ubuntu:, debian:, postgres:, redis:, mongo:, mysql:, httpd:, php:, ruby:, golang:, rust:, gcc:.
Command
# Wrong:
nexus deploy create --image nginx --port 80
# Correct:
nexus deploy create --image nginx:latest --port 80Generate & deploy with AI using cloud-agnostic runtime and enterprise-grade orchestration.
Get started today
Deploy your first app in minutes. No DevOps team required. Full AI observability from day one.
No credit card required · Free tier available