# Publish an extension

> Get an extension listed in Pointman's marketplace, at pointman.ai/extensions and in the apps, give it an icon, and get its publisher verified.

Pointman's marketplace lists the extensions on GitHub that are ready to install, at
[pointman.ai/extensions](https://pointman.ai/extensions) and in the apps. Nobody submits anything:
the marketplace finds your repo by its topic and lists its newest release.

## Get it listed

```bash
gh repo edit acme/pointman-greeter --add-topic pointman-extension
git tag v0.1.1 && git push origin v0.1.1
```

Once the release is published, `greeter` is listed if:

1. **The repo is public and has the topic `pointman-extension`.** It's named `pointman-<id>`, with
   the `id` in its `extension.toml`.
2. **It has a release tagged `v<version>`,** with the `version` in its `extension.toml`, that isn't
   a draft or a prerelease. The marketplace lists the newest one.
3. **Its `extension.toml` is at the top of the repo and passes core's checks,** the same ones core
   runs when it adds an extension to your catalogue. Every rule is in the
   [`extension.toml` reference](/reference/extension-manifest/). It needs something a node runs: a
   `[run]`, `[behavior]` or `[client]` table.
4. **It's small enough:** at the tag, GitHub's download of the repo is at most 20 MB, and 2,000 files
   or 50 MB unpacked, with no symbolic links.
5. **A compiled one has a build for every platform** in `platforms`, as release assets named
   `<id>-<version>-<platform>.tar.gz`, each at most 50 MB. The template's release workflow attaches
   them: see [Write an extension](/guides/write-an-extension/#release-it).
6. **Its id is its own.** The first publisher to list an id keeps it, and the ids of Pointman's own
   extensions are reserved.

Your **publisher** is the GitHub account that owns the repo, a person or an organisation. Every
extension it lists shows on its publisher page.

## When it shows up

The marketplace looks at GitHub every 30 minutes, so a new release is listed within half an hour.
Pages and search can take another five minutes to catch up.

Each new release replaces the listed version. Earlier ones stay in its list of versions, with their
release notes.

## Why it isn't listed

| It isn't listed when | What to do |
|---|---|
| The repo is private or hasn't got the `pointman-extension` topic | Make it public, and add the topic |
| The repo's name isn't `pointman-` and the manifest's `id` | Rename the repo, or change the `id` |
| It has no release, or only drafts and prereleases | Publish the release |
| The tag isn't `v` and the `version` in `extension.toml` | Bump `version`, then tag `v<version>` |
| `extension.toml` isn't at the top of the repo, or breaks a rule, such as an unknown field or a `summary` over 200 characters | Fix it against the [reference](/reference/extension-manifest/) and release again |
| It has none of `[run]`, `[behavior]` or `[client]`, so there's nothing for a node to run | Add the one it needs |
| The repo is too big at the tag, or has a symbolic link | Move big files out of the repo, and replace links with the files |
| A compiled one is missing a platform's build, or a build is over 50 MB | Attach every platform in `platforms`, or take the platform out |
| Another publisher listed the id first, or it's one of Pointman's | Pick another id, and rename the repo to match |
| Pointman has blocked the repo or its publisher | Blocks are rare, and each is kept with its reason |

:::note[Coming soon]
Your publisher page will say why a release wasn't listed.
:::

## Its page

Each listed extension gets a page of its own, on the web and in the apps. It's made from your repo
at the release's tag:

| On the page | From |
|---|---|
| Name, summary, version and platforms | `extension.toml` |
| What it adds and asks for: commands, panes, settings, accounts and permissions | `extension.toml` |
| The README | The repo's README, with relative links and images made absolute |
| Versions | Each release, with its notes |
| The icon | `icon.png` at the repo's root |
| Keywords | The repo's topics, without `pointman-extension` |
| Licence and homepage | The repo's licence and its website, as GitHub has them |
| Stars | The repo's stars |

Set the topics and the homepage on GitHub:

```bash
gh repo edit acme/pointman-greeter --add-topic greetings --homepage https://acme.example.com/greeter
```

People install it from its page: **Install** in the apps, or the `pointman add acme/pointman-greeter`
line and **Open in Pointman** on the web.

A community extension needs an owner of the workspace. In the apps, **Install** shows an
"unverified publisher" warning for them to confirm. With `pointman add`, the command asks the owner
for approval on their device first. Official and verified ones are added in one step.

### The icon

Put a PNG named `icon.png` at the root of the repo, beside `extension.toml`:

```text
pointman-greeter/
  extension.toml
  icon.png        # square, 256×256, at most 256 KiB
  README.md
```

The marketplace takes it from the release's tag. It must be a PNG of at most 256 KiB, and it's
shown at 256×256, so make it square. Without one, the page shows a monogram of the extension's name.

## Tiers and badges

| Tier | Whose extensions | Badge |
|---|---|---|
| Official | Repos of the [pointman-ai](https://github.com/pointman-ai) organisation | **Official**, with Pointman's mark |
| Verified | Publishers Pointman has checked: who they are, and a review of their extensions | **✓ Verified** |
| Community | Everyone else whose release is listed | none |

Verified goes with the publisher, not the extension: once `acme` is verified, every extension it
lists shows **✓ Verified**, including the ones it lists later.

## Get verified

Pointman keeps the list of verified publishers itself, with the reason each one is on it: who the
publisher is, how that was checked, and which of its extensions were reviewed.

:::note[Coming soon]
Asking for your publisher to be verified. Until then, extensions from publishers outside Pointman
are listed as community extensions.
:::
