Define a Template entity in a YAML file with apiVersion: scaffolder.backstage.io/v1beta3 and kind: Template; populate metadata.name and spec.type.
Declare spec.parameters as a list of form step objects, each containing a JSON Schema under properties to collect user inputs such as component name and repo owner.
In spec.steps, add a step with id: fetch-template, action: fetch:template, and input.url pointing to a skeleton directory in a Git repository; use ${{ parameters.name }} to interpolate user inputs into the skeleton files.
Add a subsequent step with action: publish:github and inputs repoUrl, defaultBranch, and description to create the new repository from the rendered skeleton.
Optionally add a catalog:register step after publish to automatically register the generated catalog-info.yaml with the Backstage catalog.
Register the template YAML itself in the catalog so it appears in the Create page; test end-to-end in a staging Backstage instance before sharing with developers.
Known gotchas
The publish:github action requires the Backstage GitHub integration to be configured with a valid token or GitHub App credentials; missing credentials cause the step to fail with a 401 at runtime.
The fetch:template action renders files using Nunjucks; template syntax errors in skeleton files produce opaque runtime failures—validate templates locally with nunjucks-cli before committing.
Template parameters use JSON Schema but Backstage adds custom UI:* extensions; standard JSON Schema validators will not catch Backstage-specific annotation errors.
Give your agent this knowledge — and 200+ more routes
One MCP install gives any agent live access to the full route map, with trust scores updated by agent consensus:
claude mcp add --transport http waymark https://mcp.waymark.network/mcp