# Backstage Community Plugins Backstage Community Plugins is a collaborative repository where the Backstage community develops, maintains, and shares plugins for the Backstage developer portal platform. This monorepo contains over 100 workspaces, each hosting one or more plugins that extend Backstage's functionality with integrations for CI/CD tools, cloud services, security scanning, observability platforms, and more. All plugins are published under the `@backstage-community` npm scope and follow standardized release processes using changesets. The repository is designed to provide plugin maintainers with established workflows, tooling, and community support while keeping plugin development separate from the core Backstage repository. Each workspace operates as an independent yarn workspace with its own changesets, releases, and CODEOWNERS, making plugins portable and easy to manage. Plugins include frontend components that integrate with Backstage's EntityPage, backend services that provide APIs, and catalog modules that import data from external systems. ## Creating a New Workspace Create a new plugin workspace to host your Backstage plugins using the workspace creation command. ```bash # Clone the repository and install dependencies git clone https://github.com/backstage/community-plugins.git cd community-plugins yarn install # Create a new workspace interactively yarn create-workspace # Follow the prompts to name your workspace # Navigate to your new workspace cd workspaces/your-workspace-name yarn install # Create a new plugin within the workspace yarn new # Select plugin type: frontend-plugin, backend-plugin, etc. ``` ## Creating Changesets for Releases Create changesets to document changes and trigger automated releases. ```bash # Navigate to your workspace root cd workspaces/your-workspace-name # Create a new changeset yarn changeset # Select packages that changed # ? Which packages would you like to include? # > @backstage-community/plugin-your-plugin # Select semver bump type # ? Which packages should have a major bump? # ? Which packages should have a minor bump? # > @backstage-community/plugin-your-plugin # Enter changeset description # ? Please enter a summary for this change: # > Added new feature for displaying deployment status # Commit the generated changeset file git add .changeset/*.md git commit -m "Add changeset for deployment status feature" ``` ## GitHub Actions Plugin Installation Display GitHub Actions workflow runs and build status for entities in the Backstage catalog. ```bash # Install the plugin yarn --cwd packages/app add @backstage-community/plugin-github-actions ``` ```tsx // packages/app/src/components/catalog/EntityPage.tsx import { EntityGithubActionsContent, isGithubActionsAvailable, } from '@backstage-community/plugin-github-actions'; const serviceEntityPage = ( {/* Overview content */} ); // Optional: Use card view with branch selection ``` ```yaml # catalog-info.yaml - Entity annotation apiVersion: backstage.io/v1alpha1 kind: Component metadata: name: my-service annotations: github.com/project-slug: 'organization/repository' spec: type: service lifecycle: production owner: team-a ``` ## Jenkins Plugin Integration Display Jenkins build information, job history, and latest build status for entities. ```bash # Install frontend and backend plugins yarn --cwd packages/app add @backstage-community/plugin-jenkins yarn --cwd packages/backend add @backstage-community/plugin-jenkins-backend ``` ```tsx // packages/app/src/components/catalog/EntityPage.tsx import { EntityJenkinsContent, EntityLatestJenkinsRunCard, isJenkinsAvailable, } from '@backstage-community/plugin-jenkins'; const serviceEntityPage = ( `Latest ${branch} build`} /> ); ``` ```yaml # catalog-info.yaml apiVersion: backstage.io/v1alpha1 kind: Component metadata: name: my-service annotations: jenkins.io/job-full-name: 'folder-name/project-name' spec: type: service owner: team-a ``` ## Tech Radar Plugin Setup Create and display a technology radar visualization to communicate technology choices and recommendations across your organization. ```bash # Install the plugin yarn --cwd packages/app add @backstage-community/plugin-tech-radar ``` ```tsx // packages/app/src/App.tsx import { TechRadarPage } from '@backstage-community/plugin-tech-radar'; const routes = ( } /> ); ``` ```ts // Custom API implementation - packages/app/src/lib/TechRadarClient.ts import { TechRadarApi } from '@backstage-community/plugin-tech-radar'; import { TechRadarLoaderResponse } from '@backstage-community/plugin-tech-radar-common'; export class TechRadarClient implements TechRadarApi { async load(id: string | undefined): Promise { const response = await fetch('/api/tech-radar/data.json'); const data = await response.json(); return { ...data, entries: data.entries.map((entry: any) => ({ ...entry, timeline: entry.timeline.map((t: any) => ({ ...t, date: new Date(t.date), })), })), }; } } // packages/app/src/apis.ts import { techRadarApiRef } from '@backstage-community/plugin-tech-radar'; import { TechRadarClient } from './lib/TechRadarClient'; export const apis: AnyApiFactory[] = [ createApiFactory(techRadarApiRef, new TechRadarClient()), ]; ``` ```json // Tech Radar data format { "title": "Engineering Tech Radar", "quadrants": [ { "id": "1", "name": "Languages & Frameworks" }, { "id": "2", "name": "Tools" }, { "id": "3", "name": "Platforms" }, { "id": "4", "name": "Techniques" } ], "rings": [ { "id": "adopt", "name": "ADOPT", "color": "#93c47d" }, { "id": "trial", "name": "TRIAL", "color": "#93d2c2" }, { "id": "assess", "name": "ASSESS", "color": "#fbdb84" }, { "id": "hold", "name": "HOLD", "color": "#efafa9" } ], "entries": [ { "id": "typescript", "title": "TypeScript", "key": "typescript", "quadrant": "1", "timeline": [ { "moved": 0, "ringId": "adopt", "date": "2024-01-15", "description": "Standard language for all new projects" } ] } ] } ``` ## Argo CD Plugin Configuration Display Argo CD deployment status, application lifecycle, and sync information for Kubernetes applications. ```bash # Install frontend and backend plugins yarn workspace app add @backstage-community/plugin-argocd ``` ```tsx // packages/app/src/components/catalog/EntityPage.tsx import { ArgocdDeploymentSummary, ArgocdDeploymentLifecycle, isArgocdConfigured, } from '@backstage-community/plugin-argocd'; const overviewContent = ( Boolean(isArgocdConfigured(e))}> ); const cicdContent = ( Boolean(isArgocdConfigured(e))}> ); ``` ```yaml # catalog-info.yaml - Using app selector for multiple apps apiVersion: backstage.io/v1alpha1 kind: Component metadata: name: my-service annotations: argocd/app-selector: 'app.kubernetes.io/name=my-service' argocd/instance-name: 'argoInstance1,argoInstance2' backstage.io/kubernetes-id: my-service backstage.io/kubernetes-namespace: production spec: type: service owner: team-a --- # Or use single app annotation apiVersion: backstage.io/v1alpha1 kind: Component metadata: name: my-service annotations: argocd/app-name: 'my-service-prod' argocd/project-name: 'default' spec: type: service owner: team-a ``` ## SonarQube Plugin Integration Display code quality metrics, security vulnerabilities, and code coverage from SonarQube or SonarCloud. ```bash # Install plugins yarn --cwd packages/app add @backstage-community/plugin-sonarqube @backstage-community/plugin-sonarqube-react ``` ```tsx // packages/app/src/components/catalog/EntityPage.tsx import { EntitySonarQubeCard, SonarQubeRelatedEntitiesOverview } from '@backstage-community/plugin-sonarqube'; import { isSonarQubeAvailable } from '@backstage-community/plugin-sonarqube-react'; import { RELATION_HAS_PART } from '@backstage/catalog-model'; const overviewContent = ( ); const systemPage = ( ); ``` ```yaml # catalog-info.yaml apiVersion: backstage.io/v1alpha1 kind: Component metadata: name: my-service annotations: sonarqube.org/project-key: my-instance/my-project-key spec: type: library owner: team-a ``` ## Keycloak Catalog Backend Module Synchronize users and groups from Keycloak realms into the Backstage catalog automatically. ```bash # Install the backend module yarn workspace backend add @backstage-community/plugin-catalog-backend-module-keycloak ``` ```ts // packages/backend/src/index.ts import { createBackend } from '@backstage/backend-defaults'; const backend = createBackend(); backend.add(import('@backstage/plugin-catalog-backend')); backend.add(import('@backstage-community/plugin-catalog-backend-module-keycloak')); backend.start(); ``` ```yaml # app-config.yaml catalog: providers: keycloakOrg: default: baseUrl: https://keycloak.example.com loginRealm: ${KEYCLOAK_REALM} realm: ${KEYCLOAK_REALM} clientId: ${KEYCLOAK_CLIENTID} clientSecret: ${KEYCLOAK_CLIENTSECRET} schedule: frequency: { minutes: 30 } timeout: { minutes: 3 } userQuerySize: 100 groupQuerySize: 100 ``` ```ts // Custom transformer module - plugins/keycloak-transformer/src/module.ts import { GroupTransformer, keycloakTransformerExtensionPoint, UserTransformer, } from '@backstage-community/plugin-catalog-backend-module-keycloak'; import { createBackendModule } from '@backstage/backend-plugin-api'; const customUserTransformer: UserTransformer = async (entity, user, realm, groups) => { // Add custom metadata or transform user entity entity.metadata.annotations = { ...entity.metadata.annotations, 'example.com/keycloak-id': user.id, }; return entity; }; const customGroupTransformer: GroupTransformer = async (entity, realm, groups) => { // Transform group entity return entity; }; export const keycloakTransformerModule = createBackendModule({ pluginId: 'catalog', moduleId: 'keycloak-transformer', register(reg) { reg.registerInit({ deps: { keycloak: keycloakTransformerExtensionPoint }, async init({ keycloak }) { keycloak.setUserTransformer(customUserTransformer); keycloak.setGroupTransformer(customGroupTransformer); }, }); }, }); ``` ## Announcements Plugin Setup Create, manage, and display announcements to users across your Backstage instance with support for categories, banners, and timeline views. ```bash # Install frontend and backend yarn --cwd packages/app add @backstage-community/plugin-announcements yarn --cwd packages/backend add @backstage-community/plugin-announcements-backend ``` ```tsx // packages/app/src/App.tsx import { AnnouncementsPage } from '@backstage-community/plugin-announcements'; const AppRoutes = () => ( } /> ); ``` ```yaml # app-config.yaml - New Frontend System configuration app: extensions: - entity-card:announcements/announcements: config: filter: kind:component,system,group,api - nav-item:announcements - page:announcements: config: title: Company Announcements hideStartAt: true markdownRenderer: md-editor - announcements/banner: config: variant: floating max: 2 category: updates active: true tags: ['security', 'platform'] ``` ```ts // packages/backend/src/index.ts import { createBackend } from '@backstage/backend-defaults'; const backend = createBackend(); backend.add(import('@backstage-community/plugin-announcements-backend')); backend.start(); ``` ## New Frontend System Plugin Registration Register community plugins using Backstage's new frontend system with automatic feature discovery. ```tsx // packages/app/src/App.tsx import { createApp } from '@backstage/frontend-defaults'; import githubActionsPlugin from '@backstage-community/plugin-github-actions/alpha'; import jenkinsPlugin from '@backstage-community/plugin-jenkins/alpha'; import sonarqubePlugin from '@backstage-community/plugin-sonarqube/alpha'; import announcementsPlugin from '@backstage-community/plugin-announcements/alpha'; export const app = createApp({ features: [ // Core features catalogPlugin, searchPlugin, // Community plugins githubActionsPlugin, jenkinsPlugin, sonarqubePlugin, announcementsPlugin, ], }); export default app.createRoot(); ``` ```tsx // Custom API registration with new frontend system import { ApiBlueprint, createApiFactory } from '@backstage/frontend-plugin-api'; import { techRadarApiRef } from '@backstage-community/plugin-tech-radar'; import { TechRadarClient } from './lib/TechRadarClient'; const techRadarApi = ApiBlueprint.make({ name: 'techRadarApi', params: { factory: createApiFactory(techRadarApiRef, new TechRadarClient()), }, }); export const app = createApp({ features: [ createFrontendModule({ pluginId: 'app', extensions: [techRadarApi], }), ], }); ``` ## Building API Reports Generate API documentation reports for plugins to ensure API compatibility and documentation. ```bash # Navigate to workspace cd workspaces/your-workspace # Install dependencies yarn install # Build API reports for all plugins in workspace yarn build:api-reports # Build API report for specific plugin yarn build:api-reports plugins/your-plugin # Fix common package.json issues yarn backstage-cli repo fix --publish # Run type checking yarn tsc # Run tests yarn test # Start development server yarn start ``` ## Local Development Setup Set up a complete local development environment with hot reloading for plugin development. ```bash # Clone and setup git clone https://github.com/backstage/community-plugins.git cd community-plugins yarn install # Navigate to a workspace cd workspaces/github yarn install # Start individual plugin in isolation (faster development) cd plugins/github-actions yarn start # Or start full Backstage environment (if configured) cd ../.. yarn dev # Run workspace tests yarn test # Lint code yarn lint # Format code yarn prettier:fix ``` ```ts // plugins/your-plugin/dev/index.tsx - Frontend plugin dev setup import { createDevApp } from '@backstage/dev-utils'; import { yourPlugin, YourPluginPage } from '../src'; createDevApp() .registerPlugin(yourPlugin) .addPage({ element: , title: 'Your Plugin', path: '/your-plugin', }) .render(); ``` ```ts // plugins/your-plugin-backend/dev/index.ts - Backend plugin dev setup import { createBackend } from '@backstage/backend-defaults'; const backend = createBackend(); backend.add(import('../src')); backend.start(); ``` ## Summary Backstage Community Plugins provides a comprehensive ecosystem of over 200 plugins covering CI/CD integrations (GitHub Actions, Jenkins, Argo CD, Tekton), code quality tools (SonarQube, Code Coverage), cloud services (Azure, GCP, AWS), observability platforms (Grafana, Splunk, New Relic), identity providers (Keycloak, PingIdentity), and many specialized tools. Each plugin follows consistent patterns: frontend plugins export React components and availability checks, backend plugins provide API endpoints and catalog providers, and common packages share types and utilities between frontend and backend. The repository supports both legacy and new Backstage frontend systems, with plugins progressively adding `/alpha` exports for the new system. Plugin development follows established workflows with changesets for versioning, API reports for documentation, and CODEOWNERS for governance. Integration typically involves installing npm packages, adding components to EntityPage layouts, configuring app-config.yaml for backend settings, and annotating catalog entities with plugin-specific annotations to enable features. The modular architecture allows organizations to adopt only the plugins they need while benefiting from community maintenance and standardized release processes.