---
title: Deploy
description: Put the built directory on any static host — there is no Reed runtime.
---

Deployment is a file copy. Upload the contents of your `--out` directory to any static
host: Cloudflare Pages, Netlify, Vercel, S3 behind a CDN, GitHub Pages, or an nginx
root. There is no Reed-specific deploy step, because there is nothing of Reed's left to
run.

## Tell the site its own address

A Reed site does not know where it will live until you say so. Set `site` to the
absolute origin, with no path:

```json
{ "site": "https://docs.example.com" }
```

That one field is what turns on `sitemap-index.xml`, `robots.txt`, and absolute URLs in
`llms.txt`. Leave it unset and those outputs are simply not written — Reed will not
invent an origin for you.

## Mounting under a path

If the site lives under a path rather than at the origin root, set `base`:

```json
{ "site": "https://example.com", "base": "/docs" }
```

Every internal link and asset reference is then emitted with the `/docs` prefix — but
**the built files still sit at the root of your output directory**. The mount path has
to physically exist in the tree you serve:

```
served-root/
  docs/          ← the contents of dist/
    index.html
  _headers       ← stays at the root
```

Point a host's asset directory straight at `dist/` on a site with `base: "/docs"` and
every URL 404s while the deploy reports success. This is the single most common
`base`-related failure. If your host serves the directory verbatim, stage the tree first
— create the mount directory and copy `dist/` into it.

`_headers` is the exception that stays at the root: hosts read it from the top of the
served directory, and its rules match served URL paths.

## Verify the deploy, not the exit code

A deploy command exiting zero does not mean the new build is live — CDNs cache, and a
misconfigured asset directory reports success while serving nothing. Fetch a page from
the live origin and check that a string from this build is present:

```sh
curl -s https://docs.example.com/ | grep -c "a phrase you just added"
```

Checking that the new string is there is worth more than checking that the old one is
gone — a stale cache satisfies neither, but only the first tells you which build you are
looking at.
