# Deploying a website

Take a site from your project to a live URL — and connect your own domain — in a few minutes.

Canonical page: https://themachine.myapps.ai/docs/guides/deploying-a-website

Machine can deploy a website straight from your project: it builds your source,
ships it to Vercel, and gives you a live URL. This guide walks the whole path,
including connecting a custom domain.

For the manifest file itself, see the [Manifest reference](/docs/project/manifest).
To publish a folder from Machine Desktop instead, see
[Deployments](/docs/desktop/deployments).

> **Turn on Apps first**
> Website deploys are an experimental feature called **Apps**. Until it is on
> for the project, the Apps panel says "Apps is an experimental feature". A
> project manager switches it on under the project's **Settings →
> Experimental**.

## Deploy your first app

### Declare the app

Add an entry under `apps` in your project's manifest. At minimum, point it at
the source and tell it how to build. In `kortix.yaml`:

```yaml
apps:
- slug: marketing
name: Marketing site
source:
type: git          # deploy from this project's repo
branch: main
root_path: apps/site   # the folder to build, if not the repo root
build:
command: pnpm build
out_dir: dist
```

A project on the older `kortix.toml` uses the same fields as an `[[apps]]`
table:

```toml
[[apps]]
slug = "marketing"
name = "Marketing site"

[apps.source]
type      = "git"
branch    = "main"
root_path = "apps/site"

[apps.build]
command = "pnpm build"
out_dir = "dist"
```

Prefer the dashboard? Click **Apps** in the project sidebar, then **Add app**.
The form writes the same entry to your manifest. Besides a **Git repository**,
it can deploy a **Folder in a session** (a folder an agent built in a session's
sandbox) or a **Prebuilt tarball**.

### Deploy

Save the manifest. Machine checks every project's apps continuously and
deploys a new or changed entry automatically, usually within seconds — or click **Deploy** on the
app's card in the Apps panel to ship it now.

The status moves through `building` → `deploying` → `active`. If a build
fails, the card shows the error, and **Logs** shows the build output.

### Open your live URL

Once the deploy is `active`, the card shows a stable `*.vercel.app` URL. Click
it; your site is live. Share it as-is, or connect your own domain next.

## Connect a custom domain

### Add the domain

List the domains you own under `domains`, or type them into **Domains** in the
app's form, one per line:

```yaml
apps:
- slug: marketing
domains:
- example.com
- www.example.com
```

Machine attaches each domain to the deployment on the next deploy.

### Point DNS at Vercel

Add the records at your DNS provider (the registrar or DNS host for the
domain):

- **Apex domains** like `example.com` → `A` records with Vercel's IP addresses.
- **Subdomains** like `www.example.com` or `docs.example.com` → a `CNAME`,
usually `cname.vercel-dns.com`.

Your DNS provider's help pages explain where to add records.

### Wait for it to verify

DNS changes can take anywhere from a minute to a few hours to propagate. Once
the records resolve, the domain starts serving your site.

> **Warn**
> **Domain not serving?** That almost always means the DNS records haven't
> propagated yet, or they don't exactly match what Vercel expects.
> Double-check the type, name, and value, remove any conflicting old
> `A`/`CNAME` records for the same name, and give it time.

## Redeploy and roll forward

Apps redeploy automatically whenever their manifest entry changes — an edit to
the build command, the domains, or an env var. To redeploy without changing
anything, use **Redeploy** on the card. The current version keeps serving until
the new build is ready. **Stop** takes an app offline; turning an entry off in
the manifest does not stop a running deployment by itself.

## Multiple apps

A project can declare as many apps as you need — a marketing site, a docs site,
and a dashboard side by side, each with its own source, build, domains, and
environment. They appear together in the Apps panel.

> **Environment variables aren't secret**
> Values under an app's `env` are stored in the manifest as plain text, in your
> repository. Don't put passwords or API keys there. Project
> [secrets](/docs/project/secrets) go to agents in sessions, not to app builds.

---

**Related:** [Manifest reference](/docs/project/manifest) ·
[Deployments in Machine Desktop](/docs/desktop/deployments).
