---
title: CLI
description: Deploy prebuilt dist directories over Git smart-HTTP with @noitenow/cli.
---

`@noitenow/cli` deploys a CI-built `dist` plus `wrangler.jsonc` as a synthetic fast-forward commit over Git smart-HTTP — zero server build. Same auth as `git push` (Basic `git` + profile API key, `push` role suffices, never force).

## Install

Bun must be on the machine that runs it (ships as a Bun bundle):

```bash
bun add -g @noitenow/cli   # Bun
npm i -g @noitenow/cli     # npm/pnpm/yarn — same tarball
bunx @noitenow/cli deploy  # one-off, no install
```

```bash
bunx @noitenow/cli deploy --slug <slug> --url https://git.<domain> --token $NOITE_API_KEY
```

## Flags

Flags fall back to env, then to GitHub Actions context:

| Flag | Env | Actions default |
| --- | --- | --- |
| `--dist` | — | `dist` |
| `--slug` | `NOITE_SLUG` | repo name, slugified |
| `--url` | `GIT_PUBLIC_BASE` / `NOITE_BASE` | — |
| `--token` | `NOITE_API_KEY` / `NOITE_GIT_TOKEN` | — |
| `--wrangler` | — | `wrangler.jsonc` |
| `--message` | — | `deploy <sha12>` |
| `--comment` | — | `update` (`create` / `off`) |

`app`, `api`, `git` slugs are reserved and refused. The tree carries `dist/*` + `wrangler.jsonc` with no `package.json`, so the runner skips to release → `celld deploy`. Commits parent the remote tip (fast-forward); values are never logged, and the token travels in the remote URL exactly like a plain `git push`.

## Workflow

```yaml
- run: bun run build
- run: bunx @noitenow/cli deploy --comment update
  env:
    NOITE_API_KEY: ${{ secrets.NOITE_API_KEY }}
    NOITE_BASE: https://git.<domain>
```

## Outputs and PR comments

In Actions it writes `url=` + `sha=` to `$GITHUB_OUTPUT` for downstream steps, and posts (or updates via marker) a PR comment with `gh` — no GitHub App needed:

- `--comment update` (default): one comment per PR, updated on each deploy.
- `--comment create`: a new comment per deploy.
- `--comment off`: no comment.

Commenting soft-fails: missing `gh`, missing token, or no PR number only warns — the deploy already succeeded.
