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

# Publish a plugin

> Register a plugin on the formae hub from its GitHub repository, install the hub's GitHub App, and confirm the details read from your manifest.

Publishing a plugin connects the hub to the plugin's GitHub repository. The hub
reads the repository's `formae-plugin.pkl` manifest, its `LICENSE` file, and its
schema, so the plugin's identity comes from the code rather than from anything
you type. This guide registers the plugin. Publishing an actual version happens
afterward, in [Release a version](/plugin-development/guides/release-a-version).

Before you start, make sure of the following:

* You have a [verified organization](/plugin-development/guides/register-your-org).
* Your plugin lives in a GitHub repository with a valid `formae-plugin.pkl`. [Scaffold a new plugin](/plugin-development/guides/scaffold-a-plugin) creates one for you.
* The repository's `LICENSE` is one the hub accepts: `Apache-2.0`, `BSD-3-Clause`, `MIT`, or `MPL-2.0`. The hub validates the license by its contents, so use the standard text for the license you declare.

<Steps>
  <Step title="Point the hub at your repository">
    From your organization page, select **register a plugin** and enter the URL
    of the GitHub repository that holds the plugin. The hub reads
    `formae-plugin.pkl`, `LICENSE`, and the `schema/` directory from that
    repository to fill in the plugin's details.

    <Frame>
      <img src="https://mintcdn.com/platform-engineering-labs/CeFHkIMyr22FubhV/images/plugin-development/hub/publish-a-plugin/01-register-plugin.png?fit=max&auto=format&n=CeFHkIMyr22FubhV&q=85&s=e78bfbb7cf5acd38306192566c225b54" alt="The register-plugin form with a GitHub repository URL entered" width="2880" height="1800" data-path="images/plugin-development/hub/publish-a-plugin/01-register-plugin.png" />
    </Frame>
  </Step>

  <Step title="Install the GitHub App on the repository">
    The hub builds your plugin from source, so it needs read access to the
    repository. When you continue, GitHub asks you to install the formae/hub App.
    Choose the account or organization that owns the repository.

    <Frame>
      <img src="https://mintcdn.com/platform-engineering-labs/CeFHkIMyr22FubhV/images/plugin-development/hub/publish-a-plugin/02-install-app-select-repo.png?fit=max&auto=format&n=CeFHkIMyr22FubhV&q=85&s=7ada418a0d49cbb95906f2811e5a3717" alt="GitHub App installation, choosing the account that owns the plugin repository" width="3748" height="1965" data-path="images/plugin-development/hub/publish-a-plugin/02-install-app-select-repo.png" />
    </Frame>

    Grant the App access to the plugin's repository and install it. GitHub then
    returns you to the hub.

    <Frame>
      <img src="https://mintcdn.com/platform-engineering-labs/CeFHkIMyr22FubhV/images/plugin-development/hub/publish-a-plugin/03-install-app.png?fit=max&auto=format&n=CeFHkIMyr22FubhV&q=85&s=e24a4a1d21777d214341b9e3b3b4aa90" alt="Installing the formae hub GitHub App on the plugin repository" width="3748" height="1965" data-path="images/plugin-development/hub/publish-a-plugin/03-install-app.png" />
    </Frame>
  </Step>

  <Step title="Confirm the plugin details">
    The hub shows the values it read from the repository: the name, namespace,
    category, and summary from `formae-plugin.pkl`, and the license from
    `LICENSE`. These fields are read-only because they come from the code. Review
    them, then select **register plugin**.

    <Frame>
      <img src="https://mintcdn.com/platform-engineering-labs/CeFHkIMyr22FubhV/images/plugin-development/hub/publish-a-plugin/04-confirm-plugin.png?fit=max&auto=format&n=CeFHkIMyr22FubhV&q=85&s=06e9cab372b150d6f7c5cbc31f3eb874" alt="The confirm-plugin screen showing name, namespace, license, category, and summary read from the repository" width="2880" height="1800" data-path="images/plugin-development/hub/publish-a-plugin/04-confirm-plugin.png" />
    </Frame>

    <Note>
      If the license is not one the hub accepts, registration stops at this screen.
      Set `LICENSE` to a standard accepted license, update the manifest's `license`
      field to match, and select **refresh from repo**.
    </Note>
  </Step>

  <Step title="The plugin is registered">
    The plugin now appears under your organization. It has no versions yet, so
    the hub prompts you to publish one. Publishing a version is covered next, in
    [Release a version](/plugin-development/guides/release-a-version).

    <Frame>
      <img src="https://mintcdn.com/platform-engineering-labs/CeFHkIMyr22FubhV/images/plugin-development/hub/publish-a-plugin/05-registered-nudge.png?fit=max&auto=format&n=CeFHkIMyr22FubhV&q=85&s=c8173667699352fd152cd09b46b31917" alt="The organization page listing the registered plugin with a prompt to push a tag" width="2880" height="1800" data-path="images/plugin-development/hub/publish-a-plugin/05-registered-nudge.png" />
    </Frame>
  </Step>
</Steps>

## See also

* [Release a version](/plugin-development/guides/release-a-version): push a git tag to build and publish a version.
* [Register an organization](/plugin-development/guides/register-your-org): the verified organization a plugin publishes under.
