> ## 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.

# Visibility: public, unlisted, private

> Who can find and install your extension, and what each choice costs at publish.

Visibility is one manifest field and it decides three things: who can install, what review
you go through, and whether you need a listing.

```bash theme={null}
tappify extension set visibility unlisted
```

|                    | `public`                                     | `unlisted`                           | `private`               |
| ------------------ | -------------------------------------------- | ------------------------------------ | ----------------------- |
| Who can find it    | Anyone browsing the Tap Store                | Only someone with the id or the link | Only your own workspace |
| Who can install it | Any workspace                                | Any workspace, by link               | Your own workspace      |
| Review             | Automated checks, then a person              | Automated checks only                | None, ever              |
| Listing required   | Yes                                          | No                                   | No                      |
| First publish      | Goes to review                               | Goes live when the checks pass       | Goes live               |
| Later publishes    | Review when scopes, kinds or visibility grow | Live when the checks pass            | Always live             |

## Choosing

* **private** while you are building, and for anything you wrote for your own company.
* **unlisted** for a customer-specific build, a beta, or an extension you sell outside
  Tappify and hand out by link.
* **public** when you want owners to find you in the Tap Store. Fill in
  [your listing](/extensions/publish/your-listing) first: a public publish fails without one.

## Changing it

The manifest field takes effect on your next publish, and widening it —
private to unlisted or public, unlisted to public — sends that publish to review the way a
new scope does.

The Listing page in the developer portal has a visibility control that applies to your live
listing straight away, without creating a release, with one limit: it cannot make a listing
public unless a reviewer has approved the current release. An extension that has only ever
been private or unlisted has no approval to measure against, and neither does one whose
manifest now asks for more than the release a reviewer read. Both answer with what to do
instead, which is to publish with `"visibility": "public"` in the manifest and let that
release go to review. Narrowing, and widening to unlisted, are always allowed. The control
needs a release to exist at all, so publish once before you edit a listing.

Moving from public to unlisted or private removes you from the Tap Store. Existing installs
keep running — to end those, [retire the extension](/extensions/publish/retiring).
