bsctl can show custom columns per entity type by reading annotation values from your catalog entities.
# Preview what columns would be generated
bsctl columns generate -t service
# Save directly to .bsctl/columns/
bsctl columns generate -t service --write
bsctl columns generate -t website --writeCreate files in .bsctl/columns/<type>.yaml:
# .bsctl/columns/service.yaml
- header: On-Call
path: metadata.annotations.pagerduty.com/service-id
- header: Grafana
path: metadata.annotations.grafana.com/dashboard-url
- header: Language
path: metadata.annotations.backstage.io/language# .bsctl/columns/website.yaml
- header: Environment
path: metadata.annotations.example.com/environment
style: env # dev=blue, preview=yellow, prod=green
- header: URL
path: metadata.annotations.example.com/urlDot-separated paths into the entity JSON. For annotation keys containing dots (e.g., pagerduty.com/service-id), the resolver automatically tries joining remaining segments:
metadata.annotations.pagerduty.com/service-id
^^^^^^^^ ^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^
| | |
| | annotation key (joined: "pagerduty.com/service-id")
| object key
object key
The optional style field supports:
env— Colors values by environment:dev(blue),preview(yellow),prod(green)
Exclude noisy annotations from both columns generate and catalog list display:
# .bsctl/columns.ignore
backstage.io/*
*/managed-by-*
*/source-location
Patterns:
*suffix— Matches annotation keys ending withsuffixprefix*— Matches keys starting withprefixexact-key— Exact match
.bsctl/
columns.ignore # Exclude patterns
columns/
service.yaml # Columns for -t service
website.yaml # Columns for -t website
When catalog list -t <type> is used and a matching column file exists, custom columns are shown. Otherwise, standard columns (Name, Kind, Type, Owner, Description) are displayed.
Custom columns also apply to the MCP catalog_list tool, returning compact JSON with only the defined fields.