Entity Feedback adds a simple way to collect signal on every catalog entity in Backstage. It lets engineers rate what they see in context. No new tool to open. A quick click records a like or a star rating while you browse a service, a website, a library, or docs.
When someone leaves a low score, the plugin can prompt for more detail. The dialog offers a few common reasons with room for a short note. That extra context shows up beside the rating so owners can see what needs work. Each entity gets its own feedback view. Teams can also see an overview of ratings across the things they own. You get totals for likes and dislikes. You get simple star breakdowns. The goal is fast feedback with little friction.
Common uses include keeping TechDocs accurate, spotting stale or missing metadata, and tracking sentiment during a migration. Product teams can watch adoption for new templates or plugins. Platform teams can scan ratings across a group to spot problem areas. It fits self hosted Backstage setups where you want quick input from busy engineers. Add it when you are ready to close the loop between your catalog and the people who use it every day.
Installation Instructions
These instructions apply to self-hosted Backstage only.
Install the frontend package
This plugin needs sign in and identity configured in your app. The guest identity will not work.
From your Backstage root
yarn --cwd packages/app add @backstage-community/plugin-entity-feedback
Add UI to the legacy frontend
Open packages/app src components catalog EntityPage.tsx
Import the components
import { InfoCard } from '@backstage/core-components';
import {
EntityFeedbackResponseContent,
EntityLikeDislikeRatingsCard,
LikeDislikeButtons,
// Optional star variant
// EntityStarredRatingsCard,
// StarredRatingButtons,
} from '@backstage-community/plugin-entity-feedback';
Add rating buttons to an overview section for the kinds you want to support
// inside an overview grid on an entity page
<Grid container spacing={3} alignItems="stretch">
{/* other cards */}
<Grid item md={2}>
<InfoCard title="Rate this entity">
<LikeDislikeButtons />
{/*
To use stars instead of like or dislike
<StarredRatingButtons />
*/}
</InfoCard>
</Grid>
{/* other cards */}
</Grid>
Add a feedback tab to an entity page so owners can see responses
// inside your EntityLayout for a service or similar kind
<EntityLayout.Route path="/feedback" title="Feedback">
<EntityFeedbackResponseContent />
</EntityLayout.Route>
Add a ratings table to user and group pages to show ratings for owned entities
// user entity page
<EntityLayout.Route path="/" title="Overview">
<Grid container spacing={3}>
{/* other content */}
<Grid item xs={12}>
<EntityLikeDislikeRatingsCard />
{/*
To show star based table instead
<EntityStarredRatingsCard />
*/}
</Grid>
</Grid>
</EntityLayout.Route>
// group entity page
<EntityLayout.Route path="/" title="Overview">
<Grid container spacing={3}>
{/* other content */}
<Grid item xs={12}>
<EntityLikeDislikeRatingsCard />
</Grid>
</Grid>
</EntityLayout.Route>
Enable the plugin in the new frontend system
Detect the package via config
app config yaml
app:
packages: 'all'
Or limit discovery to this package
app:
packages:
include:
- '@backstage-community/plugin-entity-feedback'
Enable via code
packages app src App.tsx
import { createApp } from '@backstage/frontend-defaults';
import entityFeedbackPlugin from '@backstage-community/plugin-entity-feedback/alpha';
const app = createApp({
features: [
entityFeedbackPlugin,
],
});
export default app;
Configure extensions
You can customize or disable the installed extensions
app:
extensions:
# Disable the buttons card
- 'entity-card:entity-feedback/ratings-buttons': false
# Customize the buttons card
- 'entity-card:entity-feedback/ratings-buttons':
config:
variant: 'starred' # defaults to like-dislike
title: 'Rating Buttons' # defaults to Rate this entity
requestResponse: false # defaults to true
dialogTitle: 'What could be better'
dialogResponses:
- id: 'inaccurate'
label: 'Inaccurate'
- id: 'other'
label: 'Other'
# Disable the ratings table card
- 'entity-card:entity-feedback/ratings-table': false
# Customize the ratings table card
- 'entity-card:entity-feedback/ratings-table':
config:
variant: 'starred' # defaults to like-dislike
title: 'Rating Table' # defaults to Entity Ratings
allEntities: true # defaults to false
# Disable the feedback entity content tab
- 'entity-content:entity-feedback': false
# Customize the feedback entity content tab
- 'entity-content:entity-feedback':
config:
path: '/feedbacks'
title: 'Feedbacks'
Install the backend
Install the backend package
yarn --cwd packages/backend add @backstage-community/plugin-entity-feedback-backend
Wire up the new backend system
packages backend src index.ts
import { createBackend } from '@backstage/backend-defaults';
const backend = createBackend();
// Registers the entity feedback backend plugin
backend.add(import('@backstage-community/plugin-entity-feedback-backend'));
backend.start();
This backend needs identity in place so the service can tie feedback to users. It likely uses your app database. Keep your database plugin configured.
Wire up the legacy backend system
Create a backend plugin module
packages backend src plugins entityFeedback.ts
import { createRouter } from '@backstage-community/plugin-entity-feedback-backend';
import { Logger } from 'winston';
import { PluginEnvironment } from '../types';
import { Router } from 'express';
export default async function createPlugin(
env: PluginEnvironment,
): Promise<Router> {
// The router expects standard services from the plugin environment
// logger identity discovery database
return await createRouter({
logger: env.logger as Logger,
discovery: env.discovery,
identity: env.identity,
database: env.database,
});
}
Mount the router
packages backend src index.ts
import entityFeedback from './plugins/entityFeedback';
// createEnv is your existing helper that builds a PluginEnvironment
const entityFeedbackEnv = useHotMemoize(module, () => createEnv('entity-feedback'));
async function main() {
const apiRouter = Router();
// other plugin mounts
apiRouter.use(
'/entity-feedback',
await entityFeedback(entityFeedbackEnv),
);
// start the server as you do for other plugins
}
Notes on usage
- The ratings buttons go on the entity overview so users can rate items
- The feedback tab shows responses for the current entity
- The ratings card on user or group pages shows ratings for owned entities
- Use the star components if you prefer star ratings over like or dislike
Changelog
This changelog is produced from commits made to the Entity Feedback plugin since a year ago, and based on the code located here. It may not contain information about all commits. Releases and version bumps are intentionally omitted. This changelog is generated by AI.
Features
- Migrate the Entity Feedback frontend plugin to the new Backstage frontend system with an alpha subpath export. Legacy exports stay the same. #5393 merged 10 days ago
- Notify entity owners when feedback is created using the Backstage notification service. #3558 merged 6 months ago
Bug fixes
- Handle decoded entity refs that caused 404 errors in some setups. #3116 merged 7 months ago
Documentation
- Update README links to point to the community plugins repository. #3931 merged 5 months ago
Maintenance
- Remove unused dev dependency canvas. #3565 merged 6 months ago
- Reduce knip false positives by updating repo tools. No user impact. #3018 merged 7 months ago
- Remove references to backend common in the entity feedback backend. #1972 merged 11 months ago
Breaking changes
- None
Set up Backstage in minutes with Roadie
Focus on using Backstage, rather than building and maintaining it.