Getting it into your agent
One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.
npx skills add bendaamerahmed/backstage-idp-plugin --skill backstage-kubernetesgit clone --depth 1 https://github.com/bendaamerahmed/backstage-idp-pluginWrote this? Show the measurements
A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.
[](https://agentmods.dev/skills/bendaamerahmed/backstage-idp-plugin/backstage-kubernetes)<a href="https://agentmods.dev/skills/bendaamerahmed/backstage-idp-plugin/backstage-kubernetes"><img src="https://agentmods.dev/badge/skills/bendaamerahmed/backstage-idp-plugin/backstage-kubernetes/github.svg" alt="Measured on agentmods" height="20"></a>Or the 80×15 button, for a site that already has a row of RSS and ATOM ones. Only the verdict fits; the numbers stay here.
<a href="https://agentmods.dev/skills/bendaamerahmed/backstage-idp-plugin/backstage-kubernetes"><img src="https://agentmods.dev/badge/skills/bendaamerahmed/backstage-idp-plugin/backstage-kubernetes.svg" alt="Reviewed on agentmods" width="80" height="20"></a>What it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5.1 | $0.00037 | $0.02220 |
| Opus 5 | $0.00018 | $0.01110 |
| Sonnet 5 | $0.00007 | $0.00444 |
| Haiku 4.5 | $0.00004 | $0.00222 |
Grade A, and why
backstage-kubernetes scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 11d ago.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Nothing flagged
None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.
How it starts
The opening of the file, as written. The whole thing — 147 lines — stays where its author put it; the contents beside it link to each section on GitHub.
Backstage Kubernetes
Make a service's real cluster workloads — including your own custom resources — appear on its entity page. Four things must line up: the cluster is reachable, Backstage is authorised on it, the entity is annotated, and the object type is requested. A miss on any one shows as an empty tab.
Preconditions
- Backend generation known. New backend system:
backend.add(import('@backstage/plugin-kubernetes-backend'))inpackages/backend/src/index.ts. Legacy: acreateRouterunderpackages/backend/src/plugins/, which must be migrated before adding modules (backstage-plugin-migrate). Frontend: NFS consumes the plugin's/alphaexport; legacy importsEntityKubernetesContentinto the entity page. - Cluster reachability from the backend, not from your laptop. A cluster behind a VPN the backend pod cannot reach fails identically to a wrong URL.
- Exact config shapes read from the installed
@backstage/plugin-kubernetes-backendconfig.schema.json, and exact annotation constants from@backstage/plugin-kubernetes-common. Both move. - Read access to the cluster's RBAC, because surfacing a CRD needs an explicit grant and that grant is usually the missing piece.
- Any change to a real cluster's RBAC or service accounts is external mutation: stop and return a BLOCKED report with the exact Role and ClusterRole rules needed, rather than applying them.
Procedure
- Establish which of the four layers is missing before editing config.
Query the backend directly:
POST /api/kubernetes/services/<entity-name>with a user token. A200with an empty array is an annotation or selector problem; a500naming a cluster is reachability or auth; a404means the plugin is not wired at all. - Choose a cluster locator method.
configlists clusters inline and is right for a handful.catalogreads them fromResourceentities of typekubernetes-cluster, which scales and keeps cluster inventory in the catalog.gkediscovers GKE clusters in a project.localKubectlProxyis development only — it assumeskubectl proxyon the developer's machine and must never reach a deployed config. - Declare clusters under
kubernetes.clusterLocatorMethods. Per cluster the fields areurl,name, and one of the auth arrangements: aserviceAccountToken, or anauthProviderwithauthMetadata. Optional:title,skipTLSVerify,skipMetricsLookup,caData,caFile,oidcTokenProvider, and a per-clustercustomResources. Every credential is${ENV_VAR}or a$env/$filereference — never a literal. - Pick
serviceLocatorMethoddeliberately.multiTenantqueries every cluster for every entity and is the usual default.singleTenantandcatalogRelationnarrow that. On a large fleetmultiTenantis a latency and rate-limit problem before it is a correctness one. - Annotate the entities.
backstage.io/kubernetes-idmatches objects carrying thebackstage.io/kubernetes-idlabel with the same value — the label goes on your workloads, in your manifests or Helm chart, and is the half people forget.backstage.io/kubernetes-label-selectorreplaces that with an arbitrary selector and wins when both are present. Namespace can be narrowed with the namespace annotation. Validate withbackstage-catalog. - Request the object types you want.
kubernetes.objectTypesacceptspods,services,configmaps,deployments,limitranges,resourcequotas,replicasets,horizontalpodautoscalers,jobs,cronjobs,ingresses,statefulsets,daemonsetsandcustomresources. Setting it at all replaces the default set — a list that omitspodshides pods, which reads as a broken plugin. - Declare each CRD you want surfaced in
kubernetes.customResourcesas{ group, apiVersion, plural }. All three are required,apiVersionis the version alone (notgroup/version), andpluralis the CRD'sspec.names.plural— not the Kind. Declare them per cluster instead when only some clusters have the operator installed. Seekubernetes-crd-authorwhen the CRD is one you own. - Grant RBAC for the custom resources. The default guidance grants the core
workload types only; a CRD needs its own
apiGroups/resourcesrule withget,listandwatch. This is the most common reason a correctly declared CRD stays invisible. Prepare the ClusterRole and stop for authorization before anything is applied to a real cluster. - Restrict what reaches the frontend. The plugin returns whole objects, so a
Secret-adjacent CRD or one with credentials in
specexposes them to every user who can see the entity. Decide per CRD whether it should be surfaced at all, and treat that as a data-exposure review, not a config change. - Wire the frontend for the repo's generation and confirm the tab renders for an entity you know has workloads, not for an arbitrary one.
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- 11d ago First seen · 147 lines · 37 tokens per session scan A 7c3fd600b31a
backstage-kubernetes is a skill published in the GitHub repository bendaamerahmed/backstage-idp-plugin (1 stars, last pushed 1mo ago), licensed MIT. It adds 37 tokens to every session and 2,220 once invoked, about $0.0002 per session on Opus 5. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-31.
Other skills, from other repositories
deploy
Elixir/Phoenix deployment patterns — Dockerfile, fly.toml, runtime.exs, mix release, rel/ overlays. Use when configuring Fly.io, Docker, CI/CD, health checks, or production migrations.
companion-clis
Companion CLIs for Runpod workflows — HuggingFace, GitHub, Docker, and AWS.
gen-devcontainer
Generate a .devcontainer/devcontainer.json keyed to the project's primary language so gh codespace create (or VS Code's "Reopen in Container") gives anyone on the team a ready-to-go env with the right runtime, GH CLI, git-lfs, and language-tier VS Code extensions pre-installed. Preview-by-default; idempotent on apply…
strut
Operate and manage Docker Compose stacks on VPS infrastructure with the strut CLI. Use for any strut task — deploying and releasing services, database backup and restore, debugging production issues, detecting config drift, rotating secrets and keys, setting up monitoring, configuring domains and SSL, validating…
dockerized-service-release-deployment-workflow
Create a Dockerized-service release contract with clean GitHub Actions builds, main-anchored tags, immutable digest manifests, published-release deployments, production approval, health checks, and exact-digest rollback.
linux-development-vm-workflow
Prepare and reset persistent Linux development guests on macOS. Use when comparing container machine, Lima or Colima, and full VMs for distros, init systems, services, custom boot, disks, Rosetta, or nested virtualization.