Skip to content

Plugins

Relicta’s plugin system lets you integrate with external services at any point in the release lifecycle. All official plugins are distributed separately and installed via the plugin registry.

Terminal window
# List all available plugins
relicta plugin list --available
# Install a plugin
relicta plugin install github
# Enable it
relicta plugin enable github
# View details
relicta plugin info github

Relicta provides 30 official plugins across 6 categories:

Version Control

  • github - Create GitHub releases
  • gitlab - Create GitLab releases

Notifications

  • slack - Slack notifications
  • discord - Discord notifications
  • teams - Microsoft Teams
  • telegram - Telegram notifications

Package Managers

  • npm - npm registry
  • homebrew - Homebrew formulas
  • pypi - Python packages
  • chocolatey - Windows packages
  • winget - Windows Package Manager
  • linuxpkg - deb/rpm/apk
  • crates - Rust crates
  • nuget - .NET packages
  • maven - Java/Maven
  • rubygems - Ruby gems
  • hex - Elixir/Erlang
  • packagist - PHP/Composer
  • gomod - Go modules
  • swift-pm - Swift packages
  • pub - Dart/Flutter packages

Containers & Registries

  • docker - Build & push images
  • ecr - AWS ECR
  • gcr - Google Artifact Registry
  • acr - Azure Container Registry
  • helm - Helm charts

Project Management

  • jira - Jira versions
  • launchnotes - LaunchNotes
  • linear - Linear issues

DevOps

  • sentry - Sentry releases

Create GitHub releases and upload build artifacts automatically.

plugins:
- name: github
enabled: true
config:
draft: false
prerelease: false
generate_release_notes: false
discussion_category: ""
assets:
- "dist/*.tar.gz"
- "dist/*.zip"
- "dist/checksums.txt"

Environment: GITHUB_TOKEN (auto-set in GitHub Actions)

Hooks: PostPublish, OnSuccess, OnError


Create GitLab releases with links to build artifacts.

plugins:
- name: gitlab
enabled: true
config:
project_id: "12345"
url: "https://gitlab.com"

Environment: GITLAB_TOKEN, CI_PROJECT_ID (auto-set in GitLab CI)

Hooks: PostPublish


Send release notifications to Slack channels.

plugins:
- name: slack
enabled: true
config:
channel: "#releases"
username: "Relicta Bot"
notify_on_success: true
notify_on_error: true

Environment: SLACK_WEBHOOK_URL

Hooks: PostPublish, OnError


Send release notifications to Discord channels.

plugins:
- name: discord
enabled: true
config:
username: "Relicta Bot"
avatar_url: "https://example.com/avatar.png"

Environment: DISCORD_WEBHOOK_URL

Hooks: PostPublish, OnError


Send release notifications to Microsoft Teams channels.

plugins:
- name: teams
enabled: true
config:
theme_color: "0076D7"
notify_on_success: true
notify_on_error: true

Environment: TEAMS_WEBHOOK_URL

Hooks: PostPublish


Send release notifications to Telegram channels or groups.

plugins:
- name: telegram
enabled: true
config:
chat_id: "-1001234567890"
parse_mode: "Markdown"
disable_notification: false

Environment: TELEGRAM_BOT_TOKEN

Hooks: PostPublish, OnError


Publish packages to npm registry.

plugins:
- name: npm
enabled: true
config:
registry: "https://registry.npmjs.org"
access: "public"
tag: "latest"

Environment: NPM_TOKEN, NPM_OTP (optional for 2FA)

Hooks: PrePublish, PostPublish


Update Homebrew formula with new release.

plugins:
- name: homebrew
enabled: true
config:
tap: "your-org/homebrew-tap"
formula: "your-app"

Environment: HOMEBREW_GITHUB_TOKEN

Hooks: PostPublish


Publish Python packages to PyPI.

plugins:
- name: pypi
enabled: true
config:
repository: "https://upload.pypi.org/legacy/"
dist_dir: "dist"
skip_existing: false

Environment: PYPI_USERNAME (use __token__), PYPI_PASSWORD

Hooks: PrePublish, PostPublish


Publish packages to Chocolatey (Windows).

plugins:
- name: chocolatey
enabled: true
config:
package_id: "your-package"
source: "https://push.chocolatey.org/"

Environment: CHOCOLATEY_API_KEY

Hooks: PrePublish, PostPublish


Build Linux packages (deb, rpm, apk).

plugins:
- name: linuxpkg
enabled: true
config:
formats: ["deb", "rpm", "apk"]
maintainer: "Your Name <[email protected]>"
description: "Package description"
binaries:
- "bin/myapp"

Hooks: PrePublish, PostPublish


Publish Rust crates to crates.io.

plugins:
- name: crates
enabled: true
config:
manifest_path: "Cargo.toml"
allow_dirty: false

Environment: CARGO_REGISTRY_TOKEN

Hooks: PrePublish, PostPublish


Publish .NET packages to NuGet.

plugins:
- name: nuget
enabled: true
config:
source: "https://api.nuget.org/v3/index.json"
skip_duplicate: false

Environment: NUGET_API_KEY

Hooks: PrePublish, PostPublish


Publish Java packages to Maven Central.

plugins:
- name: maven
enabled: true
config:
group_id: "com.example"
artifact_id: "my-artifact"
pom_path: "pom.xml"

Environment: MAVEN_USERNAME, MAVEN_PASSWORD, GPG_KEY_ID (optional)

Hooks: PrePublish, PostPublish


Publish Ruby gems to RubyGems.org.

plugins:
- name: rubygems
enabled: true
config:
host: "https://rubygems.org"

Environment: GEM_HOST_API_KEY

Hooks: PrePublish, PostPublish


Publish Elixir/Erlang packages to Hex.pm.

plugins:
- name: hex
enabled: true
config:
organization: ""
replace: false
mix_path: "mix.exs"

Environment: HEX_API_KEY

Hooks: PrePublish, PostPublish


Publish PHP packages to Packagist.

plugins:
- name: packagist
enabled: true
config:
package_name: "vendor/package"

Environment: PACKAGIST_API_TOKEN, PACKAGIST_USERNAME

Hooks: PostPublish


Publish Go modules and notify the module proxy.

plugins:
- name: gomod
enabled: true
config:
module_path: "github.com/user/repo"
private: false

Hooks: PrePublish, PostPublish


Publish packages to Windows Package Manager (winget).

plugins:
- name: winget
enabled: true
config:
package_id: "Publisher.AppName"
manifest_path: "manifests/"
installer_url: "https://github.com/org/repo/releases/download/{{version}}/app.exe"

Environment: GITHUB_TOKEN (for PR creation)

Hooks: PostPublish


Publish Swift packages.

plugins:
- name: swift-pm
enabled: true
config:
package_path: "Package.swift"

Hooks: PrePublish, PostPublish


Publish Dart and Flutter packages to pub.dev.

plugins:
- name: pub
enabled: true
config:
dry_run: false
force: false

Environment: PUB_CREDENTIALS (from dart pub login)

Hooks: PrePublish, PostPublish


Create and link Jira release versions. Automatically detects issue keys in commits.

plugins:
- name: jira
enabled: true
config:
url: "https://yourcompany.atlassian.net"
project: "PROJ"
create_version: true
release_version: true

Environment: JIRA_USERNAME, JIRA_TOKEN

Hooks: PostPublish


Create releases in LaunchNotes for customer-facing announcements.

plugins:
- name: launchnotes
enabled: true
config:
project_id: "proj_123"
auto_publish: false
categories:
feat: "new-features"
fix: "bug-fixes"

Environment: LAUNCHNOTES_API_KEY

Hooks: PostPublish


Create and link Linear issues to releases. Automatically detects issue IDs in commits.

plugins:
- name: linear
enabled: true
config:
team_id: "TEAM-123"
project_id: "PROJECT-456"
create_release: true

Environment: LINEAR_API_KEY

Hooks: PostPublish


Build and push Docker images to container registries.

plugins:
- name: docker
enabled: true
config:
registry: "docker.io"
image: "username/myapp"
tags:
- "{{version}}"
- "{{major}}.{{minor}}"
- "latest"
platforms:
- "linux/amd64"
- "linux/arm64"
dockerfile: "Dockerfile"
context: "."
push: true

Environment: DOCKER_USERNAME, DOCKER_PASSWORD

Hooks: PrePublish, PostPublish

Tag variables: {{version}}, {{major}}, {{minor}}, {{patch}}


Push container images to Amazon Elastic Container Registry.

plugins:
- name: ecr
enabled: true
config:
registry: "123456789.dkr.ecr.us-east-1.amazonaws.com"
repository: "myapp"
tags:
- "{{version}}"
- "latest"

Environment: AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_REGION

Hooks: PrePublish, PostPublish


Push container images to Google Artifact Registry (GAR/GCR).

plugins:
- name: gcr
enabled: true
config:
project: "my-gcp-project"
location: "us-central1"
repository: "myapp"
tags:
- "{{version}}"
- "latest"

Environment: GOOGLE_APPLICATION_CREDENTIALS or GCLOUD_SERVICE_KEY

Hooks: PrePublish, PostPublish


Push container images to Azure Container Registry.

plugins:
- name: acr
enabled: true
config:
registry: "myregistry.azurecr.io"
repository: "myapp"
tags:
- "{{version}}"
- "latest"

Environment: AZURE_CLIENT_ID, AZURE_CLIENT_SECRET, AZURE_TENANT_ID

Hooks: PrePublish, PostPublish


Package and publish Helm charts to OCI registries or chart repositories.

plugins:
- name: helm
enabled: true
config:
chart_path: "charts/myapp"
registry: "oci://ghcr.io/myorg/charts"
push: true

Environment: HELM_REGISTRY_USERNAME, HELM_REGISTRY_PASSWORD

Hooks: PrePublish, PostPublish


Track releases and deployments in Sentry for error monitoring.

plugins:
- name: sentry
enabled: true
config:
organization: "my-org"
project: "my-project"
environment: "production"
set_commits: true

Environment: SENTRY_AUTH_TOKEN, SENTRY_ORG

Hooks: PostPublish


Plugins execute at specific hooks during the release process:

PreInit → PostInit → PrePlan → PostPlan → PreVersion → PostVersion
→ PreNotes → PostNotes → PreApprove → PostApprove → PrePublish
→ PostPublish → OnSuccess → OnError

Most plugins run at PostPublish after the release is tagged. Some run at PrePublish for validation or preparation.


Build your own plugins using the Plugin SDK.

Terminal window
# Create a new plugin
relicta plugin create my-plugin
cd my-plugin
# Build and test
go build -o my-plugin
relicta plugin test my-plugin
package main
import (
"context"
"github.com/relicta-tech/relicta-plugin-sdk/helpers"
"github.com/relicta-tech/relicta-plugin-sdk/plugin"
)
type MyPlugin struct{}
func (p *MyPlugin) GetInfo() plugin.Info {
return plugin.Info{
Name: "my-plugin",
Version: "1.0.0",
Description: "My custom plugin",
Author: "Your Name",
Hooks: []plugin.Hook{plugin.HookPostPublish},
}
}
func (p *MyPlugin) Execute(ctx context.Context, req plugin.ExecuteRequest) (*plugin.ExecuteResponse, error) {
parser := helpers.NewConfigParser(req.Config)
// ... plugin logic
return &plugin.ExecuteResponse{Success: true}, nil
}
func (p *MyPlugin) Validate(ctx context.Context, config map[string]any) (*plugin.ValidateResponse, error) {
return &plugin.ValidateResponse{Valid: true}, nil
}
func main() {
plugin.Serve(&MyPlugin{})
}

  1. Test with dry run first

    Terminal window
    relicta publish --dry-run
  2. Validate configuration

    Terminal window
    relicta validate
  3. Enable error notifications

    plugins:
    - name: slack
    config:
    notify_on_error: true
  4. Enable plugins incrementally - Add one plugin at a time to identify issues.

  5. Pin plugin versions for reproducible releases:

    Terminal window
    relicta plugin install [email protected]