---
title: "Commands"
description: "Every command, what it changes, and which ones change what visitors see."
canonical: "https://atelier201.com/docs/cli/commands"
updated: "2026-11-06"
---

# Commands

Only `media generate` spends credits, after an estimate and approval. Publishing,
rollback, unpublish, site deletion, and domain changes affect what visitors see.
Other writes edit the draft or workspace. Read-only commands change neither.

Use `atelier201 help <group> <command> --json` for precise inputs and outputs.
The [generated coverage reference](/docs/api/surfaces) maps each capability to REST,
CLI, and MCP, with reasons for transport-specific exceptions.

## Account

```bash
atelier201 account                 # workspace, plan, scopes of this credential
atelier201 credits                 # balance and every grant
atelier201 usage --from 2026-01-01 # credit usage over a period
```

## Sites

```bash
atelier201 sites list
atelier201 sites create "Maison Dupont" --slug maison-dupont --locale fr --link
atelier201 sites get
atelier201 sites rename "Maison Dupont Boulangerie"
atelier201 sites delete            # asks you to type the slug; --confirm <slug> in a script
```

`sites create` starts from the Atelier201 starter and builds it once. A deleted site
goes offline at once and is removed within minutes, so run `atelier201 site pull`
first if you may need it.

## A project folder

```bash
atelier201 site link --site <id>   # tie this folder to a site
atelier201 site pull               # the draft's files, here
atelier201 site push --message "New menu" --build --wait
```

`site push` replaces the draft with the folder as one history entry. It skips
`node_modules`, `dist`, `.astro`, `.git`, `.env` files and keys, and whatever your
root `.gitignore` lists, 50 MB at most. It refuses to overwrite changes made on the
site since your last sync (`site pull` first, or `--force`), and `site pull`
refuses to overwrite a file you changed locally.

## Content

```bash
atelier201 content model
atelier201 content list blog
atelier201 content get blog hello-world
atelier201 content save blog hello-world --data entry.json --body hello.md
atelier201 content delete blog hello-world
atelier201 content singleton business
atelier201 content save-singleton business --data business.json
atelier201 content set business:/hours/2/close "18:00"
atelier201 content set business:/seats 12 --as number
atelier201 content replace "Open 9 to 5" "Open 9 to 6"
atelier201 sites apply plan.json
atelier201 media place business:/hero/image --query "bakery counter with fresh bread" --alt "Our counter"
```

Read `content model` first. Every write is checked against it. `--expect <hash>`
saves only if the entry still has the hash you read, and `--create-only` refuses
to overwrite.

## Files, history and changesets

```bash
atelier201 files list --under src/content
atelier201 files read src/pages/index.astro
atelier201 files search "opening hours"
atelier201 files commit --message "Update the menu" --put src/pages/menu.astro=menu.astro
atelier201 history list
atelier201 history compare --to <revision>
atelier201 history restore <revision>
atelier201 changesets open "Add a gallery page"
atelier201 changesets stage <changeset_id> --put src/pages/gallery.astro=gallery.astro
atelier201 changesets commit <changeset_id>
```

`files commit` is one history entry. `--expect <path>=<hash>` refuses the whole
change, with exit `6`, if that file changed since you read it. A changeset does the
same over several calls and stays open for 10 minutes. `history restore` adds a new
entry that matches an earlier one, and erases nothing.

## Media

```bash
atelier201 media list
atelier201 media upload photo.jpg --alt "A loaf of bread"
atelier201 media delete media/photo.jpg
atelier201 media stock search bakery counter morning light
atelier201 media stock import pixabay 1234567 --alt "Croissants on a bakery counter"
atelier201 media models
atelier201 media generate --model p-image --estimate "a sunlit bakery counter, flat illustration"
atelier201 media generate --model nano-banana "a sunlit bakery counter, photo, no text" --alt "A bakery counter"
atelier201 media generation <generation_id> --wait
```

Stock search and import are free. `media generate` spends credits: it shows the
exact price and asks first (`--yes` accepts it, and is required when there is no
terminal), and it needs the `media:generate` permission, which `atelier201 auth login`
does not request unless you add it with `--scope`.

## Build and preview

```bash
atelier201 builds start --wait
atelier201 builds list
atelier201 builds get <build_id>
atelier201 builds log <build_id>
atelier201 previews create --days 7
atelier201 previews list
atelier201 previews revoke <preview_id>
atelier201 analytics --period 7d
```

`builds start --wait` waits up to 5 minutes. It exits `0` when the build of what
you asked for is `ready`, and exits non-zero with the end of the build log when
it fails. One build runs at a time per site: an earlier version still running is
waited out first.

## Publish

```bash
atelier201 publish review                       # which build, blockers, nothing changes
atelier201 publish                              # the newest ready build, asks first
atelier201 publish --build <build_id>
atelier201 publish history
atelier201 publish rollback --publication <id>
atelier201 publish unpublish
```

`publish`, `publish rollback` and `publish unpublish` show what changes and ask
first. In a script, pass `--yes`. Each reads the state first and sends the
generation it read, so a publish by someone else in between is refused with exit
`6` instead of overwritten.

## Domains

```bash
atelier201 domains list
atelier201 domains add www.example.com   # prints the DNS records to create
atelier201 domains check <domain_id>
atelier201 domains address <slug>
atelier201 domains main <domain_id>
atelier201 domains remove <domain_id>
```

A custom domain needs a paid plan. See [Domains](/docs/platform/domains).

## Before anybody has signed in

```bash
atelier201 site push --guest --name "Maison Dupont"
```

It needs no account. It puts the folder online as a demo and prints two links: the
demo, and a private link to give only to the owner so the site becomes theirs. See
[Guest sites](/docs/platform/guest-sites).

## Manuals

```bash
atelier201 skills list
atelier201 skills get create-site
```

The manuals Atelier201's own assistant works from: read the one that covers your job
before you start it. They need no sign-in. `get` prints Markdown on a terminal and
the JSON object (with `body`) when piped or with `--json`.

## Escape hatches

```bash
atelier201 api GET /sites
atelier201 api POST /sites --data '{"name":"Maison Dupont"}'
atelier201 doctor
atelier201 mcp
atelier201 feedback send --problem "..." --situation "..." --expected-solution "..."
```

`atelier201 api` reaches any endpoint, including one added after your CLI version, so
a new capability never has to wait for a release. `atelier201 doctor` checks
connectivity, credentials, version and clock skew. `atelier201 mcp` bridges stdio to
the MCP server for clients that cannot speak HTTP.
