---
title: "CLI overview"
description: "Install the CLI, sign in, link a project folder to a site and put it online."
canonical: "https://atelier201.com/docs/cli/overview"
updated: "2026-11-06"
---

# CLI overview

```bash
npm install -g @atelier201/cli
atelier201 auth login
atelier201 account
```

`atelier201 auth login` opens a browser, asks you which workspace to connect and which
permissions to grant, and stores the token in your operating system's keychain,
not in a dotfile. On a machine without a browser, use `atelier201 auth login --device`.

## A project folder, from nothing to online

```bash
atelier201 sites create "Maison Dupont" --link   # creates the site, links this folder
atelier201 site pull                             # its files, here
# ...edit...
atelier201 site push --build --wait              # send the folder, build it, wait
atelier201 previews create                       # a private link to that build
atelier201 publish                               # shows what goes live, asks, then does it
```

Every site command takes `--site <id>`, or uses the site linked in the current
folder. `atelier201 site link --site <id>` writes `.atelier201/site.json`, which holds no
secret and is added to `.gitignore`.

Prefer the content commands to file edits for texts, entries and business
details: they are validated against the site's content model and cannot break the
layout.

```bash
atelier201 content set business:/tagline "Fresh bread daily"
```

See [Commands](/docs/cli/commands) for all of them, and
[Content model and media](/docs/platform/content-model) for what a site holds.

## Output

**Output is JSON automatically when stdout is not a terminal.** Piping into `jq`
just works, and no command needs a `--json` flag in CI. At a terminal you get a
table. Force either with `--output json|table|ndjson`.

## Exit codes

A script can branch without reading a message:

| Code | Meaning                                                     |
| ---- | ----------------------------------------------------------- |
| 0    | Success                                                     |
| 1    | An unexpected failure                                       |
| 2    | Bad usage, or a request the server rejected as invalid      |
| 3    | Authentication or permission                                |
| 4    | Not found                                                   |
| 5    | Rate limited                                                |
| 6    | Conflict: a write conflict, a stale publish or a plan limit |
