This skill should be used when the user asks to "export dynamic plugin", "package plugin as OCI", "create plugin container image", "publish plugin to registry", "build OCI artifact", "package plugin as tgz", "push plugin to quay.io", "create dynamic plugin archive", "bundle multiple plugins", "generate integrity hash", or mentions exporting, packaging, or publishing an existing Backstage plugin for RHDH deployment. This skill handles the export and packaging workflow after a plugin has been implemented.
Packages Backstage plugins as OCI images, tgz archives, or npm packages for RHDH deployment.
/plugin marketplace add durandom/rhdh-skill/plugin install rhdh-plugin@rhdhThis skill inherits all available tools. When active, it can use any tool Claude has access to.
examples/dynamic-plugins.yamlreferences/export-options.mdreferences/integrity-hashes.mdreferences/packaging-formats.mdExport and package Backstage plugins as RHDH dynamic plugins for deployment. This skill covers the build, export, and packaging workflow that transforms a developed plugin into a deployable artifact (OCI image, tgz archive, or npm package).
Note: This skill is for exporting and packaging already-implemented plugins. For creating new plugins, use the backend or frontend plugin creation skills first.
Use this skill when you need to:
Before starting, ensure:
yarn build)podman or docker)dist-dynamic/ with RHDH CLIBefore exporting, ensure the plugin builds successfully:
cd plugins/<plugin-id> # or plugins/<plugin-id>-backend
yarn build
yarn tsc # Verify no TypeScript errors
Run the RHDH CLI export command from the plugin directory:
npx @red-hat-developer-hub/cli@latest plugin export
This creates a dist-dynamic/ directory containing:
package.json with peer/bundled dependenciesdist-scalprum/ with webpack federated modulesBy default, all @backstage/* packages are shared (provided by RHDH at runtime). Override this behavior:
# Bundle a @backstage package instead of sharing
npx @red-hat-developer-hub/cli@latest plugin export \
--shared-package '!/@backstage/plugin-notifications/'
# Mark a non-backstage package as shared
npx @red-hat-developer-hub/cli@latest plugin export \
--shared-package @my-org/shared-utils
Embed workspace or third-party packages into the plugin:
npx @red-hat-developer-hub/cli@latest plugin export \
--embed-package @my-org/plugin-common \
--embed-package @my-org/utils
npx @red-hat-developer-hub/cli@latest plugin export \
--shared-package '!/@backstage/plugin-notifications/' \
--embed-package @internal/common-utils
See references/export-options.md for all available options.
Choose a packaging format based on your deployment needs.
Create a container image:
npx @red-hat-developer-hub/cli@latest plugin package \
--tag quay.io/<namespace>/<plugin-name>:v0.1.0
Specify container tool if needed:
npx @red-hat-developer-hub/cli@latest plugin package \
--container-tool docker \
--tag quay.io/<namespace>/<plugin-name>:v0.1.0
Available tools: podman (default), docker, buildah
Create a tar archive for HTTP distribution:
cd dist-dynamic
npm pack
Get the integrity hash:
npm pack --json | jq -r '.[0].integrity'
Publish to a private npm registry:
cd dist-dynamic
npm publish --registry https://your-private-registry.com
Bundle frontend and backend plugins in one image:
# Export both plugins first
cd plugins/my-plugin && npx @red-hat-developer-hub/cli@latest plugin export
cd ../my-plugin-backend && npx @red-hat-developer-hub/cli@latest plugin export
# Package together from monorepo root
cd ../..
npx @red-hat-developer-hub/cli@latest plugin package \
--tag quay.io/<namespace>/my-plugin-bundle:v0.1.0
See references/packaging-formats.md for detailed format comparison.
# Podman
podman push quay.io/<namespace>/<plugin-name>:v0.1.0
# Docker
docker push quay.io/<namespace>/<plugin-name>:v0.1.0
Set the auth file environment variable:
export REGISTRY_AUTH_FILE=~/.config/containers/auth.json
# or
export REGISTRY_AUTH_FILE=~/.docker/config.json
After pushing, get the digest for reproducible deployments:
podman inspect --format='{{.Digest}}' quay.io/<namespace>/<plugin-name>:v0.1.0
Use digest in dynamic-plugins.yaml:
plugins:
- package: oci://quay.io/<namespace>/<plugin-name>@sha256:abc123...!<plugin-id>-dynamic
disabled: false
Test the exported plugin before publishing:
# Copy to local RHDH instance
cp -r dist-dynamic /path/to/rhdh/dynamic-plugins-root/<plugin-id>-dynamic
# Start RHDH and verify plugin loads
yarn workspace backend start
Check logs for:
loaded dynamic backend plugin - SuccessSkipping disabled dynamic plugin - Plugin disabled in configplugins:
- package: oci://quay.io/<namespace>/<plugin-name>:v0.1.0!<plugin-id>-backend-dynamic
disabled: false
pluginConfig:
myPlugin:
apiUrl: https://api.example.com
plugins:
- package: oci://quay.io/<namespace>/<plugin-name>:v0.1.0!<plugin-id>
disabled: false
pluginConfig:
dynamicPlugins:
frontend:
my-org.plugin-my-plugin:
dynamicRoutes:
- path: /my-plugin
importName: MyPage
plugins:
# Frontend from bundle
- package: oci://quay.io/<namespace>/my-bundle:v0.1.0!my-plugin
disabled: false
pluginConfig:
dynamicPlugins:
frontend:
my-org.plugin-my-plugin:
mountPoints:
- mountPoint: entity.page.overview/cards
importName: MyCard
# Backend from same bundle
- package: oci://quay.io/<namespace>/my-bundle:v0.1.0!my-plugin-backend-dynamic
disabled: false
See examples/dynamic-plugins.yaml for complete examples.
Missing dependencies:
yarn add -D <missing-package>
npx @red-hat-developer-hub/cli@latest plugin export
TypeScript errors:
yarn tsc
# Fix errors, then retry export
Clear stale artifacts:
rm -rf dist dist-dynamic
yarn build
npx @red-hat-developer-hub/cli@latest plugin export
Container tool not found:
# Specify available tool
npx @red-hat-developer-hub/cli@latest plugin package \
--container-tool docker \
--tag quay.io/<namespace>/<plugin-name>:v0.1.0
Permission denied:
# Check registry login
podman login quay.io
Regenerate the hash:
cd dist-dynamic
npm pack --json | jq -r '.[0].integrity'
Update dynamic-plugins.yaml with new hash.
references/export-options.md - All export CLI optionsreferences/packaging-formats.md - Format comparison and best practicesreferences/integrity-hashes.md - Hash generation and verificationexamples/dynamic-plugins.yaml - Complete configuration examplesActivates when the user asks about AI prompts, needs prompt templates, wants to search for prompts, or mentions prompts.chat. Use for discovering, retrieving, and improving prompts.
Search, retrieve, and install Agent Skills from the prompts.chat registry using MCP tools. Use when the user asks to find skills, browse skill catalogs, install a skill for Claude, or extend Claude's capabilities with reusable AI agent components.
Creating algorithmic art using p5.js with seeded randomness and interactive parameter exploration. Use this when users request creating art using code, generative art, algorithmic art, flow fields, or particle systems. Create original algorithmic art rather than copying existing artists' work to avoid copyright violations.