# Get started

Install the nesly CLI, deploy your first project and put it on your own domain.

## 1\. Install the CLI

macOS and Linux, with Homebrew:

```
brew install neslyhq/tap/nesly
```

Or download a release binary from [GitHub releases](https://github.com/neslyhq/platform/releases) and put it on your `PATH`.

Check it:

```
nesly --version
```

## 2\. Sign in

```
nesly login
```

The CLI prints a URL and a code; approve it in the browser. The token is stored in your user config directory, and `nesly whoami` shows who you are signed in as. Don't have an account yet? Create one at [console.nesly.net](https://console.nesly.net).

## 3\. Deploy

From your project directory:

```
cd my-app
nesly deploy --yes
```

The first run creates a project named after the directory, links this working copy to it (`.nesly/project.json`), builds your code and prints the live URL. After that, `nesly deploy` is enough.

What gets built:

-   A **Dockerfile** in the project root wins — we build exactly what it says.
-   A **frontend** (Vite, React, Astro, SvelteKit, Angular, Next.js…) is installed with your lockfile's package manager, built, and served as static files.
-   A **static site generator** outside the Node world (Hugo, Jekyll, MkDocs) is built with its own toolchain and served as static files.
-   Otherwise the stack is detected automatically (Node.js, Python, Go, .NET, Ruby, PHP, Java…) and run as a container.
-   A directory of static files with no server entry point is served as it is.

Nothing to configure for the common cases. When you need to say it yourself — a monorepo, a custom build command, a different output directory — see [builds](/docs/builds/).

Your app must listen on the port given in `PORT` and bind `0.0.0.0`, not `localhost`.

## 4\. Environment variables

```
nesly env set API_KEY=... STRIPE_KEY=...
nesly env ls
nesly env rm API_KEY
```

Changes apply to the _next_ deployment — running instances are never mutated in place. Deploy again to pick them up.

`.env` files are never uploaded, and neither is anything your `.gitignore` excludes.

Values are encrypted before they are written down (AES-256-GCM), and only ever decrypted to hand to your build and your running app. A viewer on your team can see that a variable exists, never what is in it.

## 5\. Add a database

```
nesly addon add postgres
nesly addon add mssql
```

You get your own database and user; `DATABASE_URL` is injected into the project. No other customer can reach it. Deploy again so your app sees the variable.

**mssql** (SQL Server Express, 10 GB per database) also injects `ConnectionStrings__Default` — a .NET app reads it with `GetConnectionString("Default")`, no configuration code at all.

## 6\. Your own domain

```
nesly domain add app.example.com
nesly domain verify app.example.com
```

The first command prints the DNS records to create (a `CNAME` and a `TXT` proving you own the name). Create them at your DNS provider, then verify. HTTPS is issued and renewed automatically; the project keeps its `.nesly.net` address too.

A **root domain** (`example.com`, with nothing in front of it) works the same way, but the record is different: DNS does not allow a `CNAME` at the root of a zone, so the command prints `A` records instead. Add `www.example.com` as a second domain if you want both to work.

## 7\. When something goes wrong

```
nesly ls                      # deployments, newest first
nesly inspect dep_…           # one deployment in detail
nesly logs --follow           # build and runtime output
nesly rollback dep_…          # put a previous deployment back
```

A rollback is instant: it repoints traffic at a deployment that already exists, without rebuilding anything.

## Limits worth knowing

-   Source uploads are capped at 256 MiB and 100,000 files.
-   Builds are given 15 minutes.
-   Free applications pause when idle and wake on the first request, which takes a few seconds. Pro keeps them warm.
-   Pull requests from forks are not deployed — see [GitHub](/docs/git/).
-   Each plan has an allowance — projects, domains, team members, build minutes and traffic: [limits](/docs/limits/).

Starting from a template instead of an empty directory: [templates](/templates/). Framework-specific notes (Next.js, Astro, FastAPI, ASP.NET…): [deploy guides](/deploy/nextjs/). Deploying from GitHub: [GitHub](/docs/git/). Build configuration: [builds](/docs/builds/). Databases, backups and one-off commands: [backups & commands](/docs/backups/). Notifications, data export and closing an account: [your account](/docs/account/). Working with an AI agent (MCP, diagnose): [for AI agents](/docs/agents/). Full command reference: [nesly CLI](/docs/cli/). Questions we have not answered here: [contact us](/contact/).

---
Canonical: https://nesly.net/docs/
Every docs page has this markdown twin: replace the trailing slash with .md
