MachineMachine
SDK

Apps

Deploy a project's websites to Vercel from the manifest, the CLI, or the SDK.

An App is a website your project deploys to Vercel. Each App is an entry in the apps list of the project manifest (kortix.yaml, or kortix.toml on older projects), addressed by its slug. An App has a source, an optional build, optional custom domains, and env vars. With no custom domain, the App uses the *.vercel.app URL Vercel assigns.

Apps is an experimental feature and off by default. A project manager turns it on under Settings → Experimental → Apps. Until then, every Apps route answers 404 with a message that Apps are disabled for the project.

Declare an App

yaml
apps:
  - slug: marketing
    name: Marketing site
    source:
      type: git
      root_path: site
    build:
      command: npm run build
      out_dir: dist
    domains: [www.example.com]
    env:
      PUBLIC_API_URL: https://api.example.com
FieldWhat it holds
slugRequired. Lowercase letters, digits, dashes, and underscores. Unique in the project.
nameDisplay name. Defaults to the slug.
enabledDefault true. Enabled Apps are redeployed automatically when their entry changes.
sourceRequired. type: git builds from a repo on every deploy: repo (default: this project's repo), branch, and root_path. type: tar deploys a tarball from url.
buildOptional command and out_dir.
frameworkOptional build framework hint. Blank auto-detects.
domainsOptional custom domains.
envOptional env vars for the deployed site, as string values.

Machine sweeps Apps continuously: it starts a new pass as soon as the previous one finishes, comparing each enabled App's deploy settings with its latest deployment and redeploying the ones that changed or were never deployed. A change usually starts deploying within seconds. Disabling an App does not take it down; stop it explicitly.

Deploy from the CLI

machine apps manages Apps from your computer. Inside a session sandbox the same commands run as kortix apps.

bash
machine apps deploy ./site --app marketing
machine apps ls
machine apps logs marketing
CommandEffect
machine apps listList Apps and their latest deployment. Alias: ls.
machine apps show <slug>Show one App.
machine apps deploy [path]Publish a folder and deploy it. The folder is tarred locally, honoring .gitignore, .dockerignore, and .kortixignore. --app <slug> picks the App (default: the folder name). --from-repo <folder> archives a folder of the project repo instead. --git deploys from the repo on every deploy instead of a snapshot.
machine apps create <slug>Create an App without deploying it.
machine apps set <slug>Change an App. Only the flags you pass are sent.
machine apps logs <slug>Read the latest deployment's logs.
machine apps stop <slug>Take the current deployment out of service.
machine apps delete <slug> [--yes]Remove the App from the manifest.

create, set, and deploy accept --name, --domain (repeatable), --env KEY=VALUE (repeatable), --framework, --build-command, --out-dir, --repo, --branch, --root, --tar-url, and --enabled or --disabled. Every command accepts --project, --host, and --json.

Deploy from the SDK

Import the App functions from the root @kortix/sdk. Each takes the project id first and works on Apps by slug.

typescript
import { createProjectApp, deployProjectApp, listProjectApps } from '@kortix/sdk';

await createProjectApp(projectId, {
  slug: 'marketing',
  source: { type: 'git', repo: null, branch: null, root_path: 'site' },
  build: { command: 'npm run build', out_dir: 'dist' },
});

const result = await deployProjectApp(projectId, 'marketing');
console.log(result.status, result.deployment?.live_url);

const { apps, errors } = await listProjectApps(projectId);
functionwhat
listProjectApps(projectId)every App with its latest deployment, plus errors for manifest entries that do not parse
createProjectApp(projectId, input) · updateProjectApp(projectId, slug, input)add · change an App's manifest entry
deleteProjectApp(projectId, slug)remove an App from the manifest
deployProjectApp(projectId, slug)deploy now; status is active or failed
stopProjectApp(projectId, slug)take the current deployment out of service
getProjectAppLogs(projectId, slug)the latest deployment's logs
archiveProjectFolder(...)archive a folder of the project repo as a tar source
listSessionAppFolders(...) · archiveSessionAppFolder(...)list · archive a folder from a running session's sandbox as a tar source

A deployment's status is one of pending, building, deploying, active, failed, or stopped. live_url holds the deployed URL.

The kortix.project(id).apps facade (apps.create, apps.deployments.create, apps.access, and the rest) targets an older sandbox-hosted Apps API that the server no longer serves. Its calls fail or return the wrong shape. Use the root functions above.

See Deploying a website for a walkthrough.

On this page