This skill should be used when the user asks to "create RHDH frontend plugin", "bootstrap frontend dynamic plugin", "create UI plugin for RHDH", "new frontend plugin for Red Hat Developer Hub", "add entity card to RHDH", "create dynamic route", "add sidebar menu item", "configure mount points", "create theme plugin", or mentions creating frontend components, UI pages, entity cards, or visual customizations for Red Hat Developer Hub or RHDH. This skill is specifically for frontend plugins - for backend plugins, use the separate backend plugin skill.
Bootstraps frontend dynamic plugins for Red Hat Developer Hub with UI components and routes.
/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/frontend-plugin-config.yamlBootstrap a new frontend dynamic plugin for Red Hat Developer Hub (RHDH). Frontend dynamic plugins provide UI components, pages, entity cards, themes, and visual customizations that integrate with the RHDH application shell.
Note: This skill covers frontend plugins only. Backend dynamic plugins (APIs, scaffolder actions, processors) are covered in a separate skill.
Use this skill when creating a new frontend plugin intended for RHDH dynamic plugin deployment. This includes:
Do NOT use this skill for:
Before starting, ensure the following are available:
podman or docker)Check the target RHDH version and find the compatible Backstage version. Consult ../rhdh/references/versions.md file for the version compatibility matrix and available RHDH versions.
Ask the user which RHDH version they are targeting if not specified.
Create a new Backstage application in the current directory using the version-appropriate create-app:
# For RHDH 1.8 (adjust version as needed)
echo "backstage" | npx @backstage/create-app@0.7.3 --path .
After creation, install dependencies:
yarn install
If you want to use RHDH themes, follow the steps below. If you don't want to use RHDH themes, skip to Step 4.
Add RHDH theme to Backstage app dependencies:
yarn workspace app add @red-hat-developer-hub/backstage-plugin-theme
Update packages/app/src/App.tsx and apply the themes to createApp:
import { getThemes } from '@red-hat-developer-hub/backstage-plugin-theme';
// ...
const app = createApp({
apis,
// ...
themes: getThemes(),
});
Generate a new frontend plugin:
yarn new --select frontend-plugin --option id=<plugin-id>
The plugin will be created at plugins/<plugin-id>/
Generated structure:
plugins/<plugin-id>/
├── src/
│ ├── index.ts # Public exports
│ ├── plugin.ts # Plugin definition
│ ├── routes.ts # Route references
│ └── components/
│ └── ExampleComponent/
├── package.json
└── dev/
└── index.tsx # Development harness
By default, yarn start uses standard Backstage themes. To preview your plugin with RHDH styling during local development, configure the RHDH theme package.
cd plugins/<plugin-id>
yarn add @red-hat-developer-hub/backstage-plugin-theme
Update dev/index.tsx to use RHDH themes:
import { getAllThemes } from '@red-hat-developer-hub/backstage-plugin-theme';
import { createDevApp } from '@backstage/dev-utils';
import { myPlugin, MyPage } from '../src';
createDevApp()
.registerPlugin(myPlugin)
.addPage({
element: <MyPage />,
title: 'My Plugin',
path: '/my-plugin',
})
.addThemes(getAllThemes())
.render();
getThemes() / useThemes() - Latest RHDH light and dark themesgetAllThemes() / useAllThemes() - All themes including legacy versionsuseLoaderTheme() - Returns Material-UI v5 theme objectNote: When deployed to RHDH, the application shell provides theming automatically. This configuration is only needed for local development.
Create a full-page component for dynamic routes:
// src/components/MyPage/MyPage.tsx
import React from 'react';
import { Page, Header, Content } from '@backstage/core-components';
export const MyPage = () => (
<Page themeId="tool">
<Header title="My Plugin" />
<Content>
<h1>Hello from My Plugin</h1>
</Content>
</Page>
);
Create a card for entity pages:
// src/components/MyCard/MyCard.tsx
import React from 'react';
import { InfoCard } from '@backstage/core-components';
import { useEntity } from '@backstage/plugin-catalog-react';
export const MyEntityCard = () => {
const { entity } = useEntity();
return (
<InfoCard title="My Plugin Info">
<p>Entity: {entity.metadata.name}</p>
</InfoCard>
);
};
Export all components in src/index.ts:
// src/index.ts
export { myPlugin } from './plugin';
export { MyPage } from './components/MyPage';
export { MyEntityCard } from './components/MyCard';
Build and verify:
cd plugins/<plugin-id>
yarn build
Export the plugin as a dynamic plugin and package it for deployment. For detailed export and packaging options, see the export-and-package skill.
cd plugins/<plugin-id>
npx @red-hat-developer-hub/cli@latest plugin export
Output shows the generated Scalprum configuration. Creates dist-dynamic/ with dist-scalprum/ (webpack federated modules).
npx @red-hat-developer-hub/cli@latest plugin package \
--tag quay.io/<namespace>/<plugin-name>:v0.1.0
podman push quay.io/<namespace>/<plugin-name>:v0.1.0
For advanced options (custom Scalprum config, multi-plugin bundles, tgz/npm packaging), consult the export-and-package skill.
Frontend plugins require configuration in dynamic-plugins.yaml to define how they integrate with RHDH.
plugins:
- package: oci://quay.io/<namespace>/<plugin-name>:v0.1.0!my-plugin
disabled: false
pluginConfig:
dynamicPlugins:
frontend:
my-org.plugin-my-plugin: # Must match scalprum.name
dynamicRoutes:
- path: /my-plugin
importName: MyPage
menuItem:
icon: dashboard
text: My Plugin
| Option | Purpose |
|---|---|
dynamicRoutes | Full page routes with optional sidebar menu items |
mountPoints | Entity page cards, tabs, and other integrations |
menuItems | Sidebar ordering and nesting |
appIcons | Custom icons for routes and menus |
entityTabs | New tabs on entity pages |
For complete wiring configuration (mount points, conditional rendering, custom tabs, themes, scaffolder extensions), use the generate-frontend-wiring skill.
If using MUI v5, add class name generator to src/index.ts:
import { unstable_ClassNameGenerator as ClassNameGenerator } from '@mui/material/className';
ClassNameGenerator.configure(componentName =>
componentName.startsWith('v5-') ? componentName : `v5-${componentName}`
);
export * from './plugin';
Apply spacing manually to MUI v5 Grid:
<Grid container spacing={2}>
<Grid item>...</Grid>
</Grid>
references/frontend-wiring.md - Complete mount points, routes, bindingsreferences/entity-page.md - Entity page customizationexamples/frontend-plugin-config.yaml - Complete frontend wiring exampleActivates 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.