> ## Documentation Index
> Fetch the complete documentation index at: https://docs.tappify.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Publishing

> Build, check, upload and get a status back — live, or in review.

One command builds your extension, runs the checks, zips the bundle and uploads it. What
comes back is either `live` or `in_review`.

```bash theme={null}
tappify extension publish --notes "Adds the cohort tab"
```

Two lines: what was sent, and what happens next.

```
Sent Starter for review — 0.4 MB.
All checks passed; an admin reviews it, and `tappify extension status` shows progress.
```

| Flag              | Does                                                                                |
| ----------------- | ----------------------------------------------------------------------------------- |
| `--notes <notes>` | What changed in this release, for owners and the reviewer. At most 1,000 characters |
| `--skip-doctor`   | Publish without running the checks first                                            |
| `--yes`           | Answer every confirmation yes                                                       |

## What the command does, in order

<Steps>
  <Step title="Asks">
    Without `--notes` it asks what changed in this release, then names the extension and waits
    for a yes before anything is sent. `--notes` and `--yes` answer both, which is what a
    script wants.
  </Step>

  <Step title="Builds">
    Runs your `build` script. A failing build publishes nothing, and a missing `dist/` stops
    the command before the zip.
  </Step>

  <Step title="Checks">
    Runs [`doctor`](/extensions/test/doctor-checks) without rebuilding, and without your
    typecheck, lint, tests or accessibility pass — the build has just run. Any failure stops
    the publish and prints the checklist. `--skip-doctor` skips this; the second output line
    says which happened.
  </Step>

  <Step title="Packs">
    `tappify.extension.json`, `package.json`, `dist/`, your icon, your screenshots, every
    schema a `$ref` names, and any knowledge or skill markdown. At most 5 MB.
  </Step>

  <Step title="Uploads and validates">
    Tappify re-runs the manifest and bundle checks against the zip itself, then asks
    `<base url>/tappify/health` for a 200 within three seconds on every base url your
    manifest declares. A redirect counts as a failure.
  </Step>

  <Step title="Decides">
    Live, or in review. The rule is on [Releases](/extensions/publish/releases).
  </Step>
</Steps>

The first publish claims the extension id under your vendor, unless a `dev --live` session
already did, and says so. An id is immutable after that, so a later publish whose manifest
carries a different id is refused rather than creating a second extension. Every other field
is yours to change: a new name, description or category reaches the store card with the
release that goes live.

## What comes back

| Status      | Means                                                                  | First line                         |
| ----------- | ---------------------------------------------------------------------- | ---------------------------------- |
| `live`      | Serving every install now                                              | `Published <name> — <size>.`       |
| `in_review` | Waiting on a Tappify reviewer. Your current live release keeps serving | `Sent <name> for review — <size>.` |

An `unlisted` extension comes back `live`: its release is opened for review and approved by
the automated checks in the same request.

```bash theme={null}
tappify extension status
```

It prints the timeline, then the live release, the release in review and the install count in
one line. The Releases page in the developer portal shows the same thing with the diff and
the rejection reason.

Publishes are limited to 30 per day per extension.

<CardGroup cols={2}>
  <Card title="Review and what gets checked" icon="clipboard-check" href="/extensions/publish/review">
    Every check, what it looks at, and how to fix it.
  </Card>

  <Card title="Releases, rolling updates, and release notes" icon="code-branch" href="/extensions/publish/releases">
    When a publish goes straight to live.
  </Card>
</CardGroup>
