Free CBA (Certified Backstage Associate) practice: the 4 official domains, exam-style questions, a timed practice exam and more.
Play the CBA map → · Official CBA exam page
Run locally, local dev workflows, TypeScript builds, Yarn dependencies, Docker images
The framework, configuration, production deployment, client-server architecture
Why a catalog, populating it, annotations, locations, ingestion and troubleshooting
Frontend vs backend plugins, customizing plugins, React code, Material UI
Answer: Yarn. The monorepo uses Yarn workspaces.
Answer: packages/app. The backend lives in packages/backend; your own plugins under plugins/.
Answer: plugins/. Each plugin is its own workspace package.
Answer: app-config.local.yaml. It is git-ignored by default and loaded after app-config.yaml in development.
Answer: The active and maintenance LTS releases. Check the release notes for the exact supported versions.
Answer: yarn test (backstage-cli package test). Repo-wide: yarn test:all.
Answer: yarn lint:all. Packages can be linted individually with yarn lint.
Answer: A bundle (dist/bundle.tar.gz) of the backend plus the built frontend. The Dockerfile copies this bundle into the image.
Answer: The backend build expects type declarations to be generated and type errors caught first. The documented host build runs yarn install, yarn tsc, then yarn build:backend.
Answer: It builds everything inside Docker, so the host needs no Node toolchain. The final stage contains only what is needed to run.
Answer: 7007. The frontend dev server runs on 3000.
Answer: yarn backstage-cli versions:bump. Read the release notes and changelog for required changes.
Answer: Showing the template changes between two create-app versions to apply to your app. Scaffolded files are yours, so template changes must be applied manually.
Answer: The --config flags passed to the backend command. e.g. node packages/backend --config app-config.yaml --config app-config.production.yaml.
Answer: You own and compose the app code; upstream provides packages you upgrade. This is why create-app generates a full repository.
Answer: Through the backend base URL configured in app-config (backend.baseUrl). app.baseUrl and backend.baseUrl must be set correctly for each environment.
Answer: The shared root tsconfig.json used by yarn tsc. Type-checking runs across the whole monorepo.
Answer: In that plugin’s own package.json. Add them with yarn --cwd plugins/<name> add <dep>.
Answer: The example catalog locations configured in app-config.yaml. The scaffolded config includes examples so a fresh app is not empty.
Answer: The frontend app; Backend plugins; Databases/storage used by plugins. Plugins integrate external systems on both frontend and backend.
Answer: Forwards frontend requests to third-party APIs, adding headers such as auth server-side. Configured under proxy.endpoints in app-config.yaml.
Answer: Config values marked visible in a config schema are bundled/served to the frontend. Never mark secrets as frontend-visible.
Answer: ${MY_VAR}. $file and $include are other supported directives.
Answer: backend.database.client: pg. Connection details go under backend.database.connection.
Answer: A Deployment of your Backstage image with PostgreSQL, config and secrets. You build your own image because the app is your code.
Answer: A sign-in resolver. Without a resolver, users cannot sign in to a production app.
Answer: Which users may perform which actions on which resources (e.g. deleting catalog entities). Policies are written in TypeScript as a backend module.
Answer: The scheduler core service. Tasks can be coordinated across backend replicas.
Answer: Each plugin gets its own logical database (or schema) via the database service. pluginDivisionMode can choose databases or schemas.
Answer: The backend, via the app backend plugin. Serving the frontend separately is also possible.
Answer: Run multiple replicas behind a load balancer with a shared PostgreSQL database. In-memory SQLite cannot be shared between replicas.
Answer: auth.providers. integrations holds tokens for reading from GitHub/GitLab etc.
Answer: Integrations let Backstage read from systems (e.g. GitHub API); auth providers let users sign in. Both may use GitHub, but with different credentials and purposes.
Answer: A backend instance (createBackend) with backend.add(...) for plugins and modules. Services are injected through dependency injection.
Answer: An extension that adds features to an existing backend plugin, e.g. a catalog entity provider. Modules extend plugins via extension points.
Answer: To serve it over HTTPS on a stable hostname matching app.baseUrl. Auth callbacks also need the correct public URLs.
Answer: Component. Resources are infrastructure such as databases; Systems group components.
Answer: Resource. Components declare dependsOn relations to Resources.
Answer: API. Components declare providesApis and consumesApis.
Answer: type; lifecycle; owner. e.g. type: service, lifecycle: production, owner: team-a.
Answer: A Group (team) or User entity. Ownership is one of the catalog’s core values.
Answer: github.com/project-slug: org/repo. Many plugins read this well-known annotation.
Answer: backstage.io/techdocs-ref: dir:.. dir:. means the docs live next to catalog-info.yaml.
Answer: backstage.io/kubernetes-id (or a label selector annotation). Resources labelled backstage.io/kubernetes-id=<id> are shown.
Answer: The "Register existing component" page with the file’s URL. This creates a Location entity pointing at the file.
Answer: catalog.locations. Each entry has a type (url or file) and target.
Answer: catalog.rules (allow: [...]). Rules can be set globally or per location.
Answer: After the next processing/refresh cycle (or a manual refresh). Entity providers and processors run on schedules.
Answer: Processing errors on the location/entity; Integration tokens and the URL being reachable. Invalid YAML, schema errors and auth problems are the usual causes.
Answer: An entity whose originating location no longer provides it. Orphans can be cleaned up manually or automatically.
Answer: Template. Templates are ingested into the catalog like other entities.
Answer: Points the catalog at other descriptor files to ingest. A Location can list several targets.
Answer: An org entity provider such as LDAP, GitHub org or Microsoft Entra ID. Ingested org data enables ownership and sign-in resolution.
Answer: yarn new. It offers frontend plugin, backend plugin, module and other templates.
Answer: Import its page component and add a <Route> in packages/app/src/App.tsx. Add a sidebar link in the Root component for navigation.
Answer: As extensions discovered from installed packages, configurable via app-config. Extensions can be enabled, disabled and configured under app.extensions.
Answer: EntitySwitch. EntitySwitch.Case with if={isKind("component")} picks the layout.
Answer: @backstage/core-components. Using them keeps plugins consistent with the rest of the UI.
Answer: Provide a custom theme (createUnifiedTheme) to the app. Themes build on Material UI’s theming.
Answer: Through a client API using discoveryApi (to find the backend URL) and fetchApi. fetchApi adds the user’s identity token automatically.
Answer: A shared service (like errorApi or configApi) obtained with useApi. Plugins can define their own API refs and implementations.
Answer: useEntity. From @backstage/plugin-catalog-react.
Answer: Create the action with createTemplateAction and register it via a scaffolder backend module. Templates then reference it by id in their steps.
Answer: fetch:template. fetch:plain copies files without templating.
Answer: catalog:register. It points at the new repo’s catalog-info.yaml.
Answer: As JSON Schema under spec.parameters, rendered as a form. ui:widget and ui:field customize the form.
Answer: MkDocs with the techdocs-core plugin. Docs are written in Markdown with an mkdocs.yml.
Answer: Generate docs in CI and publish them to cloud storage; Backstage only serves them. Local builder mode is convenient for development only.
Answer: Collators provide documents that an indexer stores in a search engine. The default engine is Lunr; Postgres or Elasticsearch/OpenSearch scale better.
Answer: Use its exported extension points, config options or API overrides. Forking makes upgrades painful.
Answer: In the service entity page layout in EntityPage.tsx with EntityLayout.Route. Each EntityLayout.Route is a tab.
Answer: Use a conditional in EntitySwitch (e.g. isGithubAvailable or a custom if function). Plugins export helpers like isXAvailable for this.
Answer: Material UI (MUI). Backstage UI components are designed to work with its theme.
Answer: Add a SidebarItem with an icon and route in the Root component. In the new frontend system, nav items come from extensions.
Answer: Declare a config schema (config.d.ts) in the plugin package. The schema also controls frontend visibility of each key.
Answer: Adding an entity provider or processor to the catalog backend. e.g. the GitHub org provider is installed as a catalog module.
Answer: Write a frontend component that calls the API through a Utility API and shows it in an InfoCard. Use hooks like useAsync for loading and error states.
Answer: bindRoutes in createApp. External route refs let plugins link to each other without hard dependencies.
Answer: It exports a routable extension (a page) mounted at a route. Component extensions are rendered inside other pages instead.
Answer: npx @backstage/create-app@latest. create-app scaffolds the monorepo; `yarn new` adds plugins to an existing app.
Answer: The frontend dev server and the backend, with hot reload. In development the frontend (3000) and backend (7007) run side by side.
Answer: yarn backstage-cli versions:bump. versions:bump updates every Backstage dependency together, matching a release.
Answer: Reference it as ${GITHUB_TOKEN} and provide the environment variable at runtime. Config supports environment substitution, so secrets come from the environment or a secret store.
Answer: PostgreSQL. In-memory SQLite loses everything on restart; production setups use PostgreSQL.
Answer: In a backend plugin (or the proxy), never in the browser bundle. Anything in the frontend ships to every user’s browser; secrets stay server-side.
Answer: catalog-info.yaml. The entity descriptor lives with the code; locations or providers point the catalog at it.
Answer: An entity provider (e.g. GitHub discovery) running on a schedule. Automated ingestion scans the organization and keeps the catalog in sync.
Answer: Group; System. Group/User model teams; System/Domain group components. Pods and Namespaces are Kubernetes objects.
Answer: packages/app/src/components/catalog/EntityPage.tsx. The entity page layout is React code in the app package.
Answer: backend.add(import('@backstage/plugin-xyz-backend')) in packages/backend/src/index.ts. The new backend system composes plugins and modules with backend.add().
Answer: Software Templates (the scaffolder). Templates define parameters and steps like fetch:template, publish:github and catalog:register.