# Plugins

Extend semantic-release with official and community plugins for publishing, notifications, and more.

## Official plugins

<div class="plugin-grid">

<PluginCard
  name="@semantic-release/commit-analyzer"
  url="https://github.com/semantic-release/commit-analyzer"
  description="Note: This is already part of semantic-release and does not have to be installed separately"
  steps={{
    analyzeCommits:
      'Determine the type of release by analyzing commits with <a href="https://github.com/conventional-changelog/conventional-changelog">conventional-changelog</a>.',
  }}
/>

<PluginCard
  name="@semantic-release/release-notes-generator"
  url="https://github.com/semantic-release/release-notes-generator"
  description="Note: This is already part of semantic-release and does not have to be installed separately"
  steps={{
    generateNotes:
      'Generate release notes for the commits added since the last release with <a href="https://github.com/conventional-changelog/conventional-changelog">conventional-changelog</a>.',
  }}
/>

<PluginCard
  name="@semantic-release/github"
  url="https://github.com/semantic-release/github"
  description="Note: This is already part of semantic-release and does not have to be installed separately"
  steps={{
    verifyConditions:
      "Verify the presence and the validity of the GitHub authentication and release configuration.",
    publish:
      'Publish a <a href="https://help.github.com/articles/about-releases">GitHub release</a>.',
    success:
      "Add a comment to GitHub issues and pull requests resolved in the release.",
    fail: "Open a GitHub issue when a release fails.",
  }}
/>

<PluginCard
  name="@semantic-release/npm"
  url="https://github.com/semantic-release/npm"
  description="Note: This is already part of semantic-release and does not have to be installed separately"
  steps={{
    verifyConditions:
      "Verify the presence and the validity of the npm authentication and release configuration.",
    prepare:
      "Update the package.json version and create the npm package tarball.",
    publish: "Publish the package on the npm registry.",
  }}
/>

<PluginCard
  name="@semantic-release/gitlab"
  url="https://github.com/semantic-release/gitlab"
  steps={{
    verifyConditions:
      "Verify the presence and the validity of the GitLab authentication and release configuration.",
    publish:
      'Publish a <a href="https://docs.gitlab.com/ee/user/project/releases/">GitLab release</a>.',
  }}
/>

<PluginCard
  name="@semantic-release/git"
  url="https://github.com/semantic-release/git"
  steps={{
    verifyConditions:
      "Verify the presence and the validity of the Git authentication and release configuration.",
    prepare: "Push a release commit and tag, including configurable files.",
  }}
/>

<PluginCard
  name="@semantic-release/changelog"
  url="https://github.com/semantic-release/changelog"
  steps={{
    verifyConditions:
      "Verify the presence and the validity of the configuration.",
    prepare:
      "Create or update the changelog file in the local project repository.",
  }}
/>

<PluginCard
  name="@semantic-release/exec"
  url="https://github.com/semantic-release/exec"
  steps={{
    verifyConditions:
      "Execute a shell command to verify if the release should happen.",
    analyzeCommits: "Execute a shell command to determine the type of release.",
    verifyRelease:
      "Execute a shell command to verifying a release that was determined before and is about to be published.",
    generateNotes: "Execute a shell command to generate the release note.",
    prepare: "Execute a shell command to prepare the release.",
    publish: "Execute a shell command to publish the release.",
    success: "Execute a shell command to notify of a new release.",
    fail: "Execute a shell command to notify of a failed release.",
  }}
/>

<PluginCard
  name="@semantic-release/apm"
  url="https://github.com/semantic-release/apm"
  steps={{
    verifyConditions:
      'Verify the presence of the <code>ATOM_ACCESS_TOKEN</code> environment variable and the <a href="https://github.com/atom/apm">apm</a> CLI.',
    prepare:
      'Update the <code>package.json</code> version with <a href="https://docs.npmjs.com/cli/version">npm version</a>.',
    publish:
      'Publish the <a href="https://flight-manual.atom.io/hacking-atom/sections/publishing">Atom package</a>.',
  }}
/>

</div>

## Community plugins

:::note[Add your own!]
Have you built a plugin for semantic-release?
Open a PR adding a new plugin to this page!
:::

<div class="plugin-grid">

<PluginCard
  name="semantic-release-slack-bot"
  url="https://github.com/juliuscc/semantic-release-slack-bot"
  steps={{
    verifyConditions:
      "Verify that the environment variable <code>SLACK_WEBHOOK</code> has been defined.",
    success: "Publish a message about the success to a slack channel.",
    fail: "Optionally publish a message about failure to a slack channel.",
  }}
/>

<PluginCard
  name="semantic-release-docker"
  url="https://github.com/felixfbecker/semantic-release-docker"
  steps={{
    verifyConditions:
      "Verify that all needed configuration is present and login to the Docker registry.",
    publish:
      "Tag the image specified by <code>name</code> with the new version, push it to Docker Hub and update the latest tag.",
  }}
/>

<PluginCard
  name="@semantic-release-plus/docker"
  url="https://github.com/semantic-release-plus/semantic-release-plus/tree/master/packages/plugins/docker"
  steps={{
    verifyConditions:
      "Verify that all needed configuration is present and login to the configured docker registry.",
    publish:
      "Tag the image specified by <code>name</code> with the new version and channel and push it to the configured docker registry.",
    addChannel:
      "Updates a release published on one channel with the destinations channel tag and pushes to the registry i.e.: next to latest.",
  }}
/>

<PluginCard
  name="semantic-release-gcr"
  url="https://github.com/carlos-cubas/semantic-release-gcr"
  steps={{
    verifyConditions:
      "Verify that all needed configuration is present and login to the Docker registry.",
    publish:
      "Tag the image specified by <code>name</code> with the new version, push it to Docker Hub and update the latest tag.",
  }}
/>

<PluginCard
  name="semantic-release-vsce"
  url="https://github.com/raix/semantic-release-vsce"
  steps={{
    verifyConditions:
      'Verify the presence and the validity of the "VS Code extension" authentication and release configuration.',
    prepare: "Create a <code>.vsix</code> for distribution.",
    publish: "Publish the package to the Visual Studio Code marketplace.",
  }}
/>

<PluginCard
  name="semantic-release-verify-deps"
  url="https://github.com/piercus/semantic-release-verify-deps"
  steps={{
    verifyConditions:
      "Check the dependencies format against a regexp before a release.",
  }}
/>

<PluginCard
  name="semantic-release-openapi"
  url="https://github.com/aensley/semantic-release-openapi"
  steps={{
    verifyConditions:
      "Verify <code>apiSpecFiles</code> is specified with at least one file name and all matching files have a .json, .yaml, or .yml extension.",
    prepare:
      "Write the correct version to all OpenAPI / Swagger files specified in <code>apiSpecFiles</code>.",
  }}
/>

<PluginCard
  name="semantic-release-chrome"
  url="https://github.com/GabrielDuarteM/semantic-release-chrome"
  steps={{
    verifyConditions:
      "Verify the presence of the authentication (set via environment variables).",
    prepare:
      "Write the correct version to the <code>manifest.json</code> and creates a zip file of the whole dist folder.",
    publish:
      "Uploads the generated zip file to the webstore, and publish the item.",
  }}
/>

<PluginCard
  name="semantic-release-firefox-add-on"
  url="https://github.com/tophat/semantic-release-firefox-add-on"
  steps={{
    verifyConditions:
      "Verify that all required options are present and authentication is set via environment variables.",
    prepare: "Write the correct version to the <code>manifest.json</code>.",
    publish:
      "Creates an unsigned <code>.xpi</code> file, and submits it to the Mozilla Add On store for signing. Once the package is signed, downloads the signed <code>.xpi</code> to a local directory.",
  }}
/>

<PluginCard
  name="semantic-release-gerrit"
  url="https://github.com/pascalMN/semantic-release-gerrit"
  steps={{
    generateNotes: "Generate release notes with Gerrit reviews URL.",
  }}
/>

<PluginCard
  name="semantic-release-expo"
  url="https://github.com/bycedric/semantic-release-expo"
  steps={{
    verifyConditions: "Verify Expo manifest(s) are readable and valid.",
    prepare:
      "Update version, ios build number and android version code in the Expo manifest(s).",
  }}
/>

<PluginCard
  name="maven-semantic-release"
  url="https://github.com/conveyal/maven-semantic-release"
  steps={{
    verifyConditions:
      "Verifies that the <code>pom.xml</code> file and other files exist and are setup to allow releases.",
    verifyRelease:
      "Checks and warns (does not error by default) if the version numbers found on maven central and within the Git project differ by quite a bit.",
    prepare:
      "Changes the version number in the <code>pom.xml</code> (or all <code>pom.xml</code> files in maven projects with multiple <code>pom.xml</code> files) and optionally creates a commit with this version number and pushes it to <code>master</code>.",
    publish:
      "Runs <code>mvn deploy</code> to deploy to maven central and optionally will update to next snapshot version and merge changes to development branch.",
  }}
/>

<PluginCard
  name="maven-semantic-release (alternative)"
  url="https://github.com/terrestris/maven-semantic-release"
  description="Alternative version"
  steps={{
    verifyConditions: "Verifies that the <code>mvn</code> command exists.",
    prepare:
      "Changes version number in <code>pom.xml</code> and optionally in all child modules.",
    publish:
      "Runs one of the mvn targets <code>deploy</code>, <code>package jib:build</code> or <code>deploy jib:build</code>.",
    success: "Optionally sets new snapshot version and commits it.",
  }}
/>

<PluginCard
  name="semantic-release-ado"
  url="https://github.com/lluchmk/semantic-release-ado"
  steps={{
    prepare:
      "Stores the version number as an Azure DevOps pipeline variable available to downstream steps on the job.",
  }}
/>

<PluginCard
  name="gradle-semantic-release"
  url="https://github.com/KengoTODA/gradle-semantic-release-plugin"
  steps={{
    verifyConditions:
      "Verify that project has a Gradle wrapper script, and <code>build.gradle</code> contains a task to publish artifacts.",
    prepare:
      "Changes the version number in the <code>gradle.properties</code>.",
    publish: "Triggers Gradle to publish artifacts.",
  }}
/>

<PluginCard
  name="semantic-release-circleci-orb"
  url="https://github.com/matt-oakes/semantic-release-circleci-orb"
  steps={{
    verifyConditions:
      "Verify the presence of the <code>CIRCLECI_API_TOKEN</code> environment variable, <code>orbName</code> option, and the <code>circleci</code> CLI.",
    publish: "Publish the CircleCI orb.",
  }}
/>

<PluginCard
  name="semantic-release-github-pages"
  url="https://github.com/qiwi/semantic-release-gh-pages-plugin"
  steps={{
    verifyConditions:
      "Verify the presence of the auth token set via environment variables.",
    publish: "Pushes commit to the documentation branch.",
  }}
/>

<PluginCard
  name="semantic-release-github-pullrequest"
  url="https://github.com/asbiin/semantic-release-github-pullrequest"
  steps={{
    verifyConditions:
      "Verify the presence and the validity of the GitHub authentication and other configuration.",
    publish:
      "Create a branch to upload all assets and create the pull request on the base branch on GitHub.",
  }}
/>

<PluginCard
  name="leiningen-semantic-release"
  url="https://github.com/NoxHarmonium/leiningen-semantic-release"
  steps={{
    verifyConditions: "Checks the project.clj is syntactically valid.",
    prepare: "Update the project.clj version and package the output jar file.",
    publish:
      "Publish the jar (and generated Maven metadata) to a maven repository (or clojars).",
  }}
/>

<PluginCard
  name="@saithodev/semantic-release-gitea"
  url="https://github.com/saitho/semantic-release-gitea"
  steps={{
    verifyConditions:
      "Verify the presence and the validity of the authentication and the assets option configuration.",
    publish: "Publish a Gitea release, optionally uploading file assets.",
    addChannel: "Update a Gitea release's pre-release field.",
  }}
/>

<PluginCard
  name="semantic-release-replace-plugin"
  url="https://github.com/jpoehnelt/semantic-release-replace-plugin"
  steps={{
    prepare: "Replace version strings in files using regex and glob.",
  }}
/>

<PluginCard
  name="semantic-release-rubygem"
  url="https://github.com/Gusto/semantic-release-rubygem"
  steps={{
    verifyConditions:
      "Locate and validate a <code>.gemspec</code> file, locate and validate a <code>lib/**/version.rb</code> file, verify the presence of the <code>GEM_HOST_API_KEY</code> environment variable, and create a credentials file with the API key.",
    prepare:
      'Update the version in the <code>lib/**/version.rb</code> version file and <a href="https://guides.rubygems.org/command-reference/#gem-build">build</a> the gem.',
    publish:
      '<a href="https://guides.rubygems.org/command-reference/#gem-push">Push the Ruby gem</a> to the gem server.',
  }}
/>

<PluginCard
  name="semantic-release-npm-deprecate-old-versions"
  url="https://github.com/ghusse/semantic-release-npm-deprecate-old-versions"
  steps={{
    verifyConditions: "Validates configuration.",
    publish:
      "Deprecates old versions, based on the declaration of supported versions in the config.",
  }}
/>

<PluginCard
  name="amanda-mitchell/semantic-release-npm-multiple"
  url="https://github.com/amanda-mitchell/semantic-release-npm-multiple"
  description="Note: This is a thin wrapper around the built-in npm plugin that can target multiple registries"
  steps={{
    verifyConditions:
      "Verify the presence and the validity of the npm authentication and release configuration for multiple registries.",
    prepare:
      "Update the package.json version and create the npm package tarball.",
    publish: "Publish the package on the npm registry for multiple registries.",
  }}
/>

<PluginCard
  name="semantic-release-license"
  url="https://github.com/cbhq/semantic-release-license"
  description="Automatically update dates and more in your license file for new releases"
  steps={{
    verifyConditions: "Verify the presence of a license file.",
    prepare: "Update the license file based on its type.",
  }}
/>

<PluginCard
  name="semantic-release-pypi"
  url="https://github.com/abichinger/semantic-release-pypi"
  steps={{
    verifyConditions:
      "Verify the environment variable <code>PYPI_TOKEN</code> and installation of build tools.",
    prepare:
      "Update the version in <code>setup.cfg</code> and create the distribution packages.",
    publish: "Publish the python package to a repository (default: pypi).",
  }}
/>

<PluginCard
  name="@covage/semantic-release-poetry-plugin"
  url="https://github.com/covage/semantic-release-poetry-plugin"
  steps={{
    verifyConditions:
      "Verify the presence and validity of <code>pyproject.toml</code> file.",
    prepare: "Update the version in <code>pyproject.toml</code>.",
  }}
/>

<PluginCard
  name="semantic-release-codeartifact"
  url="https://github.com/ryansonshine/semantic-release-codeartifact"
  steps={{
    verifyConditions:
      "Validate configuration, get AWS CodeArtifact authentication and repository, validate <code>publishConfig</code> or <code>.npmrc</code> (if they exist), then pass the configuration to the associated plugins.",
  }}
/>

<PluginCard
  name="semantic-release-telegram"
  url="https://github.com/pustovitDmytro/semantic-release-telegram"
  steps={{
    verifyConditions:
      "Validate configuration and verify <code>TELEGRAM_BOT_ID</code> and <code>TELEGRAM_BOT_TOKEN</code>.",
    success:
      "Publish a message about the successful release to a telegram chat.",
    fail: "Publish a message about failure to a telegram chat.",
  }}
/>

<PluginCard
  name="semantic-release-heroku"
  url="https://github.com/pustovitDmytro/semantic-release-heroku"
  steps={{
    verifyConditions:
      "Validate configuration and verify <code>HEROKU_API_KEY</code>.",
    prepare: "Update the package.json version and create release tarball.",
    publish: "Publish version to heroku.",
  }}
/>

<PluginCard
  name="semantic-release-mattermost"
  url="https://github.com/ttrobisch/semantic-release-mattermost"
  steps={{
    verifyConditions:
      "Verify that the webhook is setup and release-notes-generator is present.",
    success:
      'Send a message about the new release and its notes to a <a href="https://mattermost.com/">mattermost</a> webhook.',
  }}
/>

<PluginCard
  name="semantic-release-github-milestones"
  url="https://github.com/nitzano/semantic-release-github-milestones"
  steps={{
    verifyConditions: "Verify github tokens are present and valid.",
    verifyRelease:
      "Display information regarding the matching github milestone.",
  }}
/>

<PluginCard
  name="semantic-release-telegram-bot"
  url="https://github.com/skoropadas/semantic-release-telegram-bot"
  steps={{
    verifyConditions:
      "Validate configuration and verify <code>TELEGRAM_BOT_TOKEN</code> and package name.",
    success: "Publish a success message to certain telegram chats.",
    fail: "Publish a fail message to certain telegram chats.",
  }}
/>

<PluginCard
  name="semantic-release-npm-deprecate"
  url="https://github.com/jpoehnelt/semantic-release-npm-deprecate"
  steps={{
    publish: "Automatically mark old versions as deprecated.",
  }}
/>

<PluginCard
  name="semantic-release-mirror-version"
  url="https://github.com/GarthDB/semantic-release-mirror-version"
  steps={{
    prepare:
      'Update the version number in any file that matches the defined <a href="https://github.com/isaacs/node-glob">file glob</a>.',
  }}
/>

<PluginCard
  name="semantic-release-space"
  url="https://github.com/123FLO321/semantic-release-space"
  steps={{
    verifyConditions: "Verifies that all required options are set.",
    prepare:
      "Creates a JetBrains Space Deployment Target if it does not yet exist.",
    publish: "Starts a JetBrains Space Deployment.",
    success: "Marks the JetBrains Space Deployment as completed.",
    fail: "Marks the JetBrains Space Deployment as failed.",
  }}
/>

<PluginCard
  name="semantic-release-react-native"
  url="https://github.com/alexandermendes/semantic-release-react-native"
  steps={{
    verifyConditions: "Validate configuration.",
    prepare: "Version native iOS and Android files.",
  }}
/>

<PluginCard
  name="semantic-release-cargo"
  url="https://github.com/buehler/semantic-release-cargo"
  steps={{
    verifyConditions:
      "Validate configuration, <code>Cargo.toml</code>, and local cargo executable. Also, logs in into <code>crates.io</code>.",
    prepare:
      "Write the new version number into <code>Cargo.toml</code> file and perform <code>cargo check</code> if configured.",
    publish: "Publish the Rust crate to <code>crates.io</code>.",
  }}
/>

<PluginCard
  name="semantic-release-coralogix"
  url="https://github.com/adobe/semantic-release-coralogix"
  steps={{
    verifyConditions:
      "Verified that required credentials are provided and API is accessible.",
    publish: "Add a release tag to Coralogix.",
  }}
/>

<PluginCard
  name="semantic-release-jira-notes"
  url="https://github.com/iamludal/semantic-release-jira-notes"
  steps={{
    verifyConditions: "Validate the config options.",
    generateNotes: "Generate the release notes with links to JIRA issues.",
  }}
/>

<PluginCard
  name="semantic-release-major-tag"
  url="https://github.com/doteric/semantic-release-major-tag"
  steps={{
    success: "Create major version tag, for example <code>v1</code>.",
  }}
/>

<PluginCard
  name="semantic-release-yarn"
  url="https://github.com/hongaar/semantic-release-yarn"
  description="Note: This is an alternative to the default @semantic-release/npm plugin and adds support for monorepos"
  steps={{
    verifyConditions:
      "Verify Yarn 2 or higher is installed, verify the presence of a NPM auth token (either in an environment variable or a <code>.yarnrc.yml</code> file) and verify the authentication method is valid.",
    prepare:
      "Update the <code>package.json</code> version and create the package tarball.",
    addChannel: "Add a tag for the release.",
    publish: "Publish to the npm registry.",
  }}
/>

<PluginCard
  name="semantic-release-pub"
  url="https://github.com/zeshuaro/semantic-release-pub"
  steps={{
    verifyConditions:
      "Verify the presence of the <code>pub.dev</code> authentication and release configuration.",
    prepare: "Update the <code>pubspec.yaml</code> version.",
    publish: "Publish the package onto the <code>pub.dev</code> registry.",
  }}
/>

<PluginCard
  name="semantic-release-hackage"
  url="https://github.com/stackbuilders/semantic-release-hackage"
  steps={{
    verifyConditions:
      "Verify the environment variable <code>HACKAGE_TOKEN</code>.",
    prepare:
      "Update the version of .cabal file and create the distribution package (.tar).",
    publish:
      "Publish the release candidate to the specified repository in Hackage.",
  }}
/>

<PluginCard
  name="semantic-release-pull-request-analyzer"
  url="https://github.com/bobvanderlinden/semantic-release-pull-request-analyzer"
  steps={{
    verifyConditions:
      "Verify configuration options and existence of GitHub token.",
    analyzeCommits:
      "Determine the type of release by analyzing merged GitHub pull requests and their labels.",
    generateNotes:
      'Generates release notes using <a href="https://docs.github.com/en/repositories/releasing-projects-on-github/automatically-generated-release-notes">GitHub release notes generator</a>.',
  }}
/>

<PluginCard
  name="semantic-release-commits-lint"
  url="https://github.com/BondarenkoAlex/semantic-release-commits-lint"
  steps={{
    analyzeCommits:
      'Analyzing commit messages by <a href="https://github.com/conventional-changelog/commitlint">commitlint</a>.',
  }}
/>

<PluginCard
  name="semantic-release-kaniko"
  url="https://github.com/brendangeck/semantic-release-kaniko"
  steps={{
    verifyConditions:
      "Verify that all needed configuration is present and login to the Docker registry.",
    publish:
      'Build a container image using <a href="https://github.com/GoogleContainerTools/kaniko">Kaniko</a> and (optionally) push it to a Docker registry.',
  }}
/>

<PluginCard
  name="semantic-release-skopeo"
  url="https://github.com/LukasWestholt/semantic-release-skopeo"
  steps={{
    verifyConditions:
      "Verify that all needed configuration is present and check if destination is writeable (unless force=true).",
    publish:
      'Copy OCI images to a custom (Docker) registry using daemonless open-source tool <a href="https://github.com/containers/skopeo/">skopeo</a>.',
  }}
/>

<PluginCard
  name="sr-uv-plugin"
  url="https://github.com/Artessan-Devs/sr-uv-plugin"
  steps={{
    verifyConditions:
      "Ensures <code>pyproject.toml</code> exists and contains a <code>[project]</code> section.",
    prepare:
      "Updates the <code>[project].version</code> field in <code>pyproject.toml</code> to match the release version.",
  }}
/>

<PluginCard
  name="semantic-release-uv"
  url="https://github.com/Deltamir/semantic-release-uv"
  steps={{
    verifyConditions:
      "Verify the presence and validity of a <code>PYPI_TOKEN</code> and validate the <code>pyproject.toml</code> structure.",
    prepare:
      "Update the version in <code>pyproject.toml</code>, locking and build the distribution with <code>uv</code>.",
    publish:
      "Publish the package to PyPI or a custom index using <code>uv publish</code>.",
  }}
/>

<PluginCard
  name="@jno21/semantic-release-github-commit"
  url="https://github.com/Jno21/semantic-release-github-commit"
  description="Note: This plugin creates a commit on GitHub using the GitHub API, enabling signed commits via a GitHub App"
  steps={{
    verifyConditions: "Verify GitHub authentication and configuration.",
    prepare: "Create a commit with the specified files using the GitHub API.",
  }}
/>

<PluginCard
  name="semantic-release-minecraft"
  url="https://github.com/pynickle/semantic-release"
  steps={{
    verifyConditions: "Verify that all needed configuration is present.",
    prepare:
      "Convert different types of CurseForge game versions to their corresponding IDs.",
    publish: "Publish the Minecraft project to CurseForge and Modrinth.",
  }}
/>

<PluginCard
  name="semantic-release-linear-issue-status"
  url="https://github.com/noahlaux/semantic-release-linear-issue-status"
  steps={{
    verifyConditions:
      "Verify the presence of the <code>LINEAR_API_KEY</code> environment variable and required configuration options (<code>teamKey</code>, <code>issuePrefixes</code>).",
    success:
      'Move linked <a href="https://linear.app">Linear</a> issues to a completed workflow state after a successful release, based on issue identifiers found in release commits.',
  }}
/>

<PluginCard
  name="semantic-release-jira-fixversion"
  url="https://github.com/danbka33/semantic-release-jira-fixversion"
  steps={{
    verifyConditions:
      "Verify Jira Server/Data Center connectivity, authentication, and plugin configuration.",
    success:
      "Create or reuse Jira Versions for affected projects, update <code>fixVersions</code>, add release comments to referenced issues, and transition them to the configured workflow state.",
  }}
/>

</div>
