diff --git a/.changeset/1724.md b/.changeset/1724.md
deleted file mode 100644
index 2ac03f94e9..0000000000
--- a/.changeset/1724.md
+++ /dev/null
@@ -1,27 +0,0 @@
----
-'@backstage/cli': minor
-'@backstage/plugin-api-docs': minor
-'@backstage/plugin-app-backend': minor
-'@backstage/plugin-auth-backend': minor
-'@backstage/plugin-catalog-graphql': minor
-'@backstage/plugin-catalog': minor
-'@backstage/plugin-circleci': minor
-'@backstage/plugin-explore': minor
-'@backstage/plugin-gcp-projects': minor
-'@backstage/plugin-github-actions': minor
-'@backstage/plugin-gitops-profiles': minor
-'@backstage/plugin-graphiql': minor
-'@backstage/plugin-jenkins': minor
-'@backstage/plugin-kubernetes': minor
-'@backstage/plugin-lighthouse': minor
-'@backstage/plugin-newrelic': minor
-'@backstage/plugin-register-component': minor
-'@backstage/plugin-rollbar': minor
-'@backstage/plugin-scaffolder': minor
-'@backstage/plugin-sentry': minor
-'@backstage/plugin-tech-radar': minor
-'@backstage/plugin-techdocs': minor
-'@backstage/plugin-welcome': minor
----
-
-Create backend plugin through CLI
diff --git a/.changeset/2284.md b/.changeset/2284.md
deleted file mode 100644
index 655cc5a3e8..0000000000
--- a/.changeset/2284.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-'@backstage/core-api': minor
-'@backstage/core': minor
-'@backstage/plugin-auth-backend': minor
----
-
-Add SAML login to backstage
-
-
-
-
diff --git a/.changeset/2515.md b/.changeset/2515.md
deleted file mode 100644
index 32f5edd6b7..0000000000
--- a/.changeset/2515.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-cloudbuild': minor
----
-
-Releasing Google Cloud Build Plugin
diff --git a/.changeset/2532.md b/.changeset/2532.md
deleted file mode 100644
index 14307f6c08..0000000000
--- a/.changeset/2532.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/catalog-model': minor
----
-
-Add handling and docs for entity references
diff --git a/.changeset/2535.md b/.changeset/2535.md
deleted file mode 100644
index bd28f3ce03..0000000000
--- a/.changeset/2535.md
+++ /dev/null
@@ -1,14 +0,0 @@
----
-'@backstage/core': patch
-'@backstage/theme': patch
----
-
-Fix banner position and color
-
-This PR closes: #2245
-
-The "fixed" props added to control the position of the banner. When it is set to true the banner will be shown in bottom of that page and the width will be based on the content of the message.
-
-
-
-
diff --git a/.changeset/2541.md b/.changeset/2541.md
deleted file mode 100644
index 1ba29da040..0000000000
--- a/.changeset/2541.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/theme': minor
----
-
-Tweak dark mode colors
diff --git a/.changeset/2543.md b/.changeset/2543.md
deleted file mode 100644
index 00311ade45..0000000000
--- a/.changeset/2543.md
+++ /dev/null
@@ -1,9 +0,0 @@
----
-'@backstage/plugin-scaffolder-backend': minor
----
-
-Add Azure DevOps support to the scaffolder backend
-
-This adds support for Azure DevOps to the scaffolder (preparer & publisher). I thought I should get this in there now since #2426 has been merged. I had a previous PR with only the preparer but I closed that in favor of this one.
-
-I stayed with the 'azure/api' structure but I guess we should try and go the same way as with GitHub here #2501
diff --git a/.changeset/2562.md b/.changeset/2562.md
deleted file mode 100644
index 716f370ad9..0000000000
--- a/.changeset/2562.md
+++ /dev/null
@@ -1,7 +0,0 @@
----
-'@backstage/create-app': minor
-'@backstage/plugin-auth-backend': minor
-'@backstage/plugin-techdocs-backend': minor
----
-
-Change the default backend plugin mount point to /api
diff --git a/.changeset/2563.md b/.changeset/2563.md
deleted file mode 100644
index 318d5cf5ef..0000000000
--- a/.changeset/2563.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-github-actions': minor
----
-
-Adds a widget to show recent git workflow runs to the github actions plugin. The default setting is the last 5 runs across all branches but both branch and the number of runs are configurable.
diff --git a/.changeset/2565.md b/.changeset/2565.md
deleted file mode 100644
index 92253101ee..0000000000
--- a/.changeset/2565.md
+++ /dev/null
@@ -1,59 +0,0 @@
----
-'@backstage/core-api': patch
----
-
-Add initial RouteRefRegistry
-
-Starting out some work to bring routing back and working as part of the work towards finalizing #1536
-
-This is some of the groundwork of an experiment we're working on to enable routing via RouteRefs, while letting the app itself look something like this:
-
-```jsx
-const App = () => (
-
-
-
- {' '}
- // catalogRouteRef
-
-
-
-
-
-
- // statusRouteRef
-
-
-
-
-
-
-
-
-
- // sentryRouteRef
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-);
-```
-
-As part of inverting the composition of the app, route refs and routing in general was somewhat broken, intentionally. Right now it's not really possible to easily route to different parts of the app from a plugin, or even different parts of the plugin that are not within the same router.
-
-The core part of the experiment is to construct a map of ApiRef[] -> path overrides. Each key in the map is the list of route refs to traversed to reach a leaf in the routing tree, and the value is the path override at that point. For example, the above tree would add entries like [techDocsRouteRef] -> '/docs', and [entityRouteRef, apiDocsRouteRef] -> '/api'. By mapping out the entire app in this structure, the idea is that we can navigate to any point in the app using RouteRefs.
-
-The RouteRefRegistry is an implementation of such a map, and the idea is to add it in master to make it a bit easier to experiment and iterate. This is not an exposed API at this point.
-
-We've explored a couple of alternatives for how to enable routing, but it's boiled down to either a solution centred around the route map mentioned above, or treating all routes as static and globally unique, with no room for flexibility, customization or conflicts between different plugins. We're starting out pursuing this options 😁. We also expect that a the app-wide routing table will make things like dynamic loading a lot cleaner, as there would be a much more clear handoff between the main chunk and dynamic chunks.
diff --git a/.changeset/2575.md b/.changeset/2575.md
deleted file mode 100644
index b08f50ed13..0000000000
--- a/.changeset/2575.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/core': minor
----
-
-Fix dense in Structured Metadata Table
diff --git a/.changeset/2586.md b/.changeset/2586.md
deleted file mode 100644
index 568adb8a3e..0000000000
--- a/.changeset/2586.md
+++ /dev/null
@@ -1,6 +0,0 @@
----
-'@backstage/catalog-model': minor
-'@backstage/plugin-catalog-backend': minor
----
-
-Entirely case insensitive read path of entities
diff --git a/.changeset/2587.md b/.changeset/2587.md
deleted file mode 100644
index 910de1ca04..0000000000
--- a/.changeset/2587.md
+++ /dev/null
@@ -1,9 +0,0 @@
----
-'@backstage/catalog-model': minor
----
-
-Add the User & Group entities
-
-A user describes a person, such as an employee, a contractor, or similar. Users belong to Group entities in the catalog.
-
-A group describes an organizational entity, such as for example a team, a business unit, or a loose collection of people in an interest group. Members of these groups are modeled in the catalog as kind User.
diff --git a/.changeset/2597.md b/.changeset/2597.md
deleted file mode 100644
index 9db25e8d0e..0000000000
--- a/.changeset/2597.md
+++ /dev/null
@@ -1,6 +0,0 @@
----
-'@backstage/catalog-model': minor
-'@backstage/plugin-catalog-backend': minor
----
-
-Add ApiDefinitionAtLocationProcessor that allows to load a API definition from another location
diff --git a/.changeset/2598.md b/.changeset/2598.md
deleted file mode 100644
index 03e10e7db8..0000000000
--- a/.changeset/2598.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-'@backstage/plugin-techdocs': minor
----
-
-Add a message if techdocs takes long time to load
-
-Fixes #2416.
-
-The UI after the change should look like this:
-
-
diff --git a/.changeset/2600.md b/.changeset/2600.md
deleted file mode 100644
index 6fc9775fa1..0000000000
--- a/.changeset/2600.md
+++ /dev/null
@@ -1,19 +0,0 @@
----
-'@backstage/plugin-techdocs-backend': minor
-'@backstage/plugin-proxy-backend': minor
-'@backstage/plugin-auth-backend': minor
-'@backstage/create-app': minor
-'@backstage/backend-common': minor
----
-
-Add service discovery interface and implement for single host deployments
-
-Fixes #1847, #2596
-
-Went with an interface similar to the frontend DiscoveryApi, since it's dead simple but still provides a lot of flexibility in the implementation.
-
-Also ended up with two different methods, one for internal endpoint discovery and one for external. The two use-cases are explained a bit more in the docs, but basically it's service-to-service vs callback URLs.
-
-This did get me thinking about uniqueness and that we're heading towards a global namespace for backend plugin IDs. That's probably fine, but if we're happy with that we should leverage it a bit more to simplify the backend setup. For example we'd have each plugin provide its own ID and not manually mount on paths in the backend.
-
-Draft until we're happy with the implementation, then I can add more docs and changelog entry. Also didn't go on a thorough hunt for places where discovery can be used, but I don't think there are many since it's been pretty awkward to do service-to-service communication.
diff --git a/.changeset/2603.md b/.changeset/2603.md
deleted file mode 100644
index c24d2ea033..0000000000
--- a/.changeset/2603.md
+++ /dev/null
@@ -1,8 +0,0 @@
----
-'@backstage/backend-common': minor
-'@backstage/create-app': minor
----
-
-Make CSP configurable to fix app-backend served app not being able to fetch
-
-See discussion [here on discord](https://discordapp.com/channels/687207715902193673/687235481154617364/758721460163575850)
diff --git a/.changeset/2606.md b/.changeset/2606.md
deleted file mode 100644
index f6059e7705..0000000000
--- a/.changeset/2606.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-auth-backend': patch
----
-
-Move auth provider router creation to router
diff --git a/.changeset/2609.md b/.changeset/2609.md
deleted file mode 100644
index 6bb8ab7a40..0000000000
--- a/.changeset/2609.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/create-app': patch
----
-
-Sync scaffolded backend with example
diff --git a/.changeset/2610.md b/.changeset/2610.md
deleted file mode 100644
index 92ec8dcc0c..0000000000
--- a/.changeset/2610.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-circleci': minor
----
-
-Refactor to use DiscoveryApi
diff --git a/.changeset/2611.md b/.changeset/2611.md
deleted file mode 100644
index cbf3129038..0000000000
--- a/.changeset/2611.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/create-app': patch
----
-
-Remove discovery api override
diff --git a/.changeset/2612.md b/.changeset/2612.md
deleted file mode 100644
index bf093d8f77..0000000000
--- a/.changeset/2612.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-jenkins': patch
----
-
-Refactor to use DiscoveryApi
diff --git a/.changeset/2613.md b/.changeset/2613.md
deleted file mode 100644
index cf8c1a155a..0000000000
--- a/.changeset/2613.md
+++ /dev/null
@@ -1,12 +0,0 @@
----
-'@backstage/plugin-auth-backend': minor
----
-
-Initial implementation of catalog user lookup
-
-This adds a basic catalog client + method for the Google provider to look up users in the catalog. It expects to find a single user entity in the catalog with a google.com/email annotation that matches the email of the Google profile.
-
-Right now it falls back to the old behavior of splitting the email, since I don't wanna break the sign-in flow for existing apps, not yet anyway x).
-
-- Added "@backstage/catalog-model@^0.1.1-alpha.23" as a dependency
-- Added "node-fetch@^2.6.1" as a dependency
diff --git a/.changeset/2614.md b/.changeset/2614.md
deleted file mode 100644
index 7e2660bc80..0000000000
--- a/.changeset/2614.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/create-app': minor
----
-
-Default to using internal scope for new plugins
diff --git a/.changeset/2615.md b/.changeset/2615.md
deleted file mode 100644
index 412b8127c4..0000000000
--- a/.changeset/2615.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/backend-common': minor
----
-
-Use localhost to fall back to IPv4 if IPv6 isn't available
diff --git a/.changeset/2616.md b/.changeset/2616.md
deleted file mode 100644
index 9a70c0e79f..0000000000
--- a/.changeset/2616.md
+++ /dev/null
@@ -1,7 +0,0 @@
----
-'@backstage/create-app': minor
----
-
-Remove identity-backend
-
-Not used, and we're heading down the route of identities in the catalog
diff --git a/.changeset/2623.md b/.changeset/2623.md
deleted file mode 100644
index abd5ce7a4c..0000000000
--- a/.changeset/2623.md
+++ /dev/null
@@ -1,7 +0,0 @@
----
-'@backstage/plugin-catalog': minor
----
-
-Created EntityNotFound component for catalog which displays the 404 page when entity is not found.
-
-Fixes #2266
diff --git a/.changeset/2624.md b/.changeset/2624.md
deleted file mode 100644
index dcfc800713..0000000000
--- a/.changeset/2624.md
+++ /dev/null
@@ -1,17 +0,0 @@
----
-'@backstage/plugin-scaffolder': patch
----
-
-Make title meaningful after component creation
-
-Fixes #2458.
-
-After the change, the UX should look like this:
-
-### If the component creation was successful:
-
-
-
-### If the component creation failed:
-
-
diff --git a/.changeset/2625-catalog-backend.md b/.changeset/2625-catalog-backend.md
deleted file mode 100644
index bcd49dddb2..0000000000
--- a/.changeset/2625-catalog-backend.md
+++ /dev/null
@@ -1,9 +0,0 @@
----
-'@backstage/plugin-catalog-backend': patch
----
-
-Add codeowners processor
-
-- Add `codeowners-utils@^1.0.2` as a dependency
-- Add `core-js@^3.6.5` as a dependency
-- Added new CodeOwnersProcessor
diff --git a/.changeset/2625-cli.md b/.changeset/2625-cli.md
deleted file mode 100644
index c5a5437b69..0000000000
--- a/.changeset/2625-cli.md
+++ /dev/null
@@ -1,7 +0,0 @@
----
-'@backstage/cli': patch
----
-
-Add codeowners processor
-
-- Include ESNext.Promise in TypeScript compilation
diff --git a/.changeset/2628.md b/.changeset/2628.md
deleted file mode 100644
index 0ac36d456a..0000000000
--- a/.changeset/2628.md
+++ /dev/null
@@ -1,22 +0,0 @@
----
-'@backstage/plugin-catalog-backend': minor
----
-
-This feature works the same as \$secret does in config - it allows programmatic substitution of values into a document.
-
-This is particularly useful e.g. for API type entities where you do not want to repeat your entire API spec document inside the catalog-info.yaml file. For those cases, you can instead do something like
-
-```
-apiVersion: backstage.io/v1alpha1
-kind: API
-metadata:
- name: my-federated-service
-spec:
- type: graphql
- definition:
- $text: ./schema.graphql
-```
-
-The textual content of that file will be injected as the value of definition, during each refresh loop. Both relative and absolute paths are supported, as well as any HTTP/HTTPS URL pointing to a service that returns the relevant data.
-
-The initial version supports injection of text file data, and structured data from JSON and YAML files. You can add any handler of your own in addition to these.
diff --git a/.changeset/2630.md b/.changeset/2630.md
deleted file mode 100644
index 933204e292..0000000000
--- a/.changeset/2630.md
+++ /dev/null
@@ -1,9 +0,0 @@
----
-'@backstage/create-app': minor
-'@backstage/plugin-catalog-backend': minor
----
-
-Allow node v14 and add to master build matrix
-
-- Upgrade sqlite3@^5.0.0 in @backstage/plugin-catalog-backend
-- Add Node 14 to engines in @backstage/create-app
diff --git a/.changeset/2637.md b/.changeset/2637.md
deleted file mode 100644
index 9d368634b6..0000000000
--- a/.changeset/2637.md
+++ /dev/null
@@ -1,21 +0,0 @@
----
-'@backstage/plugin-cost-insights': minor
-'@backstage/plugin-explore': minor
----
-
-This PR adds Spotify's Cost Insights Tool. Cost Insights explains costs from cloud services in an understandable way, using software terms familiar to your engineers. This tool helps you and your team make trade-offs between cost optimization efforts and your other priorities.
-
-Cost Insights features:
-
-Daily cost graph by team or billing account
-Cost comparison against configurable business metrics
-Insights panels for configurable cloud products your company uses
-Cost alerts and recommendations
-Selectable time periods for month over month, or quarter over quarter cost comparison
-Conversion of cost growth into average engineer cost (configurable) to help optimization trade-off decisions
-
-
-
-This PR adds the Cost Insights frontend React plugin with a defined CostInsightsApi. We include an example client with static data in the expected format. This API should talk with a cloud billing backend that aggregates billing data from your cloud provider.
-
-Fixes #688 💵
diff --git a/.changeset/2639.md b/.changeset/2639.md
deleted file mode 100644
index e6a623088e..0000000000
--- a/.changeset/2639.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/cli': minor
----
-
-Upgrade dependency `esbuild@0.7.7`
diff --git a/.changeset/2641.md b/.changeset/2641.md
deleted file mode 100644
index 3b06358e81..0000000000
--- a/.changeset/2641.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-catalog-backend': minor
----
-
-Simplify the read function in processors
diff --git a/.changeset/2656.md b/.changeset/2656.md
deleted file mode 100644
index e253b6b1f6..0000000000
--- a/.changeset/2656.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-auth-backend': minor
----
-
-Lookup user in Google Auth Provider
diff --git a/.changeset/2657.md b/.changeset/2657.md
deleted file mode 100644
index 9aa645d65f..0000000000
--- a/.changeset/2657.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/core': minor
----
-
-Added EmptyState component
diff --git a/.changeset/2660.md b/.changeset/2660.md
deleted file mode 100644
index 758d523f07..0000000000
--- a/.changeset/2660.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-api-docs': patch
----
-
-Resolve some dark mode styling issues in asyncAPI specs
diff --git a/.changeset/2661.md b/.changeset/2661.md
deleted file mode 100644
index e73b0abf26..0000000000
--- a/.changeset/2661.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/core': patch
----
-
-Fixed banner component position in DismissableBanner component
diff --git a/.changeset/2669-catalog-backend.md b/.changeset/2669-catalog-backend.md
deleted file mode 100644
index 32ee5c0f4d..0000000000
--- a/.changeset/2669-catalog-backend.md
+++ /dev/null
@@ -1,7 +0,0 @@
----
-'@backstage/plugin-catalog-backend': minor
----
-
-Add the ability to import users from GitHub Organization into the catalog.
-
-The token needs to have the scopes `user:email`, `read:user`, and `read:org`.
diff --git a/.changeset/2669-catalog-model.md b/.changeset/2669-catalog-model.md
deleted file mode 100644
index b9a2841a1b..0000000000
--- a/.changeset/2669-catalog-model.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/catalog-model': minor
----
-
-Add the ability to import users from GitHub Organization into the catalog.
diff --git a/.changeset/2669-create-app.md b/.changeset/2669-create-app.md
deleted file mode 100644
index e7075ffeb8..0000000000
--- a/.changeset/2669-create-app.md
+++ /dev/null
@@ -1,7 +0,0 @@
----
-'@backstage/create-app': minor
----
-
-Add the ability to import users from GitHub Organization into the catalog.
-
-The token needs to have the scopes `user:email`, `read:user`, and `read:org`.
diff --git a/.changeset/2674.md b/.changeset/2674.md
deleted file mode 100644
index 15a7a0e849..0000000000
--- a/.changeset/2674.md
+++ /dev/null
@@ -1,12 +0,0 @@
----
-'@backstage/backend-common': minor
-'@backstage/create-app': minor
----
-
-Auto-create plugin databases
-
-Relates to #1598.
-
-This creates databases for plugins before handing off control to plugins.
-
-The list of plugins currently need to be hard-coded depending on the installed plugins. A later PR will properly refactor the code to provide a factory pattern where plugins specify what they need, and Knex instances will be provided based on the input.
diff --git a/.changeset/2689.md b/.changeset/2689.md
deleted file mode 100644
index be75dd261b..0000000000
--- a/.changeset/2689.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/cli': patch
----
-
-Upgrade dependency rollup-plugin-typescript2 to ^0.27.3
diff --git a/.changeset/2722.md b/.changeset/2722.md
deleted file mode 100644
index 69642b5797..0000000000
--- a/.changeset/2722.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-'@backstage/plugin-api-docs': minor
----
-
-There were some missing features and markdown was not rendered properly, but this is fixed now.
-
-Details:
-
-- [`asyncapi/asyncapi-react#149`](https://github.com/asyncapi/asyncapi-react/pull/149) - fix: improve markdown rendering of nested fields
-- [`asyncapi/asyncapi-react#150`](https://github.com/asyncapi/asyncapi-react/pull/150) - feat: display the description of channels and operations
-- [`asyncapi/asyncapi-react#153`](https://github.com/asyncapi/asyncapi-react/pull/153) - fix: let the list of `enums` break into multiple lines
diff --git a/.changeset/2798.md b/.changeset/2798.md
deleted file mode 100644
index 2b202142ef..0000000000
--- a/.changeset/2798.md
+++ /dev/null
@@ -1,7 +0,0 @@
----
-'@backstage/plugin-catalog-backend': minor
----
-
-Use the new `UrlReader` in `PlaceholderProcessor`.
-This allows to use the placeholder processor to include API definitions in API entities.
-Previously it was only possible to do this if the definition comes from the same location type as the entity itself.
diff --git a/.changeset/2800.md b/.changeset/2800.md
deleted file mode 100644
index 0e051b0557..0000000000
--- a/.changeset/2800.md
+++ /dev/null
@@ -1,15 +0,0 @@
----
-'@backstage/core': minor
-'@backstage/core-api': minor
----
-
-Updated the `GithubAuth.create` method to configure the default scope of the Github Auth Api. As a result the
-default scope is configurable when overwriting the Core Api in the app.
-
-```
-GithubAuth.create({
- discoveryApi,
- oauthRequestApi,
- defaultScopes: ['read:user', 'repo'],
-}),
-```
diff --git a/.changeset/2803.md b/.changeset/2803.md
deleted file mode 100644
index 3a4773757f..0000000000
--- a/.changeset/2803.md
+++ /dev/null
@@ -1,26 +0,0 @@
----
-'@backstage/plugin-catalog-backend': minor
----
-
-Remove the backstage.io/definition-at-location annotation.
-The annotation was superseded by the placeholder processor.
-
-```yaml
-apiVersion: backstage.io/v1alpha1
-kind: API
-metadata:
- name: spotify
- description: The Spotify web API
- tags:
- - spotify
- - rest
- annotations:
- # Don't use this annotation, but the placeholder $text instead (see below).
- backstage.io/definition-at-location: 'url:https://raw.githubusercontent.com/APIs-guru/openapi-directory/master/APIs/spotify.com/v1/swagger.yaml'
-spec:
- type: openapi
- lifecycle: production
- owner: spotify@example.com
- definition:
- $text: https://raw.githubusercontent.com/APIs-guru/openapi-directory/master/APIs/spotify.com/v1/swagger.yaml
-```
diff --git a/.changeset/2804.md b/.changeset/2804.md
deleted file mode 100644
index 5223a24791..0000000000
--- a/.changeset/2804.md
+++ /dev/null
@@ -1,15 +0,0 @@
----
-'@backstage/plugin-proxy-backend': minor
----
-
-Limit the http headers that are forwarded from the request to a safe set of defaults.
-A user can configure additional headers that should be forwarded if the specific applications needs that.
-
-```yaml
-proxy:
- '/my-api':
- target: 'https://my-api.com/get'
- allowedHeaders:
- # We need to forward the Authorization header that was provided by the caller
- - Authorization
-```
diff --git a/.changeset/2826.md b/.changeset/2826.md
deleted file mode 100644
index fb2dbb6877..0000000000
--- a/.changeset/2826.md
+++ /dev/null
@@ -1,20 +0,0 @@
----
-'example-app': minor
-'@backstage/core': minor
-'@backstage/create-app': minor
-'@backstage/plugin-catalog': minor
-'@backstage/plugin-github-actions': minor
-'@backstage/plugin-jenkins': minor
-'@backstage/plugin-lighthouse': minor
----
-
-The InfoCard variant `'height100'` is deprecated. Use variant `'gridItem'` instead.
-
-When the InfoCard is displayed as a grid item within a grid, you may want items to have the same height for all items.
-Set to the `'gridItem'` variant to display the InfoCard with full height suitable for Grid:
-`...`
-
-Changed the InfoCards in '@backstage/plugin-github-actions', '@backstage/plugin-jenkins', '@backstage/plugin-lighthouse'
-to pass an optional variant to the corresponding card of the plugin.
-
-As a result the overview content of the EntityPage shows cards with full height suitable for Grid.
diff --git a/.changeset/2874.md b/.changeset/2874.md
deleted file mode 100644
index 693962314f..0000000000
--- a/.changeset/2874.md
+++ /dev/null
@@ -1,12 +0,0 @@
----
-'@backstage/plugin-catalog-backend': minor
----
-
-The way that wiring together a catalog happens, has changed drastically. Now
-there is a new class `CatalogBuilder` that does almost all of the heavy lifting
-of how to augment/replace pieces of catalog functionality, such as adding
-support for custom entities or adding additional processors.
-
-As the builder was added, a lot of the static methods and builders for default
-setups have been removed from classes deep in the hierarchy. Instead, the
-builder contains the knowledge of what the defaults are.
diff --git a/.changeset/3030.md b/.changeset/3030.md
deleted file mode 100644
index 89730dc14c..0000000000
--- a/.changeset/3030.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/backend-common': minor
----
-
-Add the ability to import components from Bitbucket Server to the service catalog
diff --git a/.changeset/3066.md b/.changeset/3066.md
deleted file mode 100644
index 7bb67e70d1..0000000000
--- a/.changeset/3066.md
+++ /dev/null
@@ -1,12 +0,0 @@
----
-'@backstage/plugin-catalog-backend': minor
----
-
-Filters passed to the `/entities` endpoint of the catalog has changed format.
-
-The old way was to pass things on the form `?a=b&c=d`; the new way is to pass
-things on the form `?filter=a=b,c=d`. See discussion in
-[#2910](https://github.com/spotify/backstage/issues/2910) for details.
-
-The comma separated items within a single filter have an AND between them. If
-multiple such filters are passed, they have an OR between those item groups.
diff --git a/.changeset/3113.md b/.changeset/3113.md
deleted file mode 100644
index 7c53d01c16..0000000000
--- a/.changeset/3113.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-'@backstage/catalog-model': minor
-'@backstage/plugin-catalog-backend': minor
----
-
-Changes the various kind policies into a new type `KindValidator`.
-
-Adds `CatalogProcessor#validateEntityKind` that makes use of the above
-validators. This moves entity schema validity checking away from entity
-policies and into processors, centralizing the extension points into the
-processor chain.
diff --git a/.changeset/3130.md b/.changeset/3130.md
deleted file mode 100644
index 6edac9372b..0000000000
--- a/.changeset/3130.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-catalog-backend': patch
----
-
-Fix `CatalogBuilder#addProcessor`.
diff --git a/.changeset/alchemists-on-ice.md b/.changeset/alchemists-on-ice.md
deleted file mode 100644
index 24f41730d1..0000000000
--- a/.changeset/alchemists-on-ice.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-'@backstage/plugin-catalog-backend': patch
----
-
-Add support for `fields` sub-selection of just parts of an entity when listing
-entities in the catalog backend.
-
-Example: `.../entities?fields=metadata.name,spec.type` will return partial
-entity objects with only those exact fields present and the rest cut out.
-Fields do not have to be simple scalars - you can for example do
-`fields=metadata`.
diff --git a/.changeset/beige-apes-serve.md b/.changeset/beige-apes-serve.md
deleted file mode 100644
index 54ee39a85e..0000000000
--- a/.changeset/beige-apes-serve.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'example-app': patch
----
-
-Add Pull Request tab to components view.
diff --git a/.changeset/bitbucket-scaffolder.md b/.changeset/bitbucket-scaffolder.md
new file mode 100644
index 0000000000..e1e6f17b29
--- /dev/null
+++ b/.changeset/bitbucket-scaffolder.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-scaffolder-backend': patch
+---
+
+Add scaffolding support for Bitbucket Cloud and Server.
diff --git a/.changeset/blue-donkeys-exercise.md b/.changeset/blue-donkeys-exercise.md
deleted file mode 100644
index 4f714e3c97..0000000000
--- a/.changeset/blue-donkeys-exercise.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-catalog': minor
----
-
-Add client side paging for catalog table
diff --git a/.changeset/carpal-tunnel-driver.md b/.changeset/carpal-tunnel-driver.md
deleted file mode 100644
index 2e6a814533..0000000000
--- a/.changeset/carpal-tunnel-driver.md
+++ /dev/null
@@ -1,13 +0,0 @@
----
-'@backstage/plugin-catalog-backend': minor
----
-
-- The `CatalogProcessor` API was updated to have `preProcessEntity` and
- `postProcessEntity` methods, instead of just one `processEntity`. This makes
- it easier to make processors that have several stages in one, and to make
- different processors more position independent in the list of processors.
-- The `EntityPolicy` is now given directly to the `LocationReaders`, instead of
- being enforced inside a policy. We have decided to separate out the act of
- validating an entity to be outside of the processing flow, to make it
- possible to apply more liberally and to evolve it as a separate concept.
-- Because of the above, the `EntityPolicyProcessor` has been removed.
diff --git a/.changeset/chilly-emus-fetch.md b/.changeset/chilly-emus-fetch.md
deleted file mode 100644
index ad77c90f4e..0000000000
--- a/.changeset/chilly-emus-fetch.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-scaffolder-backend': patch
----
-
-Added .fromConfig static factories for Preparers and Publishers + read integrations config to support url location types
diff --git a/.changeset/clean-phones-vanish.md b/.changeset/clean-phones-vanish.md
deleted file mode 100644
index 4c80b82f24..0000000000
--- a/.changeset/clean-phones-vanish.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-cost-insights': patch
----
-
-export test utilities for mocking context
diff --git a/.changeset/cli-parallel-build-options.md b/.changeset/cli-parallel-build-options.md
deleted file mode 100644
index 95f9360738..0000000000
--- a/.changeset/cli-parallel-build-options.md
+++ /dev/null
@@ -1,12 +0,0 @@
----
-'@backstage/cli': minor
----
-
-Adds a new `BACKSTAGE_CLI_BUILD_PARELLEL` environment variable to control
-parallelism for some build steps.
-
-This is useful in CI to help avoid out of memory issues when using `terser`. The
-`BACKSTAGE_CLI_BUILD_PARELLEL` environment variable can be set to
-`true | false | [integer]` to override the default behaviour. See
-[terser-webpack-plugin](https://github.com/webpack-contrib/terser-webpack-plugin#parallel)
-for more details.
diff --git a/.changeset/codeowner-processor-url-reader.md b/.changeset/codeowner-processor-url-reader.md
deleted file mode 100644
index af4eb0997f..0000000000
--- a/.changeset/codeowner-processor-url-reader.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-catalog-backend': minor
----
-
-Use the new `UrlReader` in the `CodeOwnersProcessor`.
diff --git a/.changeset/cost-insights-sparkle.md b/.changeset/cost-insights-sparkle.md
deleted file mode 100644
index c332502476..0000000000
--- a/.changeset/cost-insights-sparkle.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-cost-insights': minor
----
-
-Added getLastCompleteBillingDate to the CostInsightsApi to reason about completeness of billing data
diff --git a/.changeset/cost-insights-swift-carrots-bake.md b/.changeset/cost-insights-swift-carrots-bake.md
deleted file mode 100644
index bc378ad247..0000000000
--- a/.changeset/cost-insights-swift-carrots-bake.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-cost-insights': patch
----
-
-prefer named exports
diff --git a/.changeset/create-app-url-reader-update.md b/.changeset/create-app-url-reader-update.md
deleted file mode 100644
index eb2e538b77..0000000000
--- a/.changeset/create-app-url-reader-update.md
+++ /dev/null
@@ -1,6 +0,0 @@
----
-'example-backend': patch
-'@backstage/create-app': patch
----
-
-Bump @backstage/catalog-backend and pass the now required UrlReader interface to the plugin
diff --git a/.changeset/cuddly-files-argue.md b/.changeset/cuddly-files-argue.md
new file mode 100644
index 0000000000..d495a945f4
--- /dev/null
+++ b/.changeset/cuddly-files-argue.md
@@ -0,0 +1,5 @@
+---
+'@backstage/create-app': patch
+---
+
+Replace `register-component` plugin with new `catalog-import` plugin
diff --git a/.changeset/cyan-lizards-confess.md b/.changeset/cyan-lizards-confess.md
new file mode 100644
index 0000000000..17ff8f0cdf
--- /dev/null
+++ b/.changeset/cyan-lizards-confess.md
@@ -0,0 +1,5 @@
+---
+'@backstage/backend-common': patch
+---
+
+Fix HTTPS certificate generation and add new config switch, enabling it simply by setting `backend.https = true`. Also introduces caching of generated certificates in order to avoid having to add a browser override every time the backend is restarted.
diff --git a/.changeset/cyan-plants-dress.md b/.changeset/cyan-plants-dress.md
deleted file mode 100644
index 19ebc63e53..0000000000
--- a/.changeset/cyan-plants-dress.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'example-backend': patch
----
-
-Pass GitHub token into Scaffolder GitHub Preparer
diff --git a/.changeset/dry-dolls-run.md b/.changeset/dry-dolls-run.md
new file mode 100644
index 0000000000..423d14d044
--- /dev/null
+++ b/.changeset/dry-dolls-run.md
@@ -0,0 +1,5 @@
+---
+'@backstage/cli': patch
+---
+
+Use consistent file extensions for JS output when building packages.
diff --git a/.changeset/dull-icons-share.md b/.changeset/dull-icons-share.md
deleted file mode 100644
index aa4c01e422..0000000000
--- a/.changeset/dull-icons-share.md
+++ /dev/null
@@ -1,21 +0,0 @@
----
-'@backstage/backend-common': minor
-'@backstage/cli': minor
-'@backstage/config-loader': minor
-'example-backend': patch
-'@backstage/create-app': patch
----
-
-**BREAKING CHANGE**
-
-The existing loading of additional config files like `app-config.development.yaml` using APP_ENV or NODE_ENV has been removed.
-Instead, the CLI and backend process now accept one or more `--config` flags to load config files.
-
-Without passing any flags, `app-config.yaml` and, if it exists, `app-config.local.yaml` will be loaded.
-If passing any `--config ` flags, only those files will be loaded, **NOT** the default `app-config.yaml` one.
-
-The old behaviour of for example `APP_ENV=development` can be replicated using the following flags:
-
-```bash
---config ../../app-config.yaml --config ../../app-config.development.yaml
-```
diff --git a/.changeset/eighty-lamps-smell.md b/.changeset/eighty-lamps-smell.md
deleted file mode 100644
index 85dfba4f82..0000000000
--- a/.changeset/eighty-lamps-smell.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-catalog': patch
----
-
-handle the case where no entities are available to show
diff --git a/.changeset/eighty-stingrays-type.md b/.changeset/eighty-stingrays-type.md
deleted file mode 100644
index 731c401b77..0000000000
--- a/.changeset/eighty-stingrays-type.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/core': patch
----
-
-Add forwardRef to the SidebarItem
diff --git a/.changeset/famous-shrimps-double.md b/.changeset/famous-shrimps-double.md
new file mode 100644
index 0000000000..198c0dc8f5
--- /dev/null
+++ b/.changeset/famous-shrimps-double.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-scaffolder': patch
+---
+
+Bug fix: User can retry creating a new component if an error occurs, without having to reload the page.
diff --git a/.changeset/fifty-yaks-behave.md b/.changeset/fifty-yaks-behave.md
new file mode 100644
index 0000000000..8f2fa2ec67
--- /dev/null
+++ b/.changeset/fifty-yaks-behave.md
@@ -0,0 +1,5 @@
+---
+'@backstage/techdocs-common': patch
+---
+
+Fix for `integration.github.apiBaseUrl` configuration not properly overriding apiBaseUrl used by techdocs
diff --git a/.changeset/flat-bugs-do.md b/.changeset/flat-bugs-do.md
deleted file mode 100644
index 672daf657d..0000000000
--- a/.changeset/flat-bugs-do.md
+++ /dev/null
@@ -1,8 +0,0 @@
----
-'@backstage/core': patch
-'@backstage/plugin-graphiql': patch
-'@backstage/plugin-tech-radar': patch
-'@backstage/plugin-techdocs': patch
----
-
-add test case for Progress component
diff --git a/.changeset/flat-suns-call.md b/.changeset/flat-suns-call.md
new file mode 100644
index 0000000000..096a10ec30
--- /dev/null
+++ b/.changeset/flat-suns-call.md
@@ -0,0 +1,17 @@
+---
+'@backstage/plugin-auth-backend': patch
+---
+
+Add support for the majority of the Core configurations for Passport-SAML.
+
+These configuration keys are supported:
+
+- entryPoint
+- issuer
+- cert
+- privateKey
+- decryptionPvk
+- signatureAlgorithm
+- digestAlgorithm
+
+As part of this change, there is also a fix to the redirection behaviour when doing load balancing and HTTPS termination - the application's baseUrl is used to generate the callback URL. For properly configured Backstage installations, no changes are necessary, and the baseUrl is respected.
diff --git a/.changeset/flat-yaks-march.md b/.changeset/flat-yaks-march.md
deleted file mode 100644
index 6b26206eb8..0000000000
--- a/.changeset/flat-yaks-march.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-scaffolder': patch
----
-
-fix the accordion details design when job stage fail
diff --git a/.changeset/fresh-maps-complain.md b/.changeset/fresh-maps-complain.md
deleted file mode 100644
index ef2021df37..0000000000
--- a/.changeset/fresh-maps-complain.md
+++ /dev/null
@@ -1,6 +0,0 @@
----
-'@backstage/plugin-catalog': minor
-'@backstage/plugin-register-component': patch
----
-
-Locations registered through the catalog client now default to the 'url' type. The type selection dropdown in the register-component form has been removed.
diff --git a/.changeset/friendly-numbers-accept.md b/.changeset/friendly-numbers-accept.md
new file mode 100644
index 0000000000..7890ec0c4a
--- /dev/null
+++ b/.changeset/friendly-numbers-accept.md
@@ -0,0 +1,20 @@
+---
+'@backstage/config-loader': patch
+---
+
+Deprecate `$data` and replace it with `$include` which allows for any type of json value to be read from external files. In addition, `$include` can be used without a path, which causes the value at the root of the file to be loaded.
+
+Most usages of `$data` can be directly replaced with `$include`, except if the referenced value is not a string, in which case the value needs to be changed. For example:
+
+```yaml
+# app-config.yaml
+foo:
+ $data: foo.yaml#myValue # replacing with $include will turn the value into a number
+ $data: bar.yaml#myValue # replacing with $include is safe
+
+# foo.yaml
+myValue: 0xf00
+
+# bar.yaml
+myValue: bar
+```
diff --git a/.changeset/funny-readers-breathe.md b/.changeset/funny-readers-breathe.md
deleted file mode 100644
index 8897b24cf6..0000000000
--- a/.changeset/funny-readers-breathe.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/core': patch
----
-
-fix the warning of all the core components test cases
diff --git a/.changeset/fuzzy-falcons-happen.md b/.changeset/fuzzy-falcons-happen.md
deleted file mode 100644
index 461ac195d9..0000000000
--- a/.changeset/fuzzy-falcons-happen.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'e2e-test': minor
----
-
-Converted into a CLI, use `yarn e2e-test run` to run
diff --git a/.changeset/good-islands-cheer.md b/.changeset/good-islands-cheer.md
deleted file mode 100644
index 2e7109b312..0000000000
--- a/.changeset/good-islands-cheer.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-cost-insights': minor
----
-
-Enable custom alert types in Cost Insights
diff --git a/.changeset/great-apples-flash.md b/.changeset/great-apples-flash.md
deleted file mode 100644
index 78ad89dee0..0000000000
--- a/.changeset/great-apples-flash.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-catalog-backend': patch
----
-
-Fix CodeOwnersProcessor to handle non team users
diff --git a/.changeset/happy-ads-behave.md b/.changeset/happy-ads-behave.md
deleted file mode 100644
index f8b889f85c..0000000000
--- a/.changeset/happy-ads-behave.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-scaffolder-backend': patch
----
-
-Allow templates to be located on non-default branch
diff --git a/.changeset/heavy-berries-hear.md b/.changeset/heavy-berries-hear.md
deleted file mode 100644
index 66aa6d93e1..0000000000
--- a/.changeset/heavy-berries-hear.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/core': patch
----
-
-Update ItemCard headers to pass color contrast standards.
diff --git a/.changeset/heavy-shirts-nail.md b/.changeset/heavy-shirts-nail.md
new file mode 100644
index 0000000000..0abe11afcf
--- /dev/null
+++ b/.changeset/heavy-shirts-nail.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-catalog-backend': patch
+---
+
+Change `location_update_log` columns from `nvarchar(255)` to `text`
diff --git a/.changeset/hungry-mice-clap.md b/.changeset/hungry-mice-clap.md
new file mode 100644
index 0000000000..6b819620b0
--- /dev/null
+++ b/.changeset/hungry-mice-clap.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-sentry': patch
+---
+
+Port to new composability API by exporting new `EntitySentryContent` and `EntitySentryCard` component extensions.
diff --git a/.changeset/hungry-parrots-work.md b/.changeset/hungry-parrots-work.md
deleted file mode 100644
index a18218b542..0000000000
--- a/.changeset/hungry-parrots-work.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/core': patch
----
-
-rename stories folder top Chip
diff --git a/.changeset/kind-buses-change.md b/.changeset/kind-buses-change.md
new file mode 100644
index 0000000000..1d93e27dff
--- /dev/null
+++ b/.changeset/kind-buses-change.md
@@ -0,0 +1,7 @@
+---
+'@backstage/backend-common': patch
+'@backstage/techdocs-common': patch
+'@backstage/plugin-scaffolder-backend': patch
+---
+
+Moving the Git actions to isomorphic-git instead of the node binding version of nodegit
diff --git a/.changeset/large-guests-compete.md b/.changeset/large-guests-compete.md
new file mode 100644
index 0000000000..7f71673033
--- /dev/null
+++ b/.changeset/large-guests-compete.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-catalog': patch
+---
+
+Remove the unused dependency to `@backstage/plugin-techdocs`.
diff --git a/.changeset/little-wasps-pull.md b/.changeset/little-wasps-pull.md
deleted file mode 100644
index 732c7506b0..0000000000
--- a/.changeset/little-wasps-pull.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-catalog': patch
----
-
-Remove "in default" in component name
diff --git a/.changeset/long-ways-count.md b/.changeset/long-ways-count.md
deleted file mode 100644
index e04c1225cc..0000000000
--- a/.changeset/long-ways-count.md
+++ /dev/null
@@ -1,57 +0,0 @@
----
-'@backstage/plugin-techdocs-backend': minor
-'@backstage/create-app': patch
----
-
-Updated naming of environment variables. New pattern [NAME]\_TOKEN for Github, Gitlab, Azure & Github enterprise access tokens.
-
-### Detail:
-
-- Previously we have to export same token for both, catalog & scaffolder
-
-```bash
-export GITHUB_ACCESS_TOKEN=foo
-export GITHUB_PRIVATE_TOKEN=foo
-```
-
-with latest changes, only single export is sufficient.
-
-```bash
-export GITHUB_TOKEN=foo
-export GITLAB_TOKEN=foo
-export GHE_TOKEN=foo
-export AZURE_TOKEN=foo
-```
-
-### list:
-
-
-
-
Old name
-
New name
-
-
-
GITHUB_ACCESS_TOKEN
-
GITHUB_TOKEN
-
-
-
GITHUB_PRIVATE_TOKEN
-
GITHUB_TOKEN
-
-
-
GITLAB_ACCESS_TOKEN
-
GITLAB_TOKEN
-
-
-
GITLAB_PRIVATE_TOKEN
-
GITLAB_TOKEN
-
-
-
AZURE_PRIVATE_TOKEN
-
AZURE_TOKEN
-
-
-
GHE_PRIVATE_TOKEN
-
GHE_TOKEN
-
-
diff --git a/.changeset/loud-lamps-visit.md b/.changeset/loud-lamps-visit.md
deleted file mode 100644
index 9023061643..0000000000
--- a/.changeset/loud-lamps-visit.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/cli': patch
----
-
-Including source maps with all packages
diff --git a/.changeset/lovely-suits-flash.md b/.changeset/lovely-suits-flash.md
deleted file mode 100644
index f093290c85..0000000000
--- a/.changeset/lovely-suits-flash.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/core': patch
----
-
-update the test cases of CodeSnippet component
diff --git a/.changeset/metal-fishes-learn.md b/.changeset/metal-fishes-learn.md
deleted file mode 100644
index d22af83ca0..0000000000
--- a/.changeset/metal-fishes-learn.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/create-app': minor
----
-
-The default mount point for backend plugins have been changed to /api. These changes are done in the backend package itself, so it is recommended that you sync up existing backend packages with this new pattern.
diff --git a/.changeset/mighty-plums-wave.md b/.changeset/mighty-plums-wave.md
new file mode 100644
index 0000000000..ac84b68e04
--- /dev/null
+++ b/.changeset/mighty-plums-wave.md
@@ -0,0 +1,5 @@
+---
+'@backstage/backend-common': patch
+---
+
+Tweaked development log formatter to include extra fields at the end of each log line
diff --git a/.changeset/mighty-starfishes-taste.md b/.changeset/mighty-starfishes-taste.md
deleted file mode 100644
index eb43ce69b8..0000000000
--- a/.changeset/mighty-starfishes-taste.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-catalog-backend': minor
----
-
-Removed the parseData step from catalog processors. Locations readers should emit full entities instead.
diff --git a/.changeset/nasty-colts-tell.md b/.changeset/nasty-colts-tell.md
new file mode 100644
index 0000000000..eeb7818f4c
--- /dev/null
+++ b/.changeset/nasty-colts-tell.md
@@ -0,0 +1,5 @@
+---
+'@backstage/cli': patch
+---
+
+Add `backend:bundle` command for bundling a backend package with dependencies into a deployment archive.
diff --git a/.changeset/new-horses-protect.md b/.changeset/new-horses-protect.md
new file mode 100644
index 0000000000..9d77926b13
--- /dev/null
+++ b/.changeset/new-horses-protect.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-catalog-backend': patch
+---
+
+Add processor for ingesting AWS accounts from AWS Organizations
diff --git a/.changeset/new-url-reader.md b/.changeset/new-url-reader.md
deleted file mode 100644
index 94758c5bc1..0000000000
--- a/.changeset/new-url-reader.md
+++ /dev/null
@@ -1,12 +0,0 @@
----
-'@backstage/backend-common': patch
----
-
-Added new UrlReader interface for reading opaque data from URLs with different providers.
-
-This new URL reading system is intended as a replacement for the various integrations towards
-external systems in the catalog, scaffolder, and techdocs. It is configured via a new top-level
-config section called 'integrations'.
-
-Along with the UrlReader interface is a new UrlReaders class, which exposes static factory
-methods for instantiating readers that can read from many different integrations simultaneously.
diff --git a/.changeset/nice-candles-argue.md b/.changeset/nice-candles-argue.md
deleted file mode 100644
index 971000410a..0000000000
--- a/.changeset/nice-candles-argue.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-user-settings': minor
----
-
-Add settings button to sidebar
diff --git a/.changeset/ninety-ads-dance.md b/.changeset/ninety-ads-dance.md
deleted file mode 100644
index a03298fd7f..0000000000
--- a/.changeset/ninety-ads-dance.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/catalog-model': patch
----
-
-Fix documentation and validation message for tags
diff --git a/.changeset/ninety-pens-poke.md b/.changeset/ninety-pens-poke.md
deleted file mode 100644
index 94bcb06749..0000000000
--- a/.changeset/ninety-pens-poke.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/create-app': patch
----
-
-Fix for configured templates using 'url' locations even though it's not supported yet
diff --git a/.changeset/odd-eyes-beg.md b/.changeset/odd-eyes-beg.md
new file mode 100644
index 0000000000..25a7699516
--- /dev/null
+++ b/.changeset/odd-eyes-beg.md
@@ -0,0 +1,6 @@
+---
+'@backstage/backend-common': patch
+'@backstage/integration': patch
+---
+
+Provide support for on-prem azure devops
diff --git a/.changeset/old-eagles-admire.md b/.changeset/old-eagles-admire.md
deleted file mode 100644
index 0729b6439d..0000000000
--- a/.changeset/old-eagles-admire.md
+++ /dev/null
@@ -1,6 +0,0 @@
----
-'@backstage/backend-common': minor
-'@backstage/cli': minor
----
-
-Use APP_ENV before NODE_ENV for determining what config to load
diff --git a/.changeset/old-falcons-jump.md b/.changeset/old-falcons-jump.md
deleted file mode 100644
index 107d75ff88..0000000000
--- a/.changeset/old-falcons-jump.md
+++ /dev/null
@@ -1,25 +0,0 @@
----
-'@backstage/plugin-newrelic': minor
----
-
-The New Relic plugin now uses the Backstage proxy to communicate with New Relic's API.
-
-Please update your `app-config.yaml` as follows:
-
-```yaml
-# Old Config
-newrelic:
- api:
- baseUrl: 'https://api.newrelic.com/v2'
- key: NEW_RELIC_REST_API_KEY
-```
-
-```yaml
-# New Config
-proxy:
- '/newrelic/apm/api':
- target: https://api.newrelic.com/v2
- headers:
- X-Api-Key:
- $env: NEW_RELIC_REST_API_KEY
-```
diff --git a/.changeset/old-jeans-dance.md b/.changeset/old-jeans-dance.md
deleted file mode 100644
index 1bd4a3136a..0000000000
--- a/.changeset/old-jeans-dance.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-catalog-backend': patch
----
-
-The CodeOwnersProcessor now handles 'url' locations
diff --git a/.changeset/olive-bikes-jog.md b/.changeset/olive-bikes-jog.md
deleted file mode 100644
index fdbf1e0d9f..0000000000
--- a/.changeset/olive-bikes-jog.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/core': patch
----
-
-add test cases for Status components
diff --git a/.changeset/pink-spies-rule.md b/.changeset/pink-spies-rule.md
deleted file mode 100644
index 71653a1841..0000000000
--- a/.changeset/pink-spies-rule.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-techdocs-backend': patch
----
-
-Replacing the hard coded `baseApiUrl` by reading the value from configuration to enable private GitHub setup for TechDocs.
diff --git a/.changeset/polite-laws-think.md b/.changeset/polite-laws-think.md
deleted file mode 100644
index a5eb7f9883..0000000000
--- a/.changeset/polite-laws-think.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-catalog-backend': minor
----
-
-Removed support for deprecated `catalog.providers` config that have been moved to `integrations`
diff --git a/.changeset/polite-moose-cough.md b/.changeset/polite-moose-cough.md
deleted file mode 100644
index b66227bb24..0000000000
--- a/.changeset/polite-moose-cough.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/core': patch
----
-
-update ItemCard component and it's story
diff --git a/.changeset/popular-jars-serve.md b/.changeset/popular-jars-serve.md
deleted file mode 100644
index 6ee40195fc..0000000000
--- a/.changeset/popular-jars-serve.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/catalog-model': minor
----
-
-Enable adding locations for config files that does not yet exist by adding a flag to api request
diff --git a/.changeset/pretty-cups-joke.md b/.changeset/pretty-cups-joke.md
deleted file mode 100644
index 49a1db2a75..0000000000
--- a/.changeset/pretty-cups-joke.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-scaffolder-backend': patch
----
-
-Add authentication token to Scaffolder GitHub Preparer
diff --git a/.changeset/proud-eagles-grow.md b/.changeset/proud-eagles-grow.md
deleted file mode 100644
index ef83a4ad26..0000000000
--- a/.changeset/proud-eagles-grow.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/cli': patch
----
-
-Fixed duplicate help output, and print help on invalid command
diff --git a/.changeset/raghu-is-great.md b/.changeset/raghu-is-great.md
deleted file mode 100644
index 805e49f3e8..0000000000
--- a/.changeset/raghu-is-great.md
+++ /dev/null
@@ -1,10 +0,0 @@
----
-'@backstage/plugin-catalog-backend': minor
----
-
-Renamed the `LocationProcessor` class to `CatalogProcessor`.
-
-Likewise, renamed `LocationProcessorResult`, `LocationProcessorLocationResult`,
-`LocationProcessorDataResult`, `LocationProcessorEntityResult`,
-`LocationProcessorErrorResult`, and `LocationProcessorEmit` to their `Catalog*`
-counterparts.
diff --git a/.changeset/red-games-float.md b/.changeset/red-games-float.md
deleted file mode 100644
index 6eabba26a4..0000000000
--- a/.changeset/red-games-float.md
+++ /dev/null
@@ -1,10 +0,0 @@
----
-'@backstage/plugin-cost-insights': minor
----
-
-- getProjectDailyCost and getGroupDailyCost no longer accept a metric as a parameter
-- getDailyMetricData added to API for fetching daily metric data for given interval
-- dailyCost removed as configurable metric
-- default field added to metric configuration for displaying comparison metric data in top panel
-- Metric.kind can no longer be null
-- MetricData type added
diff --git a/.changeset/remove-location-processor-read.md b/.changeset/remove-location-processor-read.md
deleted file mode 100644
index 78aea6d820..0000000000
--- a/.changeset/remove-location-processor-read.md
+++ /dev/null
@@ -1,6 +0,0 @@
----
-'@backstage/plugin-catalog-backend': minor
----
-
-Remove the `read` argument of `LocationProcessor.processEntity`.
-Instead, pass the `UrlReader` into the constructor of your `LocationProcessor`.
diff --git a/.changeset/rocket-lizards-congregate.md b/.changeset/rocket-lizards-congregate.md
deleted file mode 100644
index f4cd50aa36..0000000000
--- a/.changeset/rocket-lizards-congregate.md
+++ /dev/null
@@ -1,10 +0,0 @@
----
-'@backstage/plugin-catalog': minor
----
-
-The URL path for a catalog entity has changed,
-
-- from: `/catalog/:kind/:optionalNamespaceAndName`
-- to: `/catalog/:namespace/:kind/:name`
-
-Redirects are in place, so disruptions for users should not happen.
diff --git a/.changeset/selfish-bats-perform.md b/.changeset/selfish-bats-perform.md
deleted file mode 100644
index e4d05c088c..0000000000
--- a/.changeset/selfish-bats-perform.md
+++ /dev/null
@@ -1,6 +0,0 @@
----
-'@backstage/plugin-scaffolder': patch
-'@backstage/plugin-scaffolder-backend': patch
----
-
-The new `scaffolder.github.baseUrl` config property allows to specify a custom base url for GitHub enterprise instances
diff --git a/.changeset/selfish-mugs-itch.md b/.changeset/selfish-mugs-itch.md
deleted file mode 100644
index 39ed236352..0000000000
--- a/.changeset/selfish-mugs-itch.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-cost-insights': minor
----
-
-Remove product filters from query parameters
diff --git a/.changeset/seven-humans-check.md b/.changeset/seven-humans-check.md
deleted file mode 100644
index f2fb784cc0..0000000000
--- a/.changeset/seven-humans-check.md
+++ /dev/null
@@ -1,9 +0,0 @@
----
-'example-app': patch
-'@backstage/core-api': patch
-'@backstage/plugin-cost-insights': patch
----
-
-Remove cost insights example client from demo app and export from plugin
-Create cost insights dev plugin using example client
-Make PluginConfig and dependent types public
diff --git a/.changeset/short-secrets.md b/.changeset/short-secrets.md
deleted file mode 100644
index 72cb059979..0000000000
--- a/.changeset/short-secrets.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/config-loader': minor
----
-
-Added support for new shorthand when defining secrets, where `$env: ENV` can be used instead of `$secret: { env: ENV }` etc.
diff --git a/.changeset/2686.md b/.changeset/six-experts-destroy.md
similarity index 56%
rename from .changeset/2686.md
rename to .changeset/six-experts-destroy.md
index 8831c1309b..73347938d9 100644
--- a/.changeset/2686.md
+++ b/.changeset/six-experts-destroy.md
@@ -2,4 +2,4 @@
'@backstage/plugin-scaffolder-backend': patch
---
-Update SSR template to pass CI
+Add config schema for Bitbucket scaffolder
diff --git a/.changeset/slimy-garlics-eat.md b/.changeset/slimy-garlics-eat.md
deleted file mode 100644
index 3ecc0ce495..0000000000
--- a/.changeset/slimy-garlics-eat.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-catalog': patch
----
-
-update the EntityNotFound component
diff --git a/.changeset/slow-experts-peel.md b/.changeset/slow-experts-peel.md
deleted file mode 100644
index ed9c7af21e..0000000000
--- a/.changeset/slow-experts-peel.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-tech-radar': patch
----
-
-fix the horizontal scrolling issue in the RadarPage component
diff --git a/.changeset/spicy-moles-yell.md b/.changeset/spicy-moles-yell.md
deleted file mode 100644
index 72b648b30b..0000000000
--- a/.changeset/spicy-moles-yell.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/core': patch
----
-
-make ErrorPage responsive + fix the test case
diff --git a/.changeset/spicy-rockets-ring.md b/.changeset/spicy-rockets-ring.md
deleted file mode 100644
index b39b433c1b..0000000000
--- a/.changeset/spicy-rockets-ring.md
+++ /dev/null
@@ -1,10 +0,0 @@
----
-'@backstage/plugin-scaffolder-backend': patch
----
-
-Added support for configuring the working directory of the Scaffolder:
-
-```yaml
-backend:
- workingDirectory: /some-dir # Use this to configure a working directory for the scaffolder, defaults to the OS temp-dir
-```
diff --git a/.changeset/spotty-apples-visit.md b/.changeset/spotty-apples-visit.md
deleted file mode 100644
index ba481fa052..0000000000
--- a/.changeset/spotty-apples-visit.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-auth-backend': patch
----
-
-Better presentation of authentication errors
diff --git a/.changeset/sweet-bikes-battle.md b/.changeset/sweet-bikes-battle.md
deleted file mode 100644
index 68ed8caeeb..0000000000
--- a/.changeset/sweet-bikes-battle.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'example-app': patch
----
-
-cleaning up because external plugins have already implemented new api for creating
diff --git a/.changeset/swift-ears-fetch.md b/.changeset/swift-ears-fetch.md
new file mode 100644
index 0000000000..64067cc4f5
--- /dev/null
+++ b/.changeset/swift-ears-fetch.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-pagerduty': patch
+---
+
+Optimize empty state image size.
diff --git a/.changeset/swift-emus-mate.md b/.changeset/swift-emus-mate.md
deleted file mode 100644
index 1903742115..0000000000
--- a/.changeset/swift-emus-mate.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/core-api': minor
----
-
-Refactored the FeatureFlagsApi to make it easier to re-implement. Existing usage of particularly getUserFlags can be replaced with isActive() or save().
diff --git a/.changeset/swift-peas-argue.md b/.changeset/swift-peas-argue.md
deleted file mode 100644
index d78d844d45..0000000000
--- a/.changeset/swift-peas-argue.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/core': patch
----
-
-give aria-label attribute to Status Ok, Warning and Error
diff --git a/.changeset/ten-bees-wash.md b/.changeset/ten-bees-wash.md
deleted file mode 100644
index 179dbf87f4..0000000000
--- a/.changeset/ten-bees-wash.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-techdocs': patch
----
-
-While techdocs fetches site name and metadata for the component, the page title was displayed as '[object Object] | Backstage'. This has now been fixed to display the component ID if site name is not present or being fetched.
diff --git a/.changeset/three-horses-juggle.md b/.changeset/three-horses-juggle.md
deleted file mode 100644
index bebcf77e43..0000000000
--- a/.changeset/three-horses-juggle.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-scaffolder-backend': patch
----
-
-Introduce PreparerOptions for PreparerBase
diff --git a/.changeset/tough-jars-share.md b/.changeset/tough-jars-share.md
new file mode 100644
index 0000000000..f1b551f31e
--- /dev/null
+++ b/.changeset/tough-jars-share.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-tech-radar': patch
+---
+
+Updated example data in `README`.
diff --git a/.changeset/tough-weeks-pull.md b/.changeset/tough-weeks-pull.md
deleted file mode 100644
index e79355de90..0000000000
--- a/.changeset/tough-weeks-pull.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/core': patch
----
-
-fix the responsive of page story
diff --git a/.changeset/url-reader-processor.md b/.changeset/url-reader-processor.md
deleted file mode 100644
index 40fef3c106..0000000000
--- a/.changeset/url-reader-processor.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-catalog-backend': minor
----
-
-The catalog backend UrlReaderProcessor now uses a UrlReader from @backstage/backend-common, which must now be supplied to the constructor.
diff --git a/.changeset/weak-ducks-tan.md b/.changeset/weak-ducks-tan.md
deleted file mode 100644
index 64b1c3f117..0000000000
--- a/.changeset/weak-ducks-tan.md
+++ /dev/null
@@ -1,8 +0,0 @@
----
-'@backstage/backend-common': minor
-'example-backend': patch
-'@backstage/cli': patch
-'@backstage/create-app': patch
----
-
-Change loadBackendConfig to return the config directly
diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS
index d161a8e1a9..495f1ff78d 100644
--- a/.github/CODEOWNERS
+++ b/.github/CODEOWNERS
@@ -4,14 +4,12 @@
# The last matching pattern takes precedence.
# https://help.github.com/articles/about-codeowners/
-* @spotify/backstage-core
-/docs/features/techdocs @spotify/techdocs-core
-/plugins/cost-insights @spotify/silver-lining
+* @backstage/maintainers
+/docs/features/techdocs @backstage/techdocs-core
+/plugins/cost-insights @backstage/silver-lining
/plugins/cloudbuild @trivago/ebarrios
-/plugins/techdocs @spotify/techdocs-core
-/plugins/techdocs-backend @spotify/techdocs-core
-/packages/techdocs-cli @spotify/techdocs-core
-/packages/techdocs-container @spotify/techdocs-core
-/.github/workflows/techdocs.yml @spotify/techdocs-core
-/.github/workflows/techdocs-pypi.yml @spotify/techdocs-core
-/.changeset/cost-insights-* @spotify/silver-lining
+/plugins/search @backstage/techdocs-core
+/plugins/techdocs @backstage/techdocs-core
+/plugins/techdocs-backend @backstage/techdocs-core
+/packages/techdocs-common @backstage/techdocs-core
+/.changeset/cost-insights-* @backstage/silver-lining
diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md
index de7ce773bb..d68af23491 100644
--- a/.github/PULL_REQUEST_TEMPLATE.md
+++ b/.github/PULL_REQUEST_TEMPLATE.md
@@ -7,7 +7,7 @@
-- [ ] A changeset describing the change and affected packages. ([more info](https://github.com/spotify/backstage/blob/master/CONTRIBUTING.md#creating-changesets))
+- [ ] A changeset describing the change and affected packages. ([more info](https://github.com/backstage/backstage/blob/master/CONTRIBUTING.md#creating-changesets))
- [ ] Added or updated documentation
- [ ] Tests for new functionality and regression tests for bug fixes
- [ ] Screenshots attached (for UI changes)
diff --git a/.github/styles/vocab.txt b/.github/styles/vocab.txt
index 0cbd0ffa05..f9d5024af4 100644
--- a/.github/styles/vocab.txt
+++ b/.github/styles/vocab.txt
@@ -1,4 +1,6 @@
abc
+adamdmharvey
+andrewthauer
Apdex
api
Api
@@ -9,27 +11,33 @@ async
Avro
backrub
Balachandran
+benjdlambert
Bigtable
+Billett
Blackbox
bool
boolean
+builtins
Chai
changeset
changesets
Changesets
-changset
chanwit
Chanwit
+ci
cisphobia
cissexist
classname
cli
+cloudbuild
cncf
codeblocks
Codecov
codehilite
Codehilite
codeowners
+composability
+composable
config
Config
configmaps
@@ -38,10 +46,13 @@ const
cookiecutter
css
dariddler
+dataflow
deadnaming
destructured
dev
+devops
devs
+dhenneke
discoverability
Discoverability
dls
@@ -50,7 +61,9 @@ Dockerfile
Dockerize
dockerode
Docusaurus
-eg
+Dominik
+dtuite
+dzolotusky
Ek
env
Env
@@ -59,22 +72,30 @@ facto
failover
Figma
Firekube
+Fiverr
+freben
Fredrik
github
-Github
-Gitlab
+GitHub
+gitlab
+GitLab
+Grafana
graphql
graphviz
+Gustavsson
Hackathons
haproxy
+Henneke
heroku
Heroku
horizontalpodautoscalers
Hostname
http
https
+Iain
img
incentivised
+inlined
inlinehilite
interop
javascript
@@ -92,6 +113,7 @@ lerna
Lerna
magiclink
mailto
+maintainership
Malus
md
microsite
@@ -108,31 +130,37 @@ msw
namespace
namespaces
Namespaces
+namespacing
neuro
newrelic
nginx
Niklas
+nodegit
nohoist
nonces
npm
+nvarchar
nvm
oauth
-Oauth
+OAuth
+oidc
Okta
Oldsberg
onboarding
Onboarding
pagerduty
+parallelization
Patrik
Phoen
plantuml
Pomaceous
postgres
+postpack
pre
prebaked
preconfigured
+prepack
Preprarer
-Prerequisities
productional
Protobuf
proxying
@@ -156,57 +184,69 @@ Rollup
Rosaceae
rst
rsync
+rugvip
ruleset
sam
scaffolded
scaffolder
Scaffolder
semlas
+semver
Serverless
Sinon
-smartsymobls
+Snyk
+sourcemaps
sparklines
Spotifiers
spotify
Spotify
+sqlite
squidfunk
src
+stefanalund
subkey
+subtree
superfences
Superfences
+superset
talkdesk
Talkdesk
tasklist
techdocs
+Telenor
templated
templater
Templater
templaters
Templaters
Thauer
-theres
toc
tolerations
Tolerations
+toolchain
toolsets
+tooltip
+tooltips
touchpoints
+transpiled
+transpilation
+Tuite
ui
+untracked
upvote
url
utils
validators
+varchar
Voi
Wealthsimple
Weaveworks
Webpack
+www
+WWW
xyz
yaml
Zalando
Zhou
-Billett
-cloudbuild
-Grafana
-Iain
-Snyk
-www
-WWW
+Zolotusky
+zoomable
diff --git a/.github/workflows/changeset.yml b/.github/workflows/changeset.yml
index ac7872ea93..4bd03b4d96 100644
--- a/.github/workflows/changeset.yml
+++ b/.github/workflows/changeset.yml
@@ -15,5 +15,8 @@ jobs:
run: yarn --frozen-lockfile
- name: Create Release Pull Request
uses: changesets/action@master
+ with:
+ # Calls out to `changeset version`, but also runs prettier
+ version: yarn release
env:
- GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ GITHUB_TOKEN: ${{ secrets.GH_SERVICE_ACCOUNT_TOKEN }}
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index d00f304b58..c35e2a88ff 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -67,11 +67,14 @@ jobs:
continue-on-error: true
- name: verify doc links
- run: node docs/verify-links.js
+ run: node scripts/verify-links.js
- name: prettier
run: yarn prettier:check
+ - name: validate config
+ run: yarn backstage-cli config:check
+
- name: lint
run: yarn lerna -- run lint --since origin/master
diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml
index 2fafd3756d..92660b9ca4 100644
--- a/.github/workflows/codeql-analysis.yml
+++ b/.github/workflows/codeql-analysis.yml
@@ -11,6 +11,11 @@ on:
pull_request:
# The branches below must be a subset of the branches above
branches: [master]
+ # https://docs.github.com/en/free-pro-team@latest/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#scanning-pull-requests
+ paths-ignore:
+ - '**/*.md'
+ - '**/*.yml'
+ - '**/*.yaml'
schedule:
- cron: '0 8 * * 6'
@@ -36,11 +41,6 @@ jobs:
# a pull request then we can checkout the head.
fetch-depth: 2
- # If this run was triggered by a pull request event, then checkout
- # the head of the pull request instead of the merge commit.
- - run: git checkout HEAD^2
- if: ${{ github.event_name == 'pull_request' }}
-
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
uses: github/codeql-action/init@v1
diff --git a/.github/workflows/e2e-win.yml b/.github/workflows/e2e-win.yml
index 570d857c48..1844700cea 100644
--- a/.github/workflows/e2e-win.yml
+++ b/.github/workflows/e2e-win.yml
@@ -32,7 +32,7 @@ jobs:
with:
node-version: ${{ matrix.node-version }}
- name: Add msbuild to PATH
- uses: microsoft/setup-msbuild@v1.0.1
+ uses: microsoft/setup-msbuild@v1.0.2
- name: yarn install
run: yarn install --frozen-lockfile
diff --git a/.github/workflows/master-win.yml b/.github/workflows/master-win.yml
index c103583052..ca402c48d5 100644
--- a/.github/workflows/master-win.yml
+++ b/.github/workflows/master-win.yml
@@ -51,10 +51,13 @@ jobs:
- name: test
run: yarn lerna -- run test
+ # credit: https://github.com/appleboy/discord-action/issues/3#issuecomment-731426861
- name: Discord notification
if: ${{ failure() }}
- uses: Ilshidur/action-discord@0.2.0
env:
DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK }}
- with:
- args: 'Windows master build failed https://github.com/{{GITHUB_REPOSITORY}}/actions/runs/{{GITHUB_RUN_ID}}'
+ run: |
+ $MESSAGE=@"
+ {\"content\": \"Windows master build failed https://github.com/${{github.repository}}/actions/runs/${{github.run_id}}\"}
+ "@
+ C:\msys64\usr\bin\curl.exe -i -H "Accept: application/json" -H "Content-Type:application/json" -X POST $env:DISCORD_WEBHOOK --data $MESSAGE
diff --git a/.github/workflows/master.yml b/.github/workflows/master.yml
index f5029bf836..e9f5e602a5 100644
--- a/.github/workflows/master.yml
+++ b/.github/workflows/master.yml
@@ -47,6 +47,9 @@ jobs:
run: yarn install --frozen-lockfile
# End of yarn setup
+ - name: validate config
+ run: yarn backstage-cli config:check
+
- name: lint
run: yarn lerna -- run lint
@@ -67,21 +70,6 @@ jobs:
bash <(curl -s https://codecov.io/bash) -f packages/core/coverage/* -F core
bash <(curl -s https://codecov.io/bash) -f packages/core-api/coverage/* -F core-api
- # Publishes current version of packages that are not already present in the registry
- - name: publish
- if: matrix.node-version == '12.x'
- run: yarn lerna -- publish from-package --yes
- env:
- NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
-
- # Tags the commit with the version in the core package if the tag doesn't exist
- - uses: Klemensas/action-autotag@1.2.3
- if: matrix.node-version == '12.x'
- with:
- GITHUB_TOKEN: '${{ secrets.GITHUB_TOKEN }}'
- package_root: 'packages/core'
- tag_prefix: 'v'
-
- name: Discord notification
if: ${{ failure() }}
uses: Ilshidur/action-discord@0.2.0
@@ -89,3 +77,85 @@ jobs:
DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK }}
with:
args: 'Master build failed https://github.com/{{GITHUB_REPOSITORY}}/actions/runs/{{GITHUB_RUN_ID}}'
+
+ # A separate release build that is only run for commits that are the result of merging the "Version Packages" PR
+ # We can't re-use the output from the above step, but we'll have a guaranteed node_modules cache and
+ # only run the build steps that are necessary for publishing
+ release:
+ if: ${{ endsWith(github.event.head_commit.message, 'from backstage/changeset-release/master\n\nVersion Packages') }}
+ needs: build
+
+ runs-on: ubuntu-latest
+
+ strategy:
+ matrix:
+ node-version: [14.x]
+
+ env:
+ CI: 'true'
+ NODE_OPTIONS: --max-old-space-size=4096
+
+ steps:
+ - uses: actions/checkout@v2
+
+ # Beginning of yarn setup, keep in sync between all workflows, see ci.yml
+ - name: use node.js ${{ matrix.node-version }}
+ uses: actions/setup-node@v1
+ with:
+ node-version: ${{ matrix.node-version }}
+ registry-url: https://registry.npmjs.org/ # Needed for auth
+ - name: cache all node_modules
+ id: cache-modules
+ uses: actions/cache@v2
+ with:
+ path: '**/node_modules'
+ key: ${{ runner.os }}-v${{ matrix.node-version }}-node_modules-${{ hashFiles('yarn.lock', '**/package.json') }}
+ - name: find location of global yarn cache
+ id: yarn-cache
+ if: steps.cache-modules.outputs.cache-hit != 'true'
+ run: echo "::set-output name=dir::$(yarn cache dir)"
+ - name: cache global yarn cache
+ uses: actions/cache@v2
+ if: steps.cache-modules.outputs.cache-hit != 'true'
+ with:
+ path: ${{ steps.yarn-cache.outputs.dir }}
+ key: ${{ runner.os }}-yarn-${{ hashFiles('yarn.lock') }}
+ restore-keys: |
+ ${{ runner.os }}-yarn-
+ - name: yarn install
+ run: yarn install --frozen-lockfile
+ # End of yarn setup
+
+ - name: build type declarations
+ run: yarn tsc:full
+
+ - name: build packages
+ run: yarn lerna -- run --ignore example-app build
+
+ # Publishes current version of packages that are not already present in the registry
+ - name: publish
+ run: yarn lerna -- publish from-package --yes
+ env:
+ NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
+
+ # Creates the next available tag with format "release---[.]"
+ - name: Create a release tag
+ id: create_tag
+ run: node scripts/create-release-tag.js
+ env:
+ GITHUB_TOKEN: ${{ secrets.GH_SERVICE_ACCOUNT_TOKEN }}
+
+ # Convert the newly created tag into a release with changelog information
+ - name: Create release on GitHub
+ run: node scripts/create-github-release.js ${{ steps.create_tag.outputs.tag_name }} 1
+ env:
+ GITHUB_TOKEN: ${{ secrets.GH_SERVICE_ACCOUNT_TOKEN }}
+
+ # Notify everyone about this great new release :D
+ - name: Discord notification
+ uses: Ilshidur/action-discord@0.2.0
+ env:
+ DISCORD_WEBHOOK: ${{ secrets.DISCORD_RELEASE_WEBHOOK }}
+ TAG_NAME: ${{ steps.create_tag.outputs.tag_name }}
+ with:
+ args: 'A new release has been published! https://github.com/backstage/backstage/releases/tag/{{TAG_NAME}}'
diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml
index 335bd80109..0dc40d2c40 100644
--- a/.github/workflows/nightly.yml
+++ b/.github/workflows/nightly.yml
@@ -6,6 +6,8 @@ on:
jobs:
build:
+ if: github.repository == 'backstage/backstage' # prevent running on forks
+
runs-on: ubuntu-latest
strategy:
@@ -60,7 +62,7 @@ jobs:
- name: prepare nightly release
run: yarn changeset version --snapshot nightly
- # Publishes the nightly release to NPM, by using tag we make sure the release is
+ # Publishes the nightly release to npm, by using tag we make sure the release is
# not flagged as the latest release, which means that people will not get this
# version of the package unless requested explicitly
- name: publish nightly release
diff --git a/.github/workflows/techdocs-project-board.yml b/.github/workflows/techdocs-project-board.yml
index b389cf6bf5..679abe6536 100644
--- a/.github/workflows/techdocs-project-board.yml
+++ b/.github/workflows/techdocs-project-board.yml
@@ -1,6 +1,7 @@
name: Automatically add new TechDocs Issues and PRs to the GitHub project board
-# Development of TechDocs in Backstage is managed by this Kanban board - https://github.com/spotify/backstage/projects/5
-# New issues with TechDocs in their title or docs-like-code label will be added to the board.
+# Development of TechDocs in Backstage is managed by this Kanban board - https://github.com/orgs/backstage/projects/1
+# New issues and PRs with TechDocs in their title or docs-like-code label will be added to the board.
+# Caveat: New PRs created from forks will not be added since GitHub Actions don't share credentials with forks.
on:
issues:
@@ -9,7 +10,7 @@ on:
types: [opened, reopened, labeled, edited]
env:
- GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ MY_GITHUB_TOKEN: ${{ secrets.GH_SERVICE_ACCOUNT_TOKEN }}
jobs:
assign_issue_or_pr_to_project:
@@ -23,7 +24,7 @@ jobs:
contains(github.event.issue.title, 'techdocs') ||
contains(github.event.issue.title, 'Techdocs')
with:
- project: 'https://github.com/spotify/backstage/projects/5'
+ project: 'https://github.com/orgs/backstage/projects/1'
column_name: 'Incoming'
- name: Assign new issue to Incoming based on its label.
@@ -31,7 +32,7 @@ jobs:
if: |
contains(github.event.issue.labels.*.name, 'docs-like-code')
with:
- project: 'https://github.com/spotify/backstage/projects/5'
+ project: 'https://github.com/orgs/backstage/projects/1'
column_name: 'Incoming'
- name: Assign new PR to Incoming based on its title.
@@ -41,7 +42,7 @@ jobs:
contains(github.event.pull_request.title, 'techdocs') ||
contains(github.event.pull_request.title, 'Techdocs')
with:
- project: 'https://github.com/spotify/backstage/projects/5'
+ project: 'https://github.com/orgs/backstage/projects/1'
column_name: 'Incoming'
- name: Assign new PR to Incoming based on its label.
@@ -49,5 +50,5 @@ jobs:
if: |
contains(github.event.pull_request.labels.*.name, 'docs-like-code')
with:
- project: 'https://github.com/spotify/backstage/projects/5'
+ project: 'https://github.com/orgs/backstage/projects/1'
column_name: 'Incoming'
diff --git a/.github/workflows/techdocs-pypi.yml b/.github/workflows/techdocs-pypi.yml
deleted file mode 100644
index 7680cb98b0..0000000000
--- a/.github/workflows/techdocs-pypi.yml
+++ /dev/null
@@ -1,37 +0,0 @@
-name: Master Build TechDocs PyPI Publish
-
-on:
- push:
- branches: [master]
- paths:
- - '.github/workflows/techdocs-pypi.yml'
- - 'packages/techdocs-container/**'
-
-jobs:
- build:
- runs-on: ${{ matrix.os }}
-
- strategy:
- matrix:
- os: [ubuntu-latest]
- python-version: [3.7]
-
- steps:
- # Publish techdocs-core to PyPI
- - uses: actions/checkout@v2
- - name: Set up Python ${{ matrix.python-version }}
- uses: actions/setup-python@master
- with:
- python-version: 3.7
- - name: Build Python distribution
- working-directory: ./packages/techdocs-container/techdocs-core
- run: |
- pip install wheel
- rm -rf dist
- python setup.py bdist_wheel sdist --formats gztar
- - name: Publish a Python distribution to PyPI
- uses: pypa/gh-action-pypi-publish@master
- with:
- user: __token__
- password: ${{ secrets.PYPI_API_KEY }}
- packages_dir: ./packages/techdocs-container/techdocs-core/dist
diff --git a/.github/workflows/techdocs.yml b/.github/workflows/techdocs.yml
deleted file mode 100644
index 95b68c9376..0000000000
--- a/.github/workflows/techdocs.yml
+++ /dev/null
@@ -1,44 +0,0 @@
-name: TechDocs
-
-on:
- pull_request:
- paths:
- - '.github/workflows/techdocs.yml'
- - 'packages/techdocs-container/**'
- - 'packages/techdocs-cli/**'
- - 'plugins/techdocs/**'
- - 'plugins/techdocs-backend/**'
-
-jobs:
- build:
- runs-on: ${{ matrix.os }}
-
- strategy:
- matrix:
- os: [ubuntu-latest]
- python-version: [3.7]
-
- env:
- TECHDOCS_CORE_PATH: ./packages/techdocs-container/techdocs-core
-
- name: Python ${{ matrix.node-version }} on ${{ matrix.os }}
- steps:
- - uses: actions/checkout@v2
-
- # Build Docker Image
- - name: Build Docker image
- uses: docker/build-push-action@v1.1.0
- with:
- path: packages/techdocs-container
- push: false
-
- # Lint Python code for techdocs-core package
- - name: Prepare Python environment
- run: |
- python3 -m pip install --index-url https://pypi.org/simple/ setuptools
- python3 -m pip install --upgrade pip
- python3 -m pip install --index-url https://pypi.org/simple/ -r $TECHDOCS_CORE_PATH/requirements.txt
-
- - name: Lint techdocs-core package
- run: |
- python3 -m black --check $TECHDOCS_CORE_PATH/src
diff --git a/.gitignore b/.gitignore
index 5c27601791..3334bf956d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -96,6 +96,7 @@ typings/
.nuxt
dist
dist-types
+dist-workspace
# Gatsby files
.cache/
diff --git a/.yarnrc b/.yarnrc
index 6b56b971d7..4cdaac2408 100644
--- a/.yarnrc
+++ b/.yarnrc
@@ -6,4 +6,4 @@ registry "https://registry.npmjs.org/"
disable-self-update-check true
lastUpdateCheck 1580389148099
yarn-path ".yarn/releases/yarn-1.22.1.js"
-network-timeout 600000
+network-timeout 300000
diff --git a/ADOPTERS.md b/ADOPTERS.md
index 0ba3e3196b..493bf499af 100644
--- a/ADOPTERS.md
+++ b/ADOPTERS.md
@@ -1,15 +1,19 @@
-| Organization | Contact | Description of Use |
-| -------------------------------------------- | ------------------------------------------------------------ | ------------------------------------------------------------------------------------------------ |
-| [Spotify](https://www.spotify.com) | [@stefanalund](https://github.com/stefanalund) | Main interface towards all of Spotify's infrastructure and technical documentation. |
-| [bol.com](https://www.bol.com) | [@RoyJacobs](https://github.com/RoyJacobs) | Initial work being done to unify platform tooling. |
-| [DFDS](https://www.dfds.com) | [@carlsendk](https://github.com/carlsendk) | V2 self-service platform. |
-| [Roadie](https://roadie.io) | [@dtuite](https://github.com/dtuite) | Hosted, managed Backstage with easy set-up |
-| [Roku](https://www.roku.com) | [@timurista](https://github.com/timurista) | Initial work on Cloud engineering service platform. |
-| [SDA SE](https://sda.se) | [@Fox32](https://github.com/Fox32) | Central place for developing and sharing services in our insurance ecosystem. |
-| [H-E-B](https://www.heb.com) | [@german-j-rodriguez](https://github.com/german-j-rodriguez) | Initial work on Engineering Portal service platform. |
-| [American Airlines](https://www.aa.com) | [@paulpach](https://github.com/paulpach) | Central place for developers to develop and maintain applications |
-| [Kiwi.com](https://kiwi.com) | [@aexvir](https://github.com/aexvir) | Replacing the frontend of [The Zoo](https://github.com/kiwicom/the-zoo), their service registry. |
-| [Voi](https://www.voiscooters.com/) | [@K-Phoen](https://github.com/K-Phoen) | Developer portal, main gateway to our infrastructure, documentation and internal tooling. |
-| [Talkdesk](https://www.talkdesk.com) | [@jaime-talkdesk](https://github.com/jaime-talkdesk) | Initial work for Engineering Portal and Self Provisioning to R&D |
-| [Wealthsimple](https://www.wealthsimple.com) | [@andrewthauer](https://github.com/andrewthauer) | Developer portal, service catalog, documentation and tooling |
-| [Grab](https://www.grab.com) | [@althafh](https://github.com/althafh) | Initial work as a unified interface for all of Grab's internal tooling |
+| Organization | Contact | Description of Use |
+| -------------------------------------------- | ------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------- |
+| [Spotify](https://www.spotify.com) | [@leemills83](https://github.com/leemills83) | Main interface towards all of Spotify's infrastructure and technical documentation. |
+| [bol.com](https://www.bol.com) | [@RoyJacobs](https://github.com/RoyJacobs) | Initial work being done to unify platform tooling. |
+| [DFDS](https://www.dfds.com) | [@carlsendk](https://github.com/carlsendk) | V2 self-service platform. |
+| [Roadie](https://roadie.io) | [@dtuite](https://github.com/dtuite) | Hosted, managed Backstage with easy set-up |
+| [Roku](https://www.roku.com) | [@timurista](https://github.com/timurista) | Initial work on Cloud engineering service platform. |
+| [SDA SE](https://sda.se) | [@Fox32](https://github.com/Fox32) | Central place for developing and sharing services in our insurance ecosystem. |
+| [H-E-B](https://www.heb.com) | [@german-j-rodriguez](https://github.com/german-j-rodriguez) | Initial work on Engineering Portal service platform. |
+| [American Airlines](https://www.aa.com) | [@paulpach](https://github.com/paulpach) | Central place for developers to develop and maintain applications |
+| [Kiwi.com](https://kiwi.com) | [@aexvir](https://github.com/aexvir) | Replacing the frontend of [The Zoo](https://github.com/kiwicom/the-zoo), their service registry. |
+| [Voi](https://www.voiscooters.com/) | [@K-Phoen](https://github.com/K-Phoen) | Developer portal, main gateway to our infrastructure, documentation and internal tooling. |
+| [Talkdesk](https://www.talkdesk.com) | [@jaime-talkdesk](https://github.com/jaime-talkdesk) | Initial work for Engineering Portal and Self Provisioning to R&D |
+| [Wealthsimple](https://www.wealthsimple.com) | [@andrewthauer](https://github.com/andrewthauer) | Developer portal, service catalog, documentation and tooling |
+| [Grab](https://www.grab.com) | [@althafh](https://github.com/althafh) | Initial work as a unified interface for all of Grab's internal tooling |
+| [Telenor Sweden](https://www.telenor.se) | [@O5ten](https://github.com/O5ten) | Building a developer portal for scaffolding projects towards our unified build environment and microservice stacks |
+| [Fiverr](https://www.fiverr.com) | [@nirga](https://github.com/nirga) | Unifying separate tools that developers are using today (i.e. monitoring, dead letter queues management, etc.) into a single platform. |
+| [Zalando SE](https://www.zalando.de) | [@leviferreira](https://github.com/leviferreira) | Building V2 of the Internal Development Portal. |
+| [LegalZoom](https://legalzoom.com) | [@backjo](https://github.com/backjo) | Developer portal - hub for all engineering projects and metadata. |
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 0ab3459628..9df533bb88 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,12 +1,8 @@
# Backstage Changelog
-This is a best-effort changelog where we manually collect breaking changes. It is not an exhaustive list of all changes or even features added.
+This changelog is no longer being updated and will be removed in the future, as each package now has its own changelog instead. It was a best-effort changelog where we manually collected breaking changes during the `v0.1.1-alpha.` releases.
-If you encounter issues while upgrading to a newer version, don't hesitate to reach out on [Discord](https://discord.gg/EBHEGzX) or [open an issue](https://github.com/spotify/backstage/issues/new/choose)!
-
-## Next Release
-
-> Collect changes for the next release below
+If you encounter issues while upgrading to a newer version, don't hesitate to reach out on [Discord](https://discord.gg/EBHEGzX) or [open an issue](https://github.com/backstage/backstage/issues/new/choose)!
## v0.1.1-alpha.26
@@ -26,18 +22,18 @@ If you encounter issues while upgrading to a newer version, don't hesitate to re
### Backend (example-backend, or backends created with @backstage/create-app)
-- A plugin database manager has been created, and plugins can now accept that interface as an argument during initialisation. Notably, the `auth` plugin has a [`createRouter` signature change](./plugins/auth-backend/src/service/router.ts). See [packages/backend/src/index.ts](./packages/backend/src/index.ts) on how to set it up. [#2697](https://github.com/spotify/backstage/pull/2697)
+- A plugin database manager has been created, and plugins can now accept that interface as an argument during initialisation. Notably, the `auth` plugin has a [`createRouter` signature change](./plugins/auth-backend/src/service/router.ts). See [packages/backend/src/index.ts](./packages/backend/src/index.ts) on how to set it up. [#2697](https://github.com/backstage/backstage/pull/2697)
## v0.1.1-alpha.24
### Backend (example-backend, or backends created with @backstage/create-app)
-- The default mount point for backend plugins have been changed to `/api`. These changes are done in the backend package itself, so it is recommended that you sync up existing backend packages with this new pattern. [#2562](https://github.com/spotify/backstage/pull/2562)
-- A service discovery mechanism for backend plugins has been added, and is now a requirement for several backend plugins. See [packages/backend/src/index.ts](./packages/backend/src/index.ts) for how to set it up using `SingleHostDiscovery` from `@backstage/backend-common`. Note that the default base path for plugins is set to `/api` to that change, but it can be set to use the old behavior via the `basePath` option. [#2600](https://github.com/spotify/backstage/pull/2600)
+- The default mount point for backend plugins have been changed to `/api`. These changes are done in the backend package itself, so it is recommended that you sync up existing backend packages with this new pattern. [#2562](https://github.com/backstage/backstage/pull/2562)
+- A service discovery mechanism for backend plugins has been added, and is now a requirement for several backend plugins. See [packages/backend/src/index.ts](./packages/backend/src/index.ts) for how to set it up using `SingleHostDiscovery` from `@backstage/backend-common`. Note that the default base path for plugins is set to `/api` to that change, but it can be set to use the old behavior via the `basePath` option. [#2600](https://github.com/backstage/backstage/pull/2600)
### @backstage/auth-backend
-- The default mount path of backend plugins was changed to `/api/:pluginId`, and as part of that it was needed to enable configuration of the base path of the auth backend, so that it can construct redirect URLs correctly. Note that you will also need to reconfigure any allowed redirect URLs to include `/api` if you switch to the new recommended pattern. [#2562](https://github.com/spotify/backstage/pull/2562)
+- The default mount path of backend plugins was changed to `/api/:pluginId`, and as part of that it was needed to enable configuration of the base path of the auth backend, so that it can construct redirect URLs correctly. Note that you will also need to reconfigure any allowed redirect URLs to include `/api` if you switch to the new recommended pattern. [#2562](https://github.com/backstage/backstage/pull/2562)
- The auth backend now requires an implementation of `PluginEndpointDiscovery` from `@backstage/backend-common` to be passed in as `discovery`. See the changes to `@backstage/backend`.
### @backstage/proxy-backend
@@ -50,28 +46,28 @@ If you encounter issues while upgrading to a newer version, don't hesitate to re
### @backstage/plugin-identity-backend
-- This plugin was removed, remove it from your backend if it's there. [#2616](https://github.com/spotify/backstage/pull/2616)
+- This plugin was removed, remove it from your backend if it's there. [#2616](https://github.com/backstage/backstage/pull/2616)
## v0.1.1-alpha.23
### @backstage/core
-- Renamed `SessionStateApi` to `SessionApi` and `logout` to `signOut`. Custom implementations of the `SingInPage` app-component will need to rename their `logout` function. The different auth provider items for the `UserSettingsMenu` have been consolidated into a single `ProviderSettingsItem`, meaning you need to replace existing usages of `OAuthProviderSettings` and `OIDCProviderSettings`. [#2555](https://github.com/spotify/backstage/pull/2555).
+- Renamed `SessionStateApi` to `SessionApi` and `logout` to `signOut`. Custom implementations of the `SingInPage` app-component will need to rename their `logout` function. The different auth provider items for the `UserSettingsMenu` have been consolidated into a single `ProviderSettingsItem`, meaning you need to replace existing usages of `OAuthProviderSettings` and `OIDCProviderSettings`. [#2555](https://github.com/backstage/backstage/pull/2555).
## v0.1.1-alpha.22
### @backstage/core
-- Introduced initial version of an inverted app/plugin relationship, where plugins export components for apps to use, instead registering themselves directly into the app. This enables more fine-grained control of plugin features, and also composition of plugins such as catalog pages with additional cards and tabs. This breaks the use of `RouteRef`s, and there will be more changes related to this in the future, but this change lays the initial foundation. See `packages/app` and followup PRs for how to update plugins for this change. [#2076](https://github.com/spotify/backstage/pull/2076)
-- Switch to an automatic dependency injection mechanism for all Utility APIs, allowing plugins to ship default implementations of their APIs. See [https://backstage.io/docs/api/utility-apis](https://backstage.io/docs/api/utility-apis). [#2285](https://github.com/spotify/backstage/pull/2285)
+- Introduced initial version of an inverted app/plugin relationship, where plugins export components for apps to use, instead registering themselves directly into the app. This enables more fine-grained control of plugin features, and also composition of plugins such as catalog pages with additional cards and tabs. This breaks the use of `RouteRef`s, and there will be more changes related to this in the future, but this change lays the initial foundation. See `packages/app` and followup PRs for how to update plugins for this change. [#2076](https://github.com/backstage/backstage/pull/2076)
+- Switch to an automatic dependency injection mechanism for all Utility APIs, allowing plugins to ship default implementations of their APIs. See [https://backstage.io/docs/api/utility-apis](https://backstage.io/docs/api/utility-apis). [#2285](https://github.com/backstage/backstage/pull/2285)
### @backstage/cli
-- Change `backstage-cli backend:build-image` to forward all args to `docker image build`, instead of just tag. Also add `--build` flag for building all dependent packages before packaging the workspace for the docker build. [#2299](https://github.com/spotify/backstage/pull/2299)
+- Change `backstage-cli backend:build-image` to forward all args to `docker image build`, instead of just tag. Also add `--build` flag for building all dependent packages before packaging the workspace for the docker build. [#2299](https://github.com/backstage/backstage/pull/2299)
### @backstage/create-app
-- Change root `tsc` output dir to `dist-types`, in order to allow for standalone plugin repos. [#2278](https://github.com/spotify/backstage/pull/2278)
+- Change root `tsc` output dir to `dist-types`, in order to allow for standalone plugin repos. [#2278](https://github.com/backstage/backstage/pull/2278)
### @backstage/catalog-backend
@@ -79,7 +75,7 @@ If you encounter issues while upgrading to a newer version, don't hesitate to re
## v0.1.1-alpha.21
-- Added many more frontend plugins to the template along with the sidebar. [#1942](https://github.com/spotify/backstage/pull/1942), [#2084](https://github.com/spotify/backstage/pull/2084)
+- Added many more frontend plugins to the template along with the sidebar. [#1942](https://github.com/backstage/backstage/pull/1942), [#2084](https://github.com/backstage/backstage/pull/2084)
### @backstage/core
@@ -90,14 +86,14 @@ If you encounter issues while upgrading to a newer version, don't hesitate to re
### @backstage/cli
-- Set `NODE_ENV` to `test` when running test. [#2214](https://github.com/spotify/backstage/pull/2214)
+- Set `NODE_ENV` to `test` when running test. [#2214](https://github.com/backstage/backstage/pull/2214)
-- Fix for backend plugins names requiring to be prefixed with `@backstage` to build. [#2224](https://github.com/spotify/backstage/pull/2224)
+- Fix for backend plugins names requiring to be prefixed with `@backstage` to build. [#2224](https://github.com/backstage/backstage/pull/2224)
### @backstage/backend-common
- The backend plugin
- [service builder](https://github.com/spotify/backstage/blob/master/packages/backend-common/src/service/lib/ServiceBuilderImpl.ts)
+ [service builder](https://github.com/backstage/backstage/blob/master/packages/backend-common/src/service/lib/ServiceBuilderImpl.ts)
no longer adds `express.json()` automatically to all routes. While convenient
in a lot of cases, it also led to problems where for example the proxy
middleware could hang because the body had already been altered and could not
@@ -107,61 +103,61 @@ If you encounter issues while upgrading to a newer version, don't hesitate to re
### @backstage/catalog-backend
-- Add rules configuration for catalog location and entity kinds. The default rules should cover most use-cases, but you may need to allow specific entity kinds when using things like Template or Group entities. [#2118](https://github.com/spotify/backstage/pull/2118)
+- Add rules configuration for catalog location and entity kinds. The default rules should cover most use-cases, but you may need to allow specific entity kinds when using things like Template or Group entities. [#2118](https://github.com/backstage/backstage/pull/2118)
## v0.1.1-alpha.20
### @backstage/cli
-- Use config files according to `NODE_ENV` when serving and building frontend packages. [#2077](https://github.com/spotify/backstage/pull/2077)
+- Use config files according to `NODE_ENV` when serving and building frontend packages. [#2077](https://github.com/backstage/backstage/pull/2077)
-- Pin `rollup-plugin-dts` to avoid a later broken version. [#2097](https://github.com/spotify/backstage/pull/2097)
+- Pin `rollup-plugin-dts` to avoid a later broken version. [#2097](https://github.com/backstage/backstage/pull/2097)
## v0.1.1-alpha.19
### @backstage/backend-common
-- Allow listen host and port to be configured separately, in order to support PORT environment variables. [#1950](https://github.com/spotify/backstage/pull/1950)
+- Allow listen host and port to be configured separately, in order to support PORT environment variables. [#1950](https://github.com/backstage/backstage/pull/1950)
### @backstage/core
-- Added new `DiscoveryApi` for discovering backend endpoint in the frontend, and use in most plugins. See [packages/app/src/apis.ts](https://github.com/spotify/backstage/blob/master/packages/app/src/apis.ts) for how to register in your app. [#2074](https://github.com/spotify/backstage/pull/2074)
+- Added new `DiscoveryApi` for discovering backend endpoint in the frontend, and use in most plugins. See [packages/app/src/apis.ts](https://github.com/backstage/backstage/blob/master/packages/app/src/apis.ts) for how to register in your app. [#2074](https://github.com/backstage/backstage/pull/2074)
### @backstage/create-app
-- Added catalog and scaffolder frontend plugins to the template along with the sidebar. [#1942](https://github.com/spotify/backstage/pull/1942), [#2084](https://github.com/spotify/backstage/pull/2084)
-- Many plugins have been added to the catalog and will for now be required to be added to separate apps as well. This will be solved as [#1536](https://github.com/spotify/backstage/issues/1536) gets sorted out, but for now you may need to install some plugins just to get pages to work.
+- Added catalog and scaffolder frontend plugins to the template along with the sidebar. [#1942](https://github.com/backstage/backstage/pull/1942), [#2084](https://github.com/backstage/backstage/pull/2084)
+- Many plugins have been added to the catalog and will for now be required to be added to separate apps as well. This will be solved as [#1536](https://github.com/backstage/backstage/issues/1536) gets sorted out, but for now you may need to install some plugins just to get pages to work.
### @backstage/catalog-backend
-- Added the possibility to add static locations via `app-config.yaml`. This changed the signature of `new LocationReaders(logger)` inside `packages/backend/src/plugins/catalog.ts` to `new LocationReaders({config, logger})`. [#1890](https://github.com/spotify/backstage/pull/1890)
+- Added the possibility to add static locations via `app-config.yaml`. This changed the signature of `new LocationReaders(logger)` inside `packages/backend/src/plugins/catalog.ts` to `new LocationReaders({config, logger})`. [#1890](https://github.com/backstage/backstage/pull/1890)
### @backstage/theme
-- Changed the type signature of the palette, removing `sidebar: string` and adding `navigation: { background: string; indicator: string}`. [#1880](https://github.com/spotify/backstage/pull/1880)
+- Changed the type signature of the palette, removing `sidebar: string` and adding `navigation: { background: string; indicator: string}`. [#1880](https://github.com/backstage/backstage/pull/1880)
## v0.1.1-alpha.18
### @backstage/catalog-backend
-- Fixed an issue with duplicated location logs. Applying the database migrations from this fix will clear the existing migration logs. [#1836](https://github.com/spotify/backstage/pull/1836)
+- Fixed an issue with duplicated location logs. Applying the database migrations from this fix will clear the existing migration logs. [#1836](https://github.com/backstage/backstage/pull/1836)
### @backstage/auth-backend
This version fixes a breakage in CSP policies set by the auth backend. If you're facing trouble with auth in alpha.17, upgrade to alpha.18.
-- OAuth redirect URLs no longer receive the `env` parameter, as it is now passed through state instead. This will likely require a reconfiguration of the OAuth app, where a redirect URL like `http://localhost:7000/auth/google/handler/frame?env=development` should now be configured as `http://localhost:7000/auth/google/handler/frame`. [#1812](https://github.com/spotify/backstage/pull/1812)
+- OAuth redirect URLs no longer receive the `env` parameter, as it is now passed through state instead. This will likely require a reconfiguration of the OAuth app, where a redirect URL like `http://localhost:7000/auth/google/handler/frame?env=development` should now be configured as `http://localhost:7000/auth/google/handler/frame`. [#1812](https://github.com/backstage/backstage/pull/1812)
### @backstage/core
-- `SignInPage` props have been changed to receive a list of provider objects instead of simple string identifiers for all but the `'guest'` and `'custom'` providers. This opens up for configuration of custom providers, but may break existing configurations. See [packages/app/src/App.tsx](https://github.com/spotify/backstage/blob/032ba401af36a760efdac41668d7000ccf09bc57/packages/app/src/App.tsx#L36) and [packages/app/src/identityProviders.ts](https://github.com/spotify/backstage/blob/032ba401af36a760efdac41668d7000ccf09bc57/packages/app/src/identityProviders.ts#L24) for how to bring back the existing providers. [#1816](https://github.com/spotify/backstage/pull/1816)
+- `SignInPage` props have been changed to receive a list of provider objects instead of simple string identifiers for all but the `'guest'` and `'custom'` providers. This opens up for configuration of custom providers, but may break existing configurations. See [packages/app/src/App.tsx](https://github.com/backstage/backstage/blob/032ba401af36a760efdac41668d7000ccf09bc57/packages/app/src/App.tsx#L36) and [packages/app/src/identityProviders.ts](https://github.com/backstage/backstage/blob/032ba401af36a760efdac41668d7000ccf09bc57/packages/app/src/identityProviders.ts#L24) for how to bring back the existing providers. [#1816](https://github.com/backstage/backstage/pull/1816)
## v0.1.1-alpha.17
### @backstage/techdocs-backend
-- The techdocs backend now requires more configuration to be supplied when creating the router. See [packages/backend/src/plugins/techdocs.ts](https://github.com/spotify/backstage/blob/0201fd9b4a52429519dd59e9184106ba69456deb/packages/backend/src/plugins/techdocs.ts#L42) for an example. [#1736](https://github.com/spotify/backstage/pull/1736)
+- The techdocs backend now requires more configuration to be supplied when creating the router. See [packages/backend/src/plugins/techdocs.ts](https://github.com/backstage/backstage/blob/0201fd9b4a52429519dd59e9184106ba69456deb/packages/backend/src/plugins/techdocs.ts#L42) for an example. [#1736](https://github.com/backstage/backstage/pull/1736)
### @backstage/cli
-- The `create-app` command was moved out from the CLI to a standalone package. It's now invoked with `npx @backstage/create-app` instead. [#1745](https://github.com/spotify/backstage/pull/1745)
+- The `create-app` command was moved out from the CLI to a standalone package. It's now invoked with `npx @backstage/create-app` instead. [#1745](https://github.com/backstage/backstage/pull/1745)
diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md
index 55269dd2a5..6990f72c3f 100644
--- a/CODE_OF_CONDUCT.md
+++ b/CODE_OF_CONDUCT.md
@@ -18,7 +18,7 @@ Harassment includes, but is not limited to:
- Offensive comments related to gender, gender identity and expression, sexual orientation, disability, mental illness, neuro(a)typicality, physical appearance, body size, race, age, regional discrimination, political or religious affiliation
- Unwelcome comments regarding a person’s lifestyle choices and practices, including those related to food, health, parenting, drugs, and employment
- Deliberate misgendering. This includes deadnaming or persistently using a pronoun that does not correctly reflect a person's gender identity. You must address people by the name they give you when not addressing them by their username or handle
-- Physical contact and simulated physical contact (eg, textual descriptions like “_hug_” or “_backrub_”) without consent or after a request to stop
+- Physical contact and simulated physical contact (e.g., textual descriptions like “_hug_” or “_backrub_”) without consent or after a request to stop
- Threats of violence, both physical and psychological
- Incitement of violence towards any individual, including encouraging a person to commit suicide or to engage in self-harm
- Deliberate intimidation
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 7edbc6d17b..d163a42954 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -6,49 +6,49 @@ Therefore we want to create strong community of contributors -- all working toge
Contributions are welcome, and they are greatly appreciated! Every little bit helps, and credit will always be given. ❤️
-Backstage is released under the Apache2.0 License, and original creations contributed to this repo are accepted under the same license.
+Backstage is released under the Apache 2.0 License, and original creations contributed to this repo are accepted under the same license.
-# Types of Contributions
+## Types of Contributions
-## Report bugs
+### Report bugs
-No one likes bugs. Report bugs as an issue [here](https://github.com/spotify/backstage/issues/new?template=bug_template.md).
+No one likes bugs. Report bugs as an issue [here](https://github.com/backstage/backstage/issues/new?template=bug_template.md).
-## Fix bugs or build new features
+### Fix bugs or build new features
-Look through the GitHub issues for [bugs](https://github.com/spotify/backstage/labels/bugs), [good first issues](https://github.com/spotify/backstage/labels/good%20first%20issue) or [help wanted](https://github.com/spotify/backstage/labels/help%20wanted).
+Look through the GitHub issues for [bugs](https://github.com/backstage/backstage/labels/bugs), [good first issues](https://github.com/backstage/backstage/labels/good%20first%20issue) or [help wanted](https://github.com/backstage/backstage/labels/help%20wanted).
-## Build a plugin
+### Build a plugin
The value of Backstage grows with every new plugin that gets added. Wouldn't it be fantastic if there was a plugin for every infrastructure project out there? We think so. And we would love your help.
A great reference example of a plugin can be found on [our blog](https://backstage.io/blog/2020/04/06/lighthouse-plugin) (thanks [@fastfrwrd](https://github.com/fastfrwrd)!)
-What kind of plugins should/could be created? Some inspiration from the 120+ plugins that we have developed inside Spotify can be found [here](https://backstage.io/demos), but we will keep a running list of suggestions labeled with [[plugin]](https://github.com/spotify/backstage/labels/plugin).
+What kind of plugins should/could be created? Some inspiration from the 120+ plugins that we have developed inside Spotify can be found [here](https://backstage.io/demos), but we will keep a running list of suggestions labeled with [[plugin]](https://github.com/backstage/backstage/labels/plugin).
-## Suggesting a plugin
+### Suggesting a plugin
-If you start developing a plugin that you aim to release as open source, we suggest that you create a [new Issue](https://github.com/spotify/backstage/issues/new?labels=plugin&template=plugin_template.md&title=%5BPlugin%5D+THE+PLUGIN+NAME). This helps the community know what plugins are in development.
+If you start developing a plugin that you aim to release as open source, we suggest that you create a [new Issue](https://github.com/backstage/backstage/issues/new?labels=plugin&template=plugin_template.md&title=%5BPlugin%5D+THE+PLUGIN+NAME). This helps the community know what plugins are in development.
You can also use this process if you have an idea for a good plugin but you hope that someone else will pick up the work.
-## Adding Non-code Contributions
+### Adding Non-code Contributions
-Since there is such a large landscape of possible development, build, and deployment environments, we welcome community contributions in these areas in the [`/contrib`](https://github.com/spotify/backstage/tree/master/contrib) folder of the project. This is an excellent place to put things that help out the community at large, but which may not fit within the scope of the core product to support natively. Here, you will find Helm charts, alternative Docker images, and much more.
+Since there is such a large landscape of possible development, build, and deployment environments, we welcome community contributions in these areas in the [`/contrib`](https://github.com/backstage/backstage/tree/master/contrib) folder of the project. This is an excellent place to put things that help out the community at large, but which may not fit within the scope of the core product to support natively. Here, you will find Helm charts, alternative Docker images, and much more.
-## Write Documentation
+### Write Documentation
The current documentation is very limited. Help us make the `/docs` folder come alive.
-## Contribute to Storybook
+### Contribute to Storybook
We think the best way to ensure different plugins provide a consistent experience is through a solid set of reusable UI/UX components. Backstage uses [Storybook](http://backstage.io/storybook).
-Either help us [create new components](https://github.com/spotify/backstage/labels/help%20wanted) or improve stories for the existing ones (look for files with `*.stories.tsx`).
+Either help us [create new components](https://github.com/backstage/backstage/labels/help%20wanted) or improve stories for the existing ones (look for files with `*.stories.tsx`).
-## Submit Feedback
+### Submit Feedback
-The best way to send feedback is to file [an issue](https://github.com/spotify/backstage/issues).
+The best way to send feedback is to file [an issue](https://github.com/backstage/backstage/issues).
If you are proposing a feature:
@@ -58,47 +58,59 @@ If you are proposing a feature:
- Remember that this is a volunteer-driven project, and that contributions
are welcome :)
-## Add your company to ADOPTERS
+### Add your company to ADOPTERS
Have you started using Backstage? Adding your company to [ADOPTERS](ADOPTERS.md) really helps the project.
-# Get Started!
+## Get Started!
So...feel ready to jump in? Let's do this. 👏🏻💯
Start by reading our [Getting Started](https://backstage.io/docs/getting-started/) page. If you need help, just jump into our [Discord chatroom](https://discord.gg/MUpMjP2).
-# Coding Guidelines
+## Coding Guidelines
All code is formatted with `prettier` using the configuration in the repo. If possible we recommend configuring your editor to format automatically, but you can also use the `yarn prettier --write ` command to format files.
+A consistent coding style is included via [EditorConfig](https://editorconfig.org/) with the file [`.editorconfig`](.editorconfig) at the root of the repo. Depending on your editor of choice, it will either support it out of the box or you can [download a plugin](https://editorconfig.org/#download) for the config to be applied.
+
If you're contributing to the backend or CLI tooling, be mindful of cross-platform support. [This](https://shapeshed.com/writing-cross-platform-node/) blog post is a good guide of what to keep in mind when writing cross-platform NodeJS.
-Also be sure to skim through our [ADRs](https://github.com/spotify/backstage/tree/master/docs/architecture-decisions) to see if they cover what you're working on. In particular [ADR006: Avoid React.FC and React.SFC](https://github.com/spotify/backstage/blob/master/docs/architecture-decisions/adr006-avoid-react-fc.md) is one to look out for.
+Also be sure to skim through our [ADRs](https://github.com/backstage/backstage/tree/master/docs/architecture-decisions) to see if they cover what you're working on. In particular [ADR006: Avoid React.FC and React.SFC](https://github.com/backstage/backstage/blob/master/docs/architecture-decisions/adr006-avoid-react-fc.md) is one to look out for.
If there are any updates in `markdown` file please make sure to run `yarn run lint:docs`. Though it is checked on `lint-staged`. It is required to install [vale](https://docs.errata.ai/vale/install) separately and make sure it is accessed by global command.
-# Creating Changesets
+## Creating Changesets
-We use [changesets](https://github.com/atlassian/changesets) to help us prepare releases. It helps us make sure that every package affected by a change gets a proper version number and an entry in its `CHANGELOG.md`. To make the process of generating releases easy. it helps when contributors include changesets with their pull requests.
+We use [changesets](https://github.com/atlassian/changesets) to help us prepare releases. They help us make sure that every package affected by a change gets a proper version number and an entry in its `CHANGELOG.md`. To make the process of generating releases easy, it helps when contributors include changesets with their pull requests.
-## To create a changeset
+### When to use a changeset?
+
+Any time a patch, minor, or major change aligning to [Semantic Versioning](https://semver.org) is made to any published package in `packages/` or `plugins/`, a changeset should be used. It helps to align your change to the [Backstage stability index](https://backstage.io/docs/overview/stability-index) for the package you are changing, for example, when to provide additional clarity on deprecation or impacting changes which will then be included into CHANGELOGs.
+
+In general, changesets are not needed for the documentation, build utilities, contributed samples in `contrib/`, or the [example `packages/app`](packages/app).
+
+### How to create a changeset
1. Run `yarn changeset`
2. Select which packages you want to include a changeset for
-3. Select impact of change that you're introducing (minor, major or patch)
+3. Select impact of change that you're introducing (patch, minor, or major)
4. Add generated changeset to Git
5. Push the commit with your changeset to the branch associated with your PR
-6. Accept our gratitude for making the release process easier on the maintainer
+6. Accept our gratitude for making the release process easier on the maintainers
-For more information, checkout [adding a changeset](https://github.com/atlassian/changesets/blob/master/docs/adding-a-changeset.md) documentation in changesets repository.
+For more information, checkout [adding a changeset](https://github.com/atlassian/changesets/blob/master/docs/adding-a-changeset.md) documentation in the changesets repository.
-# Code of Conduct
+## Merging to Master
+
+For those contributors who have earned write access to the repository, when a pull request is approved, in general we prefer the author of the PR to perform the merge themselves. This allows them to own accountability for the change and they likely know best how or when to address pending fixes or additional follow-ups. In this way, we all help contribute to the project's successful outcomes.
+
+## Code of Conduct
This project adheres to the [Spotify FOSS Code of Conduct][code-of-conduct]. By participating, you are expected to honor this code.
-[code-of-conduct]: https://github.com/spotify/backstage/blob/master/CODE_OF_CONDUCT.md
+[code-of-conduct]: https://github.com/backstage/backstage/blob/master/CODE_OF_CONDUCT.md
-# Security Issues?
+## Security Issues?
See [SECURITY](SECURITY.md).
diff --git a/GOVERNANCE.md b/GOVERNANCE.md
new file mode 100644
index 0000000000..0ab8d8390d
--- /dev/null
+++ b/GOVERNANCE.md
@@ -0,0 +1,45 @@
+# Process for becoming a maintainer
+
+## a) Your organization is not yet a maintainer
+
+- Express interest to the sponsors that your organization is interested in becoming a maintainer. Becoming a maintainer generally means that you are going to be spending substantial time on Backstage for the foreseeable future. You should have domain expertise and be extremely proficient in TypeScript.
+- We will expect you to start contributing increasingly complicated PRs, under the guidance of the existing maintainers.
+- We may ask you to do some PRs from our backlog.
+- As you gain experience with the code base and our standards, we will ask you to do code reviews for incoming PRs.
+- After a period of approximately 2-3 months of working together and making sure we see eye to eye, the existing sponsors and maintainers will confer and decide whether to grant maintainer status or not. We make no guarantees on the length of time this will take, but 2-3 months is the approximate goal.
+
+## b) Your organization is currently a maintainer
+
+To become a maintainer you need to demonstrate the following:
+
+- First decide whether your organization really needs more people with maintainer access. Valid reasons are "blast radius", a large organization that is working on multiple unrelated projects, etc.
+- Contact a sponsor for your organization and express interest.
+- Start doing PRs and code reviews under the guidance of your maintainer.
+- After a period of 1-2 months the existing sponsors will discuss granting maintainer access.
+- Maintainer access can be upgraded to sponsor access after another conference of the existing sponsors.
+
+# Maintainer responsibilities
+
+- Monitor email aliases.
+- Monitor Discord (delayed response is perfectly acceptable).
+- Triage GitHub issues and perform pull request reviews for other maintainers and the community.
+- Triage build issues - file issues for known flaky builds or bugs, and either fix or find someone to fix any master build breakages.
+- During GitHub issue triage, apply all applicable ([labels](https://github.com/backstage/backstage/labels)) to each new issue. Labels are extremely useful for future issue follow up. Which labels to apply is somewhat subjective so just use your best judgment. A few of the most important labels that are not self explanatory are:
+ - good first issue: Mark any issue that can reasonably be accomplished by a new contributor with this label.
+ - help wanted: Unless it is immediately obvious that someone is going to work on an issue (and if so assign it), mark it help wanted.
+- Make sure that ongoing PRs are moving forward at the right pace or closing them.
+- Participate when called upon in the security release process. Note that although this should be a rare occurrence, if a serious vulnerability is found, the process may take up to several full days of work to implement. This reality should be taken into account when discussing time commitment obligations with employers.
+- In general, continue to be willing to spend at least 25% of one's time working on Backstage (~1.25 business days per week).
+- We currently maintain an "on-call" rotation within the maintainers. Each on-call is 1 week. Although all maintainers are welcome to perform all of the above tasks, it is the on-call maintainer's responsibility to triage incoming issues/questions and marshal ongoing work forward. To reiterate, it is not the responsibility of the on-call maintainer to answer all questions and do all reviews, but it is their responsibility to make sure that everything is being actively covered by someone.
+
+# When does a maintainer lose maintainer status
+
+If a maintainer is no longer interested or cannot perform the maintainer duties listed above, they should volunteer to be moved to emeritus status. In extreme cases this can also occur by a vote of the sponsors and maintainers per the voting process below.
+
+# Conflict resolution and voting
+
+In general, we prefer that technical issues and maintainer membership are amicably worked out between the persons involved. If a dispute cannot be decided independently, the sponsors and maintainers can be called in to decide an issue. If the sponsors and maintainers themselves cannot decide an issue, the issue will be resolved by voting. The voting process is a simple majority in which each sponsor receives two votes and each maintainer receives one vote.
+
+# Adding new projects to the Backstage GitHub organization
+
+New projects will be added to the Backstage organization via GitHub issue discussion in one of the existing projects in the organization. Once sufficient discussion has taken place (~3-5 business days but depending on the volume of conversation), the maintainers of the project where the issue was opened (since different projects in the organization may have different maintainers) will decide whether the new project should be added. See the section above on voting if the maintainers cannot easily decide.
diff --git a/OWNERS.md b/OWNERS.md
index 1e7fe5b774..f1649c50b8 100644
--- a/OWNERS.md
+++ b/OWNERS.md
@@ -1,19 +1,27 @@
-# Owners
-
- See [CONTRIBUTING.md](CONTRIBUTING.md) for general contribution guidelines.
+- See [GOVERNANCE.md](GOVERNANCE.md) for governance guidelines and responsibilities.
-## Maintainers 🏓
+This page lists all active sponsors and maintainers.
-- Patrik Oldsberg (@Rugvip, Spotify)
-- Fredrik Adelöw (@freben, Spotify)
-- Raghunandan Balachandran (@soapraj, Spotify)
-- Ben Lambert (@benjdlambert, Spotify)
-- Marcus Eide (@marcuseide, Spotify)
-- Niklas Ek (@nikek, Spotify)
-- Stefan Ålund (@stefanalund, Spotify)
-- Kat Zhou (@katz95, Spotify)
+# Sponsors
-## Hall of Fame 👏
+- Niklas Gustavsson ([protocol7](https://github.com/protocol7)) (ngn@spotify.com)
+- Dave Zolotusky ([dzolotusky](https://github.com/dzolotusky)) (dzolo@spotify.com)
+- Lee Mills ([leemills83](https://github.com/leemills83)) (leem@spotify.com)
-- Andrew Thauer (@andrewthauer, Wealthsimple)
-- Oliver Sand (@Fox32, SDA-SE)
+# Maintainers
+
+- Patrik Oldsberg ([rugvip](https://github.com/rugvip)) (Discord: @Rugvip)
+- Fredrik Adelöw ([freben](https://github.com/freben)) (Discord: @freben)
+- Ben Lambert ([benjdlambert](https://github.com/benjdlambert)) (Discord: @blam)
+- Stefan Ålund ([stefanalund](https://github.com/stefanalund)) (Discord: @stalund)
+
+# Friends of Backstage
+
+People that have made significant contributions to the project and earned write access.
+
+- Andrew Thauer - Wealthsimple (GitHub: [andrewthauer](https://github.com/andrewthauer))
+- Oliver Sand - SDA SE (GitHub: [Fox32](https://github.com/Fox32))
+- David Tuite - Roadie (GitHub: [dtuite](https://github.com/dtuite))
+- Adam Harvey - DXC Technology (GitHub: [adamdmharvey](https://github.com/adamdmharvey))
+- Dominik Henneke - SDA SE (GitHub: [dhenneke](https://github.com/dhenneke))
diff --git a/README.md b/README.md
index 70badd5321..141caef7b7 100644
--- a/README.md
+++ b/README.md
@@ -4,15 +4,19 @@
[](https://opensource.org/licenses/Apache-2.0)
[](https://www.cncf.io/projects)
-[](https://github.com/spotify/backstage/actions?query=workflow%3A%22Main+Master+Build%22)
+[](https://github.com/backstage/backstage/actions?query=workflow%3A%22Main+Master+Build%22)
[](https://discord.gg/EBHEGzX)

-[](https://codecov.io/gh/spotify/backstage)
-[](https://github.com/spotify/backstage/releases)
+[](https://codecov.io/gh/backstage/backstage)
+[](https://github.com/backstage/backstage/releases)
+
+> We recently moved from `spotify/backstage`, update your remotes!
+>
+> `git remote set-url origin git@github.com:backstage/backstage.git`
## What is Backstage?
-[Backstage](https://backstage.io/) is an open platform for building developer portals. Powered by a centralized service catalog, Backstage restores order to your microservices and infrastructure. So your product teams can ship high-quality code quickly — without compromising autonomy.
+[Backstage](https://backstage.io/) is an open platform for building developer portals. Powered by a centralized service catalog, Backstage restores order to your microservices and infrastructure and enables your product teams to ship high-quality code quickly — without compromising autonomy.
Backstage unifies all your infrastructure tooling, services, and documentation to create a streamlined development environment from end to end.
@@ -23,7 +27,7 @@ Out of the box, Backstage includes:
- [Backstage Service Catalog](https://backstage.io/docs/features/software-catalog/software-catalog-overview) for managing all your software (microservices, libraries, data pipelines, websites, ML models, etc.)
- [Backstage Software Templates](https://backstage.io/docs/features/software-templates/software-templates-index) for quickly spinning up new projects and standardizing your tooling with your organization’s best practices
- [Backstage TechDocs](https://backstage.io/docs/features/techdocs/techdocs-overview) for making it easy to create, maintain, find, and use technical documentation, using a "docs like code" approach
-- Plus, a growing ecosystem of [open source plugins](https://github.com/spotify/backstage/tree/master/plugins) that further expand Backstage’s customizability and functionality
+- Plus, a growing ecosystem of [open source plugins](https://github.com/backstage/backstage/tree/master/plugins) that further expand Backstage’s customizability and functionality
Backstage was created by Spotify but is now hosted by the [Cloud Native Computing Foundation (CNCF)](https://www.cncf.io) as a Sandbox level project. Read the announcement [here](https://backstage.io/blog/2020/09/23/backstage-cncf-sandbox).
@@ -46,8 +50,8 @@ Check out [the documentation](https://backstage.io/docs/getting-started) on how
## Community
- [Discord chatroom](https://discord.gg/MUpMjP2) - Get support or discuss the project
-- [Good First Issues](https://github.com/spotify/backstage/contribute) - Start here if you want to contribute
-- [RFCs](https://github.com/spotify/backstage/labels/rfc) - Help shape the technical direction
+- [Good First Issues](https://github.com/backstage/backstage/contribute) - Start here if you want to contribute
+- [RFCs](https://github.com/backstage/backstage/labels/rfc) - Help shape the technical direction
- [FAQ](https://backstage.io/docs/FAQ) - Frequently Asked Questions
- [Code of Conduct](CODE_OF_CONDUCT.md) - This is how we roll
- [Adopters](ADOPTERS.md) - Companies already using Backstage
diff --git a/app-config.yaml b/app-config.yaml
index 4746e822da..66e69462aa 100644
--- a/app-config.yaml
+++ b/app-config.yaml
@@ -16,7 +16,7 @@ backend:
credentials: true
csp:
connect-src: ["'self'", 'http:', 'https:']
- # workingDirectory: /tmp # Use this to configure a working direcotry for the scaffolder, defaults to the OS temp-dir
+ # workingDirectory: /tmp # Use this to configure a working directory for the scaffolder, defaults to the OS temp-dir
# See README.md in the proxy-backend plugin for information on the configuration format
proxy:
@@ -38,7 +38,7 @@ proxy:
headers:
Authorization:
$env: TRAVISCI_AUTH_TOKEN
- travis-api-version: 3
+ travis-api-version: '3'
'/newrelic/apm/api':
target: https://api.newrelic.com/v2
@@ -46,22 +46,45 @@ proxy:
X-Api-Key:
$env: NEW_RELIC_REST_API_KEY
+ '/pagerduty':
+ target: https://api.pagerduty.com
+ headers:
+ Authorization:
+ $env: PAGERDUTY_TOKEN
+
+ '/buildkite/api':
+ target: https://api.buildkite.com/v2/
+ headers:
+ Authorization:
+ $env: BUILDKITE_TOKEN
+
+ '/sentry/api':
+ target: https://sentry.io/api/
+ allowedMethods: ['GET']
+ headers:
+ Authorization:
+ $env: SENTRY_TOKEN
+
organization:
name: My Company
+# Reference documentation http://backstage.io/docs/features/techdocs/configuration
techdocs:
- storageUrl: http://localhost:7000/api/techdocs/static/docs
requestUrl: http://localhost:7000/api/techdocs
+ storageUrl: http://localhost:7000/api/techdocs/static/docs
+ builder: 'local' # Alternatives - 'external'
generators:
- techdocs: 'docker'
+ techdocs: 'docker' # Alternatives - 'local'
+ publisher:
+ type: 'local' # Alternatives - 'googleGcs'. Read documentation for using alternatives.
sentry:
organization: my-company
rollbar:
organization: my-company
- accountToken:
- $env: ROLLBAR_ACCOUNT_TOKEN
+ # NOTE: The rollbar-backend & accountToken key may be deprecated in the future (replaced by a proxy config)
+ accountToken: my-rollbar-account-token
lighthouse:
baseUrl: http://localhost:3003
@@ -114,7 +137,7 @@ catalog:
$env: GITHUB_TOKEN
#### Example for how to add your GitHub Enterprise instance using the API:
# - target: https://ghe.example.net
- # apiBaseUrl: https://ghe.example.net/api/v3
+ # apiBaseUrl: https://ghe.example.net/api
# token:
# $env: GHE_TOKEN
ldapOrg:
@@ -134,26 +157,39 @@ catalog:
# dn: ou=access,ou=groups,ou=example,dc=example,dc=net
# options:
# filter: (&(objectClass=some-group-class)(!(groupType=email)))
+ microsoftGraphOrg:
+ ### Example for how to add your Microsoft Graph tenant
+ #providers:
+ # - target: https://graph.microsoft.com/v1.0
+ # authority: https://login.microsoftonline.com
+ # tenantId:
+ # $env: MICROSOFT_GRAPH_TENANT_ID
+ # clientId:
+ # $env: MICROSOFT_GRAPH_CLIENT_ID
+ # clientSecret:
+ # $env: MICROSOFT_GRAPH_CLIENT_SECRET_TOKEN
+ # userFilter: accountEnabled eq true and userType eq 'member'
+ # groupFilter: securityEnabled eq false and mailEnabled eq true and groupTypes/any(c:c+eq+'Unified')
locations:
# Backstage example components
- type: url
- target: https://github.com/spotify/backstage/blob/master/packages/catalog-model/examples/all-components.yaml
+ target: https://github.com/backstage/backstage/blob/master/packages/catalog-model/examples/all-components.yaml
# Example component for github-actions
- type: url
- target: https://github.com/spotify/backstage/blob/master/plugins/github-actions/examples/sample.yaml
+ target: https://github.com/backstage/backstage/blob/master/plugins/github-actions/examples/sample.yaml
# Example component for techdocs
- type: url
- target: https://github.com/spotify/backstage/blob/master/plugins/techdocs-backend/examples/documented-component/documented-component.yaml
+ target: https://github.com/backstage/backstage/blob/master/plugins/techdocs-backend/examples/documented-component/documented-component.yaml
# Backstage example APIs
- type: url
- target: https://github.com/spotify/backstage/blob/master/packages/catalog-model/examples/all-apis.yaml
+ target: https://github.com/backstage/backstage/blob/master/packages/catalog-model/examples/all-apis.yaml
# Backstage example templates
- type: url
- target: https://github.com/spotify/backstage/blob/master/plugins/scaffolder-backend/sample-templates/all-templates.yaml
+ target: https://github.com/backstage/backstage/blob/master/plugins/scaffolder-backend/sample-templates/all-templates.yaml
# Backstage example groups and users
- type: url
- target: https://github.com/spotify/backstage/blob/master/packages/catalog-model/examples/acme-corp.yaml
+ target: https://github.com/backstage/backstage/blob/master/packages/catalog-model/examples/acme-corp.yaml
scaffolder:
github:
@@ -170,8 +206,18 @@ scaffolder:
api:
token:
$env: AZURE_TOKEN
-
+ bitbucket:
+ api:
+ host: https://bitbucket.org
+ username:
+ $env: BITBUCKET_USERNAME
+ token:
+ $env: BITBUCKET_TOKEN
auth:
+ environment: development
+ ### Providing an auth.session.secret will enable session support in the auth-backend
+ # session:
+ # secret: custom session secret
providers:
google:
development:
@@ -216,6 +262,20 @@ auth:
$env: AUTH_OAUTH2_AUTH_URL
tokenUrl:
$env: AUTH_OAUTH2_TOKEN_URL
+ oidc:
+ development:
+ metadataUrl:
+ $env: AUTH_OIDC_METADATA_URL
+ clientId:
+ $env: AUTH_OIDC_CLIENT_ID
+ clientSecret:
+ $env: AUTH_OIDC_CLIENT_SECRET
+ authorizationUrl:
+ $env: AUTH_OIDC_AUTH_URL
+ tokenUrl:
+ $env: AUTH_OIDC_TOKEN_URL
+ tokenSignedResponseAlg:
+ $env: AUTH_OIDC_TOKEN_SIGNED_RESPONSE_ALG
auth0:
development:
clientId:
@@ -232,6 +292,14 @@ auth:
$env: AUTH_MICROSOFT_CLIENT_SECRET
tenantId:
$env: AUTH_MICROSOFT_TENANT_ID
+ onelogin:
+ development:
+ clientId:
+ $env: AUTH_ONELOGIN_CLIENT_ID
+ clientSecret:
+ $env: AUTH_ONELOGIN_CLIENT_SECRET
+ issuer:
+ $env: AUTH_ONELOGIN_ISSUER
costInsights:
engineerCost: 200000
products:
@@ -245,8 +313,11 @@ costInsights:
name: Cloud Storage
icon: storage
bigQuery:
- name: Big Query
+ name: BigQuery
icon: search
+ events:
+ name: Events
+ icon: data
metrics:
DAU:
name: Daily Active Users
@@ -256,10 +327,12 @@ costInsights:
homepage:
clocks:
- label: UTC
- timzone: UTC
+ timezone: UTC
- label: NYC
timezone: 'America/New_York'
- label: STO
timezone: 'Europe/Stockholm'
- label: TYO
timezone: 'Asia/Tokyo'
+pagerduty:
+ eventsBaseUrl: 'https://events.pagerduty.com/v2'
diff --git a/catalog-info.yaml b/catalog-info.yaml
index 405c3f31b4..617d01093e 100644
--- a/catalog-info.yaml
+++ b/catalog-info.yaml
@@ -5,10 +5,10 @@ metadata:
description: |
Backstage is an open-source developer portal that puts the developer experience first.
annotations:
- github.com/project-slug: spotify/backstage
- backstage.io/techdocs-ref: github:https://github.com/spotify/backstage.git
+ github.com/project-slug: backstage/backstage
+ backstage.io/techdocs-ref: github:https://github.com/backstage/backstage.git
lighthouse.com/website-url: https://backstage.io
spec:
type: library
- owner: Spotify
+ owner: CNCF
lifecycle: experimental
diff --git a/contrib/chart/backstage/Chart.yaml b/contrib/chart/backstage/Chart.yaml
index 24c6f2a4d7..8aeab9be3e 100644
--- a/contrib/chart/backstage/Chart.yaml
+++ b/contrib/chart/backstage/Chart.yaml
@@ -1,6 +1,6 @@
apiVersion: v2
name: backstage
-description: A Helm chart for Spotify Backstage
+description: A Helm chart for Backstage
type: application
# This is the chart version. This version number should be incremented each time you make changes
@@ -12,7 +12,7 @@ version: 0.1.1
appVersion: v0.1.1-alpha.23
sources:
- - https://github.com/spotify/backstage
+ - https://github.com/backstage/backstage
- https://github.com/spotify/lighthouse-audit-service
dependencies:
diff --git a/contrib/chart/backstage/README.md b/contrib/chart/backstage/README.md
index 9d1c93765b..96bfdb4351 100644
--- a/contrib/chart/backstage/README.md
+++ b/contrib/chart/backstage/README.md
@@ -7,7 +7,7 @@ This folder contains Helm charts that can easily create a Kubernetes deployment
These charts depend on the `nginx-ingress` controller being present in the cluster. If it's not already installed you
can run:
-```
+```shell
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm install nginx-ingress ingress-nginx/ingress-nginx
```
@@ -16,7 +16,7 @@ helm install nginx-ingress ingress-nginx/ingress-nginx
After choosing a DNS name where backstage will be hosted create a yaml file for your custom configuration.
-```
+```yaml
appConfig:
app:
baseUrl: https://backstage.mydomain.com
@@ -30,13 +30,12 @@ appConfig:
techdocs:
storageUrl: https://backstage.mydomain.com/api/techdocs/static/docs
requestUrl: https://backstage.mydomain.com/api/techdocs
-
```
Then use it to run:
-```
-git clone https://github.com/spotify/backstage.git
+```shell
+git clone https://github.com/backstage/backstage.git
cd contrib/chart/backstage
helm dependency update
helm install -f backstage-mydomain.yaml backstage .
@@ -54,7 +53,7 @@ After a few minutes Backstage should be up and running in your cluster under the
Make sure to create the appropriate DNS entry in your infrastructure. To find the public IP address run:
-```bash
+```shell
$ kubectl get ingress
NAME HOSTS ADDRESS PORTS AGE
backstage-ingress * 123.1.2.3 80 17m
@@ -74,10 +73,10 @@ These charts can install or reuse a `clusterIssuer` to generate certificates for
To enable it you need to provide a valid email address in the chart's values:
-```
+```yaml
issuer:
email: me@example.com
- clusterIssuer: "letsencrypt-prod"
+ clusterIssuer: 'letsencrypt-prod'
```
By default, the charts use `letsencrypt-staging` so in the above example we instruct helm to use the production issuer
@@ -92,7 +91,7 @@ Configuring a connection to an existing PostgreSQL instance is possible through
First create a yaml file with the configuration you want to override, for example `backstage-prod.yaml`:
-```bash
+```yaml
postgresql:
enabled: false
@@ -122,18 +121,19 @@ lighthouse:
user:
password:
database: lighthouse_audit_service
-
```
-For the CA, create a `configMap` named `-postgres-ca` with a file called `ca.crt`:
+For the CA, create a `configMap` named `--postgres-ca` with a file called `ca.crt`:
+```shell
+kubectl create configmap my-company-backstage-postgres-ca --from-file=ca.crt"
```
-kubectl create configmap my-backstage --from-file=ca.crt"
-```
+
+> Where the release name contains the chart name "backstage" then only the release name will be used.
Now install the helm chart:
-```
+```shell
cd contrib/chart/backstage
helm install -f backstage-prod.yaml my-backstage .
```
@@ -142,7 +142,7 @@ helm install -f backstage-prod.yaml my-backstage .
The docker images used for the deployment can be configured through the charts values:
-```
+```yaml
frontend:
image:
repository:
@@ -155,15 +155,31 @@ backend:
lighthouse:
image:
- repository:
tag:
```
+### Use a private docker repo
+
+Create a docker-registry secret
+
+```shell
+kubectl create secret docker-registry # args
+```
+
+> For private images on docker hub --docker-server can be set to docker.io
+
+Reference the secret in your chart values
+
+```yaml
+dockerRegistrySecretName:
+```
+
### Different namespace
To install the charts a specific namespace use `--namespace `:
-```
+```shell
helm install -f my_values.yaml --namespace demos backstage .
```
@@ -171,7 +187,7 @@ helm install -f my_values.yaml --namespace demos backstage .
To deploy backstage with the pre-loaded demo data disable `backend.demoData`:
-```
+```shell
helm install -f my_values.yaml --set backend.demoData=false backstage .
```
@@ -226,7 +242,7 @@ This error happens in the backend when it tries to connect to the configured Pos
To uninstall Backstage simply run:
-```
+```shell
RELEASE_NAME= # use `helm list` to find out the name
helm uninstall ${RELEASE_NAME}
kubectl delete pvc data-${RELEASE_NAME}-postgresql-0
diff --git a/contrib/chart/backstage/files/app-config.development.yaml.tpl b/contrib/chart/backstage/files/app-config.development.yaml.tpl
index 76d6499145..1e0a41ad63 100644
--- a/contrib/chart/backstage/files/app-config.development.yaml.tpl
+++ b/contrib/chart/backstage/files/app-config.development.yaml.tpl
@@ -18,19 +18,19 @@ catalog:
locations:
# Backstage example components
- type: github
- target: https://github.com/spotify/backstage/blob/master/packages/catalog-model/examples/all-components.yaml
+ target: https://github.com/backstage/backstage/blob/master/packages/catalog-model/examples/all-components.yaml
# Example component for github-actions
- type: github
- target: https://github.com/spotify/backstage/blob/master/plugins/github-actions/examples/sample.yaml
+ target: https://github.com/backstage/backstage/blob/master/plugins/github-actions/examples/sample.yaml
# Example component for techdocs
- type: github
- target: https://github.com/spotify/backstage/blob/master/plugins/techdocs-backend/examples/documented-component/documented-component.yaml
+ target: https://github.com/backstage/backstage/blob/master/plugins/techdocs-backend/examples/documented-component/documented-component.yaml
# Backstage example APIs
- type: github
- target: https://github.com/spotify/backstage/blob/master/packages/catalog-model/examples/all-apis.yaml
+ target: https://github.com/backstage/backstage/blob/master/packages/catalog-model/examples/all-apis.yaml
# Backstage example templates
- type: github
- target: https://github.com/spotify/backstage/blob/master/plugins/scaffolder-backend/sample-templates/all-templates.yaml
+ target: https://github.com/backstage/backstage/blob/master/plugins/scaffolder-backend/sample-templates/all-templates.yaml
{{- else }}
locations: []
{{- end }}
diff --git a/contrib/chart/backstage/templates/backend-deployment.yaml b/contrib/chart/backstage/templates/backend-deployment.yaml
index c57764db8e..99ec955242 100644
--- a/contrib/chart/backstage/templates/backend-deployment.yaml
+++ b/contrib/chart/backstage/templates/backend-deployment.yaml
@@ -20,6 +20,10 @@ spec:
component: backend
spec:
+ {{- if .Values.dockerRegistrySecretName }}
+ imagePullSecrets:
+ - name: {{ .Values.dockerRegistrySecretName }}
+ {{- end}}
containers:
- name: {{ .Chart.Name }}-backend
image: {{ .Values.backend.image.repository }}:{{ .Values.backend.image.tag }}
diff --git a/contrib/chart/backstage/templates/backend-secret.yaml b/contrib/chart/backstage/templates/backend-secret.yaml
index b340f39d7c..299d893ec4 100644
--- a/contrib/chart/backstage/templates/backend-secret.yaml
+++ b/contrib/chart/backstage/templates/backend-secret.yaml
@@ -20,4 +20,5 @@ stringData:
AZURE_TOKEN: {{ .Values.auth.azure.api.token }}
NEW_RELIC_REST_API_KEY: {{ .Values.auth.newRelicRestApiKey }}
TRAVISCI_AUTH_TOKEN: {{ .Values.auth.travisciAuthToken }}
+ PAGERDUTY_TOKEN: {{ .Values.auth.pagerdutyToken }}
{{- end }}
diff --git a/contrib/chart/backstage/templates/frontend-deployment.yaml b/contrib/chart/backstage/templates/frontend-deployment.yaml
index a5d84be2b2..5430ef041f 100644
--- a/contrib/chart/backstage/templates/frontend-deployment.yaml
+++ b/contrib/chart/backstage/templates/frontend-deployment.yaml
@@ -20,6 +20,10 @@ spec:
component: frontend
spec:
+ {{- if .Values.dockerRegistrySecretName }}
+ imagePullSecrets:
+ - name: {{ .Values.dockerRegistrySecretName }}
+ {{- end}}
containers:
- name: {{ .Chart.Name }}-frontend
image: {{ .Values.frontend.image.repository }}:{{ .Values.frontend.image.tag }}
diff --git a/contrib/chart/backstage/templates/lighthouse-deployment.yaml b/contrib/chart/backstage/templates/lighthouse-deployment.yaml
index 70341a2a22..13bb8eadbb 100644
--- a/contrib/chart/backstage/templates/lighthouse-deployment.yaml
+++ b/contrib/chart/backstage/templates/lighthouse-deployment.yaml
@@ -21,6 +21,10 @@ spec:
component: lighthouse-audit-service
spec:
+ {{- if .Values.dockerRegistrySecretName }}
+ imagePullSecrets:
+ - name: {{ .Values.dockerRegistrySecretName }}
+ {{- end}}
containers:
- name: lighthouse-audit-service
image: {{ .Values.lighthouse.image.repository }}:{{ .Values.lighthouse.image.tag }}
diff --git a/contrib/chart/backstage/templates/postgresql-password-secret.yaml b/contrib/chart/backstage/templates/postgresql-password-secret.yaml
index 9685130a03..e53369adb9 100644
--- a/contrib/chart/backstage/templates/postgresql-password-secret.yaml
+++ b/contrib/chart/backstage/templates/postgresql-password-secret.yaml
@@ -8,7 +8,7 @@ metadata:
labels:
release: {{ .Release.Name }}
annotations:
- "helm.sh/hook": "pre-install"
+ "helm.sh/hook": "pre-install,pre-upgrade"
"helm.sh/hook-delete-policy": "before-hook-creation"
data:
postgresql-password: {{ .Values.appConfig.backend.database.connection.password | b64enc }}
@@ -23,7 +23,7 @@ metadata:
labels:
release: {{ .Release.Name }}
annotations:
- "helm.sh/hook": "pre-install"
+ "helm.sh/hook": "pre-install,pre-upgrade"
"helm.sh/hook-delete-policy": "before-hook-creation"
data:
postgresql-password: {{ .Values.lighthouse.database.connection.password | b64enc }}
diff --git a/contrib/chart/backstage/values.yaml b/contrib/chart/backstage/values.yaml
index eb06422d34..261f352f93 100644
--- a/contrib/chart/backstage/values.yaml
+++ b/contrib/chart/backstage/values.yaml
@@ -105,14 +105,14 @@ appConfig:
rejectUnauthorized: false
ca:
sentry:
- organization: spotify
+ organization: example-org-name
techdocs:
storageUrl: https://demo.example.com/api/techdocs/static/docs
requestUrl: https://demo.example.com/api/techdocs
lighthouse:
baseUrl: https://demo.example.com/lighthouse-api
rollbar:
- organization: roadie
+ organization: example-org-name
# Auth config has recently moved into the app config file in upstream Backstage. However,
# most of this config simply mandates that items like the client id and client secret should
@@ -250,3 +250,4 @@ auth:
gitlabToken: g
newRelicRestApiKey: r
travisciAuthToken: fake-travis-ci-auth-token
+ pagerdutyToken: h
diff --git a/contrib/docker/kubernetes-example-backend/Dockerfile b/contrib/docker/kubernetes-example-backend/Dockerfile
index df617decf5..b7d7a9631e 100644
--- a/contrib/docker/kubernetes-example-backend/Dockerfile
+++ b/contrib/docker/kubernetes-example-backend/Dockerfile
@@ -30,6 +30,4 @@ RUN yarn install --frozen-lockfile --production
# Do not use this Dockerfile outside of that command, as it will copy in the source code instead.
COPY . .
-CMD ["node", "packages/backend"]
-
-
+CMD ["node", "packages/backend", "--config", "app-config.yaml", "--config", "app-config.development.yaml"]
diff --git a/contrib/docs/tutorials/help-im-behind-a-corporate-proxy.md b/contrib/docs/tutorials/help-im-behind-a-corporate-proxy.md
index 4f8351ac15..f5288cf144 100644
--- a/contrib/docs/tutorials/help-im-behind-a-corporate-proxy.md
+++ b/contrib/docs/tutorials/help-im-behind-a-corporate-proxy.md
@@ -12,7 +12,7 @@ There are however some ways to get this to work without too much effort. It's mo
### Using `global-agent`
-1. Install `global-agent` using `yarn install global-agent`
+1. Install `global-agent` using `yarn add global-agent`
2. Go to the entry file for the backend (`src/index.ts`)
3. At the top of the file paste the following:
@@ -33,7 +33,7 @@ More information and more options for configuring `global-agent` including just
`proxy-agent` is a library that you can use to override the `globalAgents` of `node` land with a tunnel to use for each request.
-1. Install `proxy-agent` using `yarn install proxy-agent`
+1. Install `proxy-agent` using `yarn add proxy-agent`
2. Go to the entry file for the backend (`src/index.ts`)
3. At the top of the file paste the following:
diff --git a/contrib/docs/tutorials/quickstart-app-plugin/ExampleComponent.md b/contrib/docs/tutorials/quickstart-app-plugin/ExampleComponent.md
index 5d633544e3..9b5d77bc7c 100644
--- a/contrib/docs/tutorials/quickstart-app-plugin/ExampleComponent.md
+++ b/contrib/docs/tutorials/quickstart-app-plugin/ExampleComponent.md
@@ -3,7 +3,7 @@
ExampleComponent.tsx reference
```tsx
-import React, { FC } from 'react';
+import React from 'react';
import { Typography, Grid } from '@material-ui/core';
import {
InfoCard,
@@ -18,7 +18,7 @@ import {
import { useApi } from '@backstage/core-api';
import ExampleFetchComponent from '../ExampleFetchComponent';
-const ExampleComponent: FC<{}> = () => {
+const ExampleComponent = () => {
const identityApi = useApi(identityApiRef);
const userId = identityApi.getUserId();
const profile = identityApi.getProfile();
diff --git a/contrib/docs/tutorials/quickstart-app-plugin/ExampleFetchComponent.md b/contrib/docs/tutorials/quickstart-app-plugin/ExampleFetchComponent.md
index 08d14e8c4c..6061b69e93 100644
--- a/contrib/docs/tutorials/quickstart-app-plugin/ExampleFetchComponent.md
+++ b/contrib/docs/tutorials/quickstart-app-plugin/ExampleFetchComponent.md
@@ -3,7 +3,7 @@
ExampleFetchComponent.tsx reference
```tsx
-import React, { FC } from 'react';
+import React from 'react';
import { useAsync } from 'react-use';
import Alert from '@material-ui/lab/Alert';
import {
@@ -57,7 +57,7 @@ type DenseTableProps = {
viewer: Viewer;
};
-export const DenseTable: FC = ({ viewer }) => {
+export const DenseTable = ({ viewer }: DenseTableProps) => {
const columns: TableColumn[] = [
{ title: 'Name', field: 'name' },
{ title: 'Created', field: 'createdAt' },
@@ -76,7 +76,7 @@ export const DenseTable: FC = ({ viewer }) => {
);
};
-const ExampleFetchComponent: FC<{}> = () => {
+const ExampleFetchComponent = () => {
const auth = useApi(githubAuthApiRef);
const { value, loading, error } = useAsync(async (): Promise => {
diff --git a/contrib/kubernetes/basic_kubernetes_example_with_helm/backstage/Chart.yaml b/contrib/kubernetes/basic_kubernetes_example_with_helm/backstage/Chart.yaml
index efc3635a7f..6cbb7ea3cb 100644
--- a/contrib/kubernetes/basic_kubernetes_example_with_helm/backstage/Chart.yaml
+++ b/contrib/kubernetes/basic_kubernetes_example_with_helm/backstage/Chart.yaml
@@ -1,5 +1,5 @@
apiVersion: v1
appVersion: '1.0'
-description: A Helm chart for Spotify Backstage
+description: A Helm chart for Backstage
name: backstage
version: 0.1.1-alpha.12
diff --git a/contrib/kubernetes/plain_single_backend_deplyoment/README.md b/contrib/kubernetes/plain_single_backend_deployment/README.md
similarity index 97%
rename from contrib/kubernetes/plain_single_backend_deplyoment/README.md
rename to contrib/kubernetes/plain_single_backend_deployment/README.md
index 685bed92a5..48c3490f81 100644
--- a/contrib/kubernetes/plain_single_backend_deplyoment/README.md
+++ b/contrib/kubernetes/plain_single_backend_deployment/README.md
@@ -13,7 +13,7 @@ yarn install
yarn docker-build
-kubectl apply -f contrib/kubernetes/plain_single_backend_deplyoment/deployment.yaml
+kubectl apply -f contrib/kubernetes/plain_single_backend_deployment/deployment.yaml
```
You can use the following commands to monitor the deployment:
diff --git a/contrib/kubernetes/plain_single_backend_deplyoment/deployment.yaml b/contrib/kubernetes/plain_single_backend_deployment/deployment.yaml
similarity index 84%
rename from contrib/kubernetes/plain_single_backend_deplyoment/deployment.yaml
rename to contrib/kubernetes/plain_single_backend_deployment/deployment.yaml
index a20c47229d..25c9207438 100644
--- a/contrib/kubernetes/plain_single_backend_deplyoment/deployment.yaml
+++ b/contrib/kubernetes/plain_single_backend_deployment/deployment.yaml
@@ -38,12 +38,12 @@ spec:
- name: NODE_ENV
value: development
- # This makes it possible for the app to reach the backend when serving through `kubectl proxy`
- # If you expose the service using for example an ingress controller, you should
- # switch this out or remove it.
- #
- # Note that we're not setting app.baseUrl here, as setting the base path is not working at the moment.
- # Further work is needed around the routing in the frontend or react-router before we can support that.
+ # This makes it possible for the app to reach the backend when serving through `kubectl proxy`
+ # If you expose the service using for example an ingress controller, you should
+ # switch this out or remove it.
+ #
+ # Note that we're not setting app.baseUrl here, as setting the base path is not working at the moment.
+ # Further work is needed around the routing in the frontend or react-router before we can support that.
- name: APP_CONFIG_backend_baseUrl
value: http://localhost:8001/api/v1/namespaces/backstage/services/backstage-backend:http/proxy
diff --git a/docs/FAQ.md b/docs/FAQ.md
index 7163d955c7..da10f9724c 100644
--- a/docs/FAQ.md
+++ b/docs/FAQ.md
@@ -48,11 +48,10 @@ source candidates. (And we'll probably end up writing some brand new ones, too.)
### What's the roadmap for Backstage?
We envision three phases, which you can learn about in
-[our project roadmap](https://github.com/spotify/backstage#project-roadmap).
-Even though the open source version of Backstage is relatively new compared to
-our internal version, we have already begun work on various aspects of all three
-phases. Looking at the
-[milestones for active issues](https://github.com/spotify/backstage/milestones)
+[our project roadmap](overview/roadmap.md). Even though the open source version
+of Backstage is relatively new compared to our internal version, we have already
+begun work on various aspects of all three phases. Looking at the
+[milestones for active issues](https://github.com/backstage/backstage/milestones)
will also give you a sense of our progress.
### My company doesn't have thousands of developers or services. Is Backstage overkill?
@@ -87,8 +86,8 @@ well-known tech and a large flora of components.
### What technology does Backstage use?
The codebase is a large-scale React application that uses TypeScript. For
-[Phase 2](https://github.com/spotify/backstage#project-roadmap), we plan to use
-Node.js and GraphQL.
+[Phase 2](https://github.com/backstage/backstage#project-roadmap), we plan to
+use Node.js and GraphQL.
### What is the end-to-end user flow? The happy path story.
@@ -115,10 +114,65 @@ type of content. Plugins all use a common set of platform APIs and reusable UI
components. Plugins can fetch data either from the backend or an API exposed
through the proxy.
-Learn more about
-[the different components](https://github.com/spotify/backstage#overview) that
+Learn more about [the different components](overview/what-is-backstage.md) that
make up Backstage.
+### How do I keep my Backstage app up to date?
+
+In many ways one can view Backstage as a library rather than an application or
+service. The `@backstage/create-app` tool that is used to create your own
+Backstage app is similar to
+[`create-react-app`](https://github.com/facebook/create-react-app) in that it
+gives you a starting point. The code you get is meant to be evolved, and most of
+the functionality you get out of the box is brought in via npm dependencies.
+Keeping your app up to date generally means keeping your dependencies up to
+date. The Backstage CLI provides a command to help you with that. Simply run
+`yarn backstage-cli versions:bump` at the root of your repo, and the latest
+versions of all Backstage packages will be installed.
+
+While staying up to date with new releases and changes will keep your app up to
+date, it can often be convenient to use the changes done to the
+`@backstage/create-app` template as another method to stay up to date. For that
+purpose, any changes done to the template are documented along with upgrade
+instructions in the
+[changelog](https://github.com/backstage/backstage/blob/master/packages/create-app/CHANGELOG.md)
+of the `@backstage/create-app` package.
+
+### Why can't I dynamically install plugins without modifications the app?
+
+This decision is part of the core architecture and development flow of
+Backstage. Plugins have a lot of freedom in what they provide and how they are
+integrated into the app, and it would therefore add a lot of complexity to allow
+plugins to be integrated via configuration the same way as they can be
+integrated with code.
+
+By bundling all plugins and their dependencies into one app bundle it is also
+possible to do significant optimizations to the app load time by allowing
+plugins to share dependencies between each other when possible. This contributes
+to Backstage being fast, which is an important part of the user and developer
+experience.
+
+### Why are there no published Docker images or helm charts for Backstage?
+
+As mentioned above, Backstage is not a packaged service that you can use out of
+the box. In order to get started with Backstage you need to use the
+`@backstage/create-app` package to create and customize your own Backstage app.
+
+In order to build a Docker image from your own app, you can use the
+`yarn build-image` command which is included out of the box in the app template.
+By default this image will bundle up both the frontend and the backend into a
+single image that you can deploy using your favorite tooling.
+
+There are also some examples that can help you deploy Backstage to kubernetes in
+the
+[contrib](https://github.com/backstage/backstage/tree/master/contrib/kubernetes)
+folder.
+
+It is possible that example images will be provided in the future, which can be
+used to quickly try out a small subset of the functionality of Backstage, but
+these would not be able to provide much more functionality on top of what you
+can see on a demo site.
+
### Do I have to write plugins in TypeScript?
No, you can use JavaScript if you prefer. We want to keep the Backstage core
@@ -126,17 +180,17 @@ APIs in TypeScript, but aren't forcing it on individual plugins.
### How do I find out if a plugin already exists?
-Before you write a plugin,
-[search the plugin issues](https://github.com/spotify/backstage/issues?q=is%3Aissue+label%3Aplugin+)
-to see if it already exists or is in the works. If no one's thought of it yet,
-great! Open a new issue as
-[a plugin suggestion](https://github.com/spotify/backstage/issues/new/choose)
-and describe what your plugin will do. This will help coordinate our
-contributors' efforts and avoid duplicating existing functionality.
-
You can browse and search for all available plugins in the
[Plugin Marketplace](https://backstage.io/plugins).
+If you can't find it in the marketplace, before you write a plugin
+[search the plugin issues](https://github.com/backstage/backstage/issues?q=is%3Aissue+label%3Aplugin+)
+to see if is in the works. If no one's thought of it yet, great! Open a new
+issue as
+[a plugin suggestion](https://github.com/backstage/backstage/issues/new/choose)
+and describe what your plugin will do. This will help coordinate our
+contributors' efforts and avoid duplicating existing functionality.
+
### Which plugin is used the most at Spotify?
By far, our most-used plugin is our TechDocs plugin, which we use for creating
@@ -151,7 +205,7 @@ above)
### Are you planning to have plugins baked into the repo? Or should they be developed in separate repos?
Contributors can add open source plugins to the plugins directory in
-[this monorepo](https://github.com/spotify/backstage). Integrators can then
+[this monorepo](https://github.com/backstage/backstage). Integrators can then
configure which open source plugins are available to use in their instance of
the app. Open source plugins are downloaded as npm packages published in the
open source repository. While we encourage using the open source model, we know
@@ -166,7 +220,7 @@ We chose GitHub because it is the tool that we are most familiar with, so that
will naturally lead to integrations for GitHub being developed at an early
stage. Hosting this project on GitHub does not exclude integrations with
alternatives, such as
-[GitLab](https://github.com/spotify/backstage/issues?q=is%3Aissue+is%3Aopen+GitLab)
+[GitLab](https://github.com/backstage/backstage/issues?q=is%3Aissue+is%3Aopen+GitLab)
or Bitbucket. We believe that in time there will be plugins that will provide
functionality for these tools as well. Hopefully, contributed by the community!
Also note, implementations of Backstage can be hosted wherever you feel suits
@@ -182,6 +236,10 @@ comes to [deployment](https://backstage.io/docs/getting-started/deployment-k8s),
the system integrator (typically, the infrastructure team in your organization)
maintains Backstage in your own environment.
+For more information, see our
+[Owners](https://github.com/backstage/backstage/blob/master/OWNERS.md) and
+[Governance](https://github.com/backstage/backstage/blob/master/GOVERNANCE.md).
+
### Does Spotify provide a managed version of Backstage?
No, this is not a service offering. We build the piece of software, and someone
@@ -215,17 +273,17 @@ data is shared with.
Yes. The core frontend framework could be used for building any large-scale web
application where (1) multiple teams are building separate parts of the app, and
(2) you want the overall experience to be consistent. That being said, in
-[Phase 2](https://github.com/spotify/backstage#project-roadmap) of the project
-we will add features that are needed for developer portals and systems for
-managing software ecosystems. Our ambition will be to keep Backstage modular.
+[Phase 2](overview/roadmap.md) of the project we will add features that are
+needed for developer portals and systems for managing software ecosystems. Our
+ambition will be to keep Backstage modular.
### How can I get involved?
Jump right in! Come help us fix some of the
-[early bugs and first issues](https://github.com/spotify/backstage/labels/good%20first%20issue)
-or reach [a new milestone](https://github.com/spotify/backstage/milestones). Or
-write an open source plugin for Backstage, like this
-[Lighthouse plugin](https://github.com/spotify/backstage/tree/master/plugins/lighthouse).
+[early bugs and good first issues](https://github.com/backstage/backstage/contribute)
+or reach [a new milestone](https://github.com/backstage/backstage/milestones).
+Or write an open source plugin for Backstage, like this
+[Lighthouse plugin](https://github.com/backstage/backstage/tree/master/plugins/lighthouse).
See all the ways you can
-[contribute here](https://github.com/spotify/backstage/blob/master/CONTRIBUTING.md).
+[contribute here](https://github.com/backstage/backstage/blob/master/CONTRIBUTING.md).
We'd love to have you as part of the community.
diff --git a/docs/api/utility-apis.md b/docs/api/utility-apis.md
index 1ebf2ae88b..ff322c136f 100644
--- a/docs/api/utility-apis.md
+++ b/docs/api/utility-apis.md
@@ -11,7 +11,7 @@ possible residing within the plugin itself and its backend APIs. There will
however always be a need for plugins to communicate outside of its boundaries,
both with other plugins and the app itself.
-Backstage provides two primary methods for plugins to communication across their
+Backstage provides two primary methods for plugins to communicate across their
boundaries in client-side code. The first one being the `createPlugin` API and
the registration hooks passed to the `register` method, and the second one being
Utility APIs. While the `createPlugin` API is focused on the initialization
@@ -22,7 +22,7 @@ during their entire life cycle.
Each Utility API is tied to an `ApiRef` instance, which is a global singleton
object without any additional state or functionality, its only purpose is to
-reference Utility APIs. `ApiRef`s are create using `createApiRef`, which is
+reference Utility APIs. `ApiRef`s are created using `createApiRef`, which is
exported by `@backstage/core`. There are many
[predefined Utility APIs](../reference/utility-apis/README.md) defined in
`@backstage/core`, and they're all exported with a name of the pattern
@@ -33,10 +33,10 @@ hook exported by `@backstage/core`, or the `withApis` HOC if you prefer class
components. For example, the `ErrorApi` can be accessed like this:
```tsx
-import React, { FC } from 'react';
+import React from 'react';
import { useApi, errorApiRef } from '@backstage/core';
-export const MyComponent: FC<{}> = () => {
+export const MyComponent = () => {
const errorApi = useApi(errorApiRef);
// Signal to the app that something went wrong, and display the error to the user.
@@ -160,7 +160,8 @@ const app = createApp({
```
A common pattern is to export a list of all APIs from `apis.ts`, next to
-`App.tsx`. See the [example app in this repo](../../packages/app/src/apis.ts)
+`App.tsx`. See the
+[example app in this repo](https://github.com/backstage/backstage/blob/master/packages/app/src/apis.ts)
for an example.
## Custom implementations of Utility APIs
@@ -194,8 +195,8 @@ interface for the API, and create an `ApiRef` using `createApiRef` exported from
`@backstage/core`. Also be sure to provide at least one implementation of the
API, and to declare a default factory for the API in `createPlugin`.
-Custom Utility APIs can be either public or private, which it is up to the
-plugin to choose. Private APIs do not expose an external API surface, and it's
+Custom Utility APIs can be either public or private, which is up to the plugin
+to choose. Private APIs do not expose an external API surface, and it's
therefore possible to make breaking changes to the API without affecting other
users of the plugin. If an API is made public however, it opens up for other
plugins to make use of the API, and it also makes it possible for users for your
@@ -242,7 +243,7 @@ The figure below shows the relationship between
The current method for connecting Utility API providers and consumers is via the
React tree using an `ApiProvider`, which is added to the `AppProvider` of the
`App`. In the future there may potentially be more ways to do this, in ways that
-are not tied to react. A design goal of the Utility APIs was to not have them
+are not tied to React. A design goal of the Utility APIs was to not have them
directly tied to React.
The indirection provided by Utility APIs also makes it straightforward to test
diff --git a/docs/architecture-decisions/adr002-default-catalog-file-format.md b/docs/architecture-decisions/adr002-default-catalog-file-format.md
index d831581d5b..699f7af8ed 100644
--- a/docs/architecture-decisions/adr002-default-catalog-file-format.md
+++ b/docs/architecture-decisions/adr002-default-catalog-file-format.md
@@ -39,7 +39,7 @@ inside Backstage, or by push events from a CI/CD pipelines, or by webhook
triggers from the version control system, etc.
Each file describes one or more entities in accordance with the
-[Backstage System Model](https://github.com/spotify/backstage/issues/390). All
+[Backstage System Model](https://github.com/backstage/backstage/issues/390). All
of these entities have a common structure and nomenclature, and they are stored
in the software catalog from which they then can be queried.
@@ -87,7 +87,7 @@ The root envelope object has the following structure.
### `apiVersion` and `kind`
The `kind` is the high level entity type being described, typically from the
-[Backstage system model](https://github.com/spotify/backstage/issues/390). The
+[Backstage system model](https://github.com/backstage/backstage/issues/390). The
first versions of the catalog will focus on the `Component` kind.
The `apiVersion`is the version of specification format for that particular
diff --git a/docs/architecture-decisions/adr005-catalog-core-entities.md b/docs/architecture-decisions/adr005-catalog-core-entities.md
index f91698c5ff..34d6449c6b 100644
--- a/docs/architecture-decisions/adr005-catalog-core-entities.md
+++ b/docs/architecture-decisions/adr005-catalog-core-entities.md
@@ -58,7 +58,7 @@ discover existing functionality in the ecosystem.
APIs are implemented by components and make their boundaries explicit. They
might be defined using an RPC IDL (e.g. in Protobuf, GraphQL or similar), a data
schema (e.g. in Avro, TFRecord or similar), or as code interfaces (e.g.
-framework APIs in Swift, Kotlin, Java, C++, Typescript etc). In any case, APIs
+framework APIs in Swift, Kotlin, Java, C++, TypeScript etc). In any case, APIs
exposed by components need to be in a known machine-readable format so we can
build further tooling and analysis on top.
diff --git a/docs/architecture-decisions/adr006-avoid-react-fc.md b/docs/architecture-decisions/adr006-avoid-react-fc.md
index 96f594daf7..51dcf042da 100644
--- a/docs/architecture-decisions/adr006-avoid-react-fc.md
+++ b/docs/architecture-decisions/adr006-avoid-react-fc.md
@@ -6,7 +6,7 @@ description: Architecture Decision Record (ADR) log on Avoid React.FC and React.
## Context
-Facebook has removed `React.FC` from their base template for a Typescript
+Facebook has removed `React.FC` from their base template for a TypeScript
project. The reason for this was that it was found to be an unnecessary feature
with next to no benefits in combination with a few downsides.
diff --git a/docs/architecture-decisions/adr007-use-msw-to-mock-service-requests.md b/docs/architecture-decisions/adr007-use-msw-to-mock-service-requests.md
index 045588f505..68394de17c 100644
--- a/docs/architecture-decisions/adr007-use-msw-to-mock-service-requests.md
+++ b/docs/architecture-decisions/adr007-use-msw-to-mock-service-requests.md
@@ -41,7 +41,7 @@ worker.start();
```
and in a more real life scenario, taken from
-[CatalogClient.test.ts](https://github.com/spotify/backstage/blob/f3245c4f8f0b6b2625c4a6d5d50161b612fb4757/plugins/catalog/src/api/CatalogClient.test.ts)
+[CatalogClient.test.ts](https://github.com/backstage/backstage/blob/f3245c4f8f0b6b2625c4a6d5d50161b612fb4757/plugins/catalog/src/api/CatalogClient.test.ts)
```ts
beforeEach(() => {
diff --git a/docs/architecture-decisions/adr008-default-catalog-file-name.md b/docs/architecture-decisions/adr008-default-catalog-file-name.md
index d4716318bc..6794dc87cc 100644
--- a/docs/architecture-decisions/adr008-default-catalog-file-name.md
+++ b/docs/architecture-decisions/adr008-default-catalog-file-name.md
@@ -11,7 +11,7 @@ While the spec for the catalog file format is well described in
to the name of the catalog file.
Following discussion in
-[Issue 1822](https://github.com/spotify/backstage/pull/1822#pullrequestreview-461253670),
+[Issue 1822](https://github.com/backstage/backstage/pull/1822#pullrequestreview-461253670),
a decision was made.
## Name
diff --git a/docs/architecture-decisions/adr009-entity-references.md b/docs/architecture-decisions/adr009-entity-references.md
index 8b7984ea49..a6fe3ee583 100644
--- a/docs/architecture-decisions/adr009-entity-references.md
+++ b/docs/architecture-decisions/adr009-entity-references.md
@@ -13,7 +13,7 @@ There was also some confusion on how to reference entities in URLs in the
Backstage frontend.
Following discussion in
-[Issue 1947](https://github.com/spotify/backstage/issues/1947), a decision was
+[Issue 1947](https://github.com/backstage/backstage/issues/1947), a decision was
made.
## Entity References in YAML files
diff --git a/docs/architecture-decisions/index.md b/docs/architecture-decisions/index.md
index ddf2805e75..3211f37550 100644
--- a/docs/architecture-decisions/index.md
+++ b/docs/architecture-decisions/index.md
@@ -25,9 +25,9 @@ Records should be stored under the `architecture-decisions` directory.
- Address and integrate feedback from the community
- Eventually, assign a number
- Add the path of the ADR to the microsite sidebar in
- [`sidebars.json`](https://github.com/spotify/backstage/blob/master/microsite/sidebars.json)
+ [`sidebars.json`](https://github.com/backstage/backstage/blob/master/microsite/sidebars.json)
- Add the path of the ADR to the
- [`mkdocs.yml`](https://github.com/spotify/backstage/blob/master/mkdocs.yml)
+ [`mkdocs.yml`](https://github.com/backstage/backstage/blob/master/mkdocs.yml)
- Merge the pull request
## Superseding an ADR
diff --git a/docs/assets/software-catalog/bsc-register-2.png b/docs/assets/software-catalog/bsc-register-2.png
index de71141ba0..c3460f98db 100644
Binary files a/docs/assets/software-catalog/bsc-register-2.png and b/docs/assets/software-catalog/bsc-register-2.png differ
diff --git a/docs/assets/techdocs/architecture-basic.drawio.svg b/docs/assets/techdocs/architecture-basic.drawio.svg
new file mode 100644
index 0000000000..8e3be76f8b
--- /dev/null
+++ b/docs/assets/techdocs/architecture-basic.drawio.svg
@@ -0,0 +1,462 @@
+
diff --git a/docs/assets/techdocs/architecture-recommended.drawio.svg b/docs/assets/techdocs/architecture-recommended.drawio.svg
new file mode 100644
index 0000000000..e3af4b6b5f
--- /dev/null
+++ b/docs/assets/techdocs/architecture-recommended.drawio.svg
@@ -0,0 +1,391 @@
+
diff --git a/docs/assets/techdocs/techdocs_big_picture.png b/docs/assets/techdocs/techdocs_big_picture.png
deleted file mode 100644
index 8b8f7a2338..0000000000
Binary files a/docs/assets/techdocs/techdocs_big_picture.png and /dev/null differ
diff --git a/docs/auth/auth-backend-classes.md b/docs/auth/auth-backend-classes.md
index 442553d4b8..424869196d 100644
--- a/docs/auth/auth-backend-classes.md
+++ b/docs/auth/auth-backend-classes.md
@@ -6,57 +6,84 @@ description: Documentation on Auth backend classes
## How Does Authentication Work?
-The Backstage application can use various authentication providers for
-authentication. A provider has to implement an `AuthProviderRouteHandlers`
-interface for handling authentication. This interface consists of four methods.
-Each of these methods is hosted at an endpoint `/auth/[provider]/method`, where
-`method` performs a certain operation as follows:
+The Backstage application can use various external authentication providers for
+authentication. An external provider is wrapped using an
+`AuthProviderRouteHandlers` interface for handling authentication. This
+interface consists of four methods. Each of these methods is hosted at an
+endpoint (by default) `/api/auth/[provider]/method`, where `method` performs a
+certain operation as follows:
```
- /auth/[provider]/start -> start
- /auth/[provider]/handler/frame -> frameHandler
- /auth/[provider]/refresh -> refresh
- /auth/[provider]/logout -> logout
+ /auth/[provider]/start -> Initiate a login from the web page
+ /auth/[provider]/handler/frame -> Handle a finished authentication operation
+ /auth/[provider]/refresh -> Refresh the validity of a login
+ /auth/[provider]/logout -> Log out a logged-in user
```
-For more information on how these methods are used and for which purpose, refer
-to the [OAuth documentation](oauth.md).
+The flow is as follows:
-For details on the parameters, input and output conditions for each method,
-refer to the type documentation under
-`plugins/auth-backend/src/providers/types.ts`.
+1. A user attempts to sign in.
+2. A popup window is opened, pointing to the `auth` endpoint. That endpoint does
+ initial preparations and then re-directs the user to an external
+ authenticator, still inside the popup.
+3. The authenticator validates the user and returns the result of the validation
+ (success OR failure), to the wrapper's endpoint (`handler/frame`).
+4. The `handler/frame` rendered b´webpage will issue the appropriate response to
+ the webpage that opened the popup window, and the popup is closed.
+5. The user signs out by clicking on a UI interface and the webpage makes a
+ request to logout the user.
There are currently two different classes for two authentication mechanisms that
implement this interface: an `OAuthAdapter` for [OAuth](https://oauth.net/2/)
based mechanisms and a `SAMLAuthProvider` for
-[SAML](http://docs.oasis-open.org/security/saml/Post2.0/sstc-saml-tech-overview-2.0.html)
-based mechanisms.
+[SAML](http://docs.oasis-open.org/security/saml/Post2.0/sstc-saml-tech-overview-2.0.html).
-### OAuth mechanisms
+If you do not have an `OAuth2` or `SAML` based authentication provider, look in
+the section [below](#implementing-your-own-auth-wrapper).
+
+### OAuth Mechanisms
+
+For more information on how these methods are used and for which purpose, refer
+to the [OAuth documentation](oauth.md).
Currently OAuth is assumed to be the de facto authentication mechanism for
Backstage based applications.
Backstage comes with a "batteries-included" set of supported commonly used OAuth
-providers: Okta, GitHub, Google, GitLab, and a generic OAuth2 provider.
+providers: Okta, GitHub, Google, GitLab, and a generic OAuth2 provider. For a
+list of available providers, look at the available wrappers in
+`backstage/plugins/auth-backend/src/providers/`.
-All of these use the authorization flow of OAuth2 to implement authentication.
+All of these use the **authorization flow** of OAuth2 to implement
+authentication.
-If your authentication provider is any of the above mentioned (except generic
-OAuth2) providers, you can configure them by setting the right variables in
-`app-config.yaml` under the `auth` section.
+If your authentication provider is any of the above mentioned providers, you can
+configure them by setting the right variables in `app-config.yaml` under the
+`auth` section.
+
+### SAML
+
+The SAML Provider is currently under development. Additional validation and
+profile handling is still required before use in production.
+
+To configure the SAML Auth provider, look at the configuration parameters
+supported by
+[Passport-SAML](https://github.com/node-saml/passport-saml#config-parameter-details)
+under the `auth.providers.saml` key
+
+For security reasons, validate that the response from the IdP is indeed signed
+by also providing the `cert` configuration.
### Configuration
Each authentication provider (except SAML) needs five parameters: an OAuth
-client ID, a client secret, an authorization endpoint and a token endpoint, and
-an app origin. The app origin is the URL at which the frontend of the
-application is hosted, and it is read from the `app.baseUrl` config. This is
-required because the application opens a popup window to perform the
-authentication, and once the flow is completed, the popup window sends a
-`postMessage` to the frontend application to indicate the result of the
-operation. Also this URL is used to verify that authentication requests are
-coming from only this endpoint.
+client ID, a client secret, an authorization endpoint, a token endpoint, and an
+app origin. The app origin is the URL at which the frontend of the application
+is hosted, and it is read from the `app.baseUrl` config. This is required
+because the application opens a popup window to perform the authentication, and
+once the flow is completed, the popup window sends a `postMessage` to the
+frontend application to indicate the result of the operation. Also this URL is
+used to verify that authentication requests are coming from only this endpoint.
These values are configured via the `app-config.yaml` present in the root of
your app folder.
@@ -82,23 +109,68 @@ auth:
development:
clientId:
$env:
+ saml:
+ entryPoint:
+ $env: AUTH_SAML_ENTRY_POINT
+ issuer:
+ $env: AUTH_SAML_ISSUER
...
```
-## Technical Notes
+## Implementing Your Own Auth Wrapper
-### OAuthEnvironmentHandler
+The core interface of any auth wrapper is the `AuthProviderRouteHandlers`
+interface. This interface has four methods corresponding to the API described in
+the initial section. Any auth wrapper will have to implement this interface.
-The concept of an "env" is core to the way the auth backend works. It uses an
+When initiating a login, a pop-up window is created by the frontend, to allow
+the user to initiate a login. This login request is done to the `/start`
+endpoint which is handled by the `start` method.
+
+The `start` method re-directs to the external auth provider who authenticates
+the request and re-directs the request to the `/frame/handler` endpoint, which
+is handled by the `frameHandler` method.
+
+The `frameHandler` returns an HTML response, containing a script that does a
+`postMessage` to the frontend's window, containing the result of the request.
+The `WebMessageResponse` type is the message sent by the `postMessage` to the
+frontend.
+
+A `postMessageResponse` utility function wraps the logic of generating a
+`postMessage` response that ensures that CORS is successfully handled. This
+function takes an `express.Response`, a `WebMessageResponse` and the URL of the
+frontend (`appOrigin`) as parameters and return an HTML page with the script and
+the message.
+
+### OAuth Wrapping Interfaces.
+
+Each OAuth external provider is supported by a corresponding
+[Passport](https://github.com/jaredhanson/passport) strategy. For a generic
+OAuth2 provider, passport has a `passport-oauth2` strategy. The strategy class
+handles the implementation details of working with each provider.
+
+Each strategy is wrapped by an `OAuthHandlers` interface.
+
+This interface cannot be directly used as an Express HTTP request handler. To do
+so, `OAuthHandlers` are wrapped in an `OAuthAdapter`, which implements the
+`AuthProviderRouterHandlers` interface.
+
+#### Env
+
+The concept of an `env` is core to the way the auth backend works. It uses an
`env` query parameter to identify the environment in which the application is
-running (`development`, `staging`, `production`, etc). Each runtime can support
-multiple environments at the same time and the right handler for each request is
-identified and dispatched to based on the `env` parameter. All
-`AuthProviderRouteHandlers` are wrapped within an `OAuthEnvironmentHandler`.
+running (`development`, `staging`, `production`, etc). Each runtime can
+simultaneously support multiple environments at the same time and the right
+handler for each request is identified and dispatched to, based on the `env`
+parameter.
-To instantiate multiple OAuth providers for different environments, use
+`OAuthEnvironmentHandler` is a utility wrapper for an `OAuthHandlers` that
+implements the `AuthProviderRouteHandlers` interface while supporting multiple
+`env`s.
+
+To instantiate OAuth providers (the same but for different environments), use
`OAuthEnvironmentHandler.mapConfig`. It's a helper to iterate over a
-configuration object that is a map of environment to configurations. See one of
+configuration object that is a map of environments to configurations. See one of
the existing OAuth providers for an example of how it is used.
Given the following configuration:
@@ -113,13 +185,18 @@ production:
```
The `OAuthEnvironmentHandler.mapConfig(config, envConfig => ...)` call will
-split the `config` by the top level `development` and `production` keys, and
-pass on each block as `envConfig`.
+split the config by the top level `development` and `production` keys, and pass
+on each block as `envConfig`.
-For a list of currently available providers, look in the `factories` module
-located in `plugins/auth-backend/src/providers/factories.ts`
+For convenience, the `AuthProviderFactory` is a factory function that has to be
+implemented which can then generate a `AuthProviderRouteHandlers` for a given
+provider.
-### OAuth2 provider
+All of the supported providers provide an `AuthProviderFactory` that returns an
+`OAuthEnvironmentHandler`, capable of handling authentication for multiple
+environments.
+
+### OAuth2 Provider
The `oauth2` provider abstracts a generic **OAuth2 + OIDC** based authentication
provider. What this means is that after the application has been given
diff --git a/docs/auth/index.md b/docs/auth/index.md
index d7fb5d8c59..cf468c7bb7 100644
--- a/docs/auth/index.md
+++ b/docs/auth/index.md
@@ -58,7 +58,7 @@ token used to make authenticated calls within Backstage.
The middleware that will be provided by `@backstage/backend-common` allows
verification of Backstage ID tokens, and optionally loading additional
information about the user. The progress is tracked in
-https://github.com/spotify/backstage/issues/1435.
+https://github.com/backstage/backstage/issues/1435.
#### Identity for App Developers
@@ -93,6 +93,6 @@ sign-in methods.
More details are provided in dedicated sections of the documentation.
- [OAuth](./oauth.md): Description of the generic OAuth flow implemented by the
- [auth-backend](../../plugins/auth-backend).
+ [auth-backend](https://github.com/backstage/backstage/tree/master/plugins/auth-backend).
- [Glossary](./glossary.md): Glossary of some common terms related to the auth
flows.
diff --git a/docs/auth/oauth.md b/docs/auth/oauth.md
index 178b99b153..0655175b58 100644
--- a/docs/auth/oauth.md
+++ b/docs/auth/oauth.md
@@ -15,10 +15,10 @@ to various third party APIs.
There are occasions when the user wants to perform actions towards third party
services that require authorization via OAuth. Backstage provides standardized
[Utility APIs](../api/utility-apis.md) such as the
-[GoogleAuthApi](https://github.com/spotify/backstage/blob/master/packages/core-api/src/apis/definitions/auth.ts)
+[GoogleAuthApi](https://github.com/backstage/backstage/blob/master/packages/core-api/src/apis/definitions/auth.ts)
for that use-case. Backstage also includes a set of implementations of these
APIs that integrate with the
-[auth-backend](https://github.com/spotify/backstage/tree/master/plugins/auth-backend)
+[auth-backend](https://github.com/backstage/backstage/tree/master/plugins/auth-backend)
plugin to provide a popup-based OAuth flow.
## Background
@@ -58,9 +58,9 @@ easier to make authenticated requests inside a plugin.
## OAuth Flow
The following describes the OAuth flow implemented by the
-[auth-backend](https://github.com/spotify/backstage/tree/master/plugins/auth-backend)
+[auth-backend](https://github.com/backstage/backstage/tree/master/plugins/auth-backend)
and
-[DefaultAuthConnector](https://github.com/spotify/backstage/blob/master/packages/core-api/src/lib/AuthConnector/DefaultAuthConnector.ts)
+[DefaultAuthConnector](https://github.com/backstage/backstage/blob/master/packages/core-api/src/lib/AuthConnector/DefaultAuthConnector.ts)
in `@backstage/core-api`.
Component and APIs can request Access or ID Tokens from any available Auth
diff --git a/docs/cli/commands.md b/docs/cli/commands.md
new file mode 100644
index 0000000000..726f2a922c
--- /dev/null
+++ b/docs/cli/commands.md
@@ -0,0 +1,606 @@
+---
+id: commands
+title: Commands
+description: Descriptions of all commands available in the CLI.
+---
+
+This page lists all commands provided by the Backstage CLI, what they're for,
+and where to use them.
+
+The documentation for each command begins with specifying its scope, this
+indicates where the command should be used by selecting from the following list:
+
+- `app` - A frontend app package, such as `packages/app`.
+- `backend` - A backend package, such as `packages/backend`.
+- `frontend-plugin` - A frontend plugin package.
+- `backend-plugin` - A backend plugin package.
+- `root` - The monorepo root.
+- `any` - Any kind of package, but not the repo root.
+
+## help
+
+This command displays a help summary or detailed help screens for each command.
+Below is a cleaned up output of `yarn backstage-cli --help`.
+
+```text
+app:build Build an app for a production release
+app:diff Diff an existing app with the creation template
+app:serve Serve an app for local development
+
+backend:build Build a backend plugin
+backend:bundle Bundle the backend into a deployment archive
+backend:build-image Bundles the package into a docker image
+backend:dev Start local development server with HMR for the backend
+
+plugin:build Build a plugin
+plugin:diff Diff an existing plugin with the creation template
+plugin:serve Serves the dev/ folder of a plugin
+
+build Build a package for publishing
+build-workspace Builds a temporary dist workspace from the provided packages
+lint Lint a package
+test Run tests, forwarding args to Jest, defaulting to watch mode
+clean Delete cache directories
+
+create-plugin Creates a new plugin in the current repository
+remove-plugin Removes plugin in the current repository
+
+config:print Print the app configuration for the current package
+config:check Validate that the given configuration loads and matches schema
+
+versions:bump Bump Backstage packages to the latest versions
+versions:check Check Backstage package versioning
+
+prepack Prepares a package for packaging before publishing
+postpack Restores the changes made by the prepack command
+
+help [command] display help for command
+```
+
+## app:build
+
+Scope: `app`
+
+Builds a bundle of static content from the app, which can then be served via any
+static web server such as `nginx`, or via the
+[`app-backend`](https://www.npmjs.com/package/@backstage/plugin-app-backend)
+plugin directly from a Backstage backend instance.
+
+The command also reads and injects static configuration into the bundle. It is
+important to note that when deploying using your own static content hosting
+solution, this will be the final configuration used in the frontend unless you
+for example hook in configuration loading from the backend. When using the
+`nginx` based Dockerfile in this repo along with its included run script,
+`APP_CONFIG_` environment variables will be injected into the frontend, and when
+serving using the `app-backend` plugin, the configuration is completely injected
+from the backend and the configuration at the time of calling this command will
+not be used.
+
+Note that even when injecting configuration at runtime, it is not possible to
+change the base path of the app. For example, if you at build time have
+`app.baseUrl` set to `http://dev-app.com/my-app`, you can change that to
+`https://prod-app.com/my-app`, but not to `https://prod-app.com`, as that would
+change the path.
+
+During the build, the following variables are set:
+
+```java
+process.env.NODE_ENV = 'production';
+process.env.BUILD_INFO = {
+ cliVersion: '0.4.0', // The version of the CLI package
+ gitVersion: 'v0.4.0-86-ge54815618', // output of `git describe --always`
+ packageVersion: '1.0.5', // The version of the app package itself
+ timestamp: 1678900000000, // Date.now() when the build started
+ commit: 'e548156182a973ed4b459e18533afc22c85ffff8', // output of `git rev-parse HEAD`
+};
+```
+
+Some CI environments do not properly report correct resource limits, potentially
+leading to errors such as `ENOMEM` during compilation. If you run into this
+issue you can limit the parallelization of the build process by setting the
+environment variable `BACKSTAGE_CLI_BUILD_PARALLEL`, which is forwarded to the
+[`terser-webpack-plugin`](https://github.com/webpack-contrib/terser-webpack-plugin#parallel).
+You can set it to `false` or `1` to completely disable parallelization, but
+usually a low value such as `2` is enough.
+
+```text
+Usage: backstage-cli app:build
+
+Options:
+ --stats Write bundle stats to output directory
+ --config <path> Config files to load instead of app-config.yaml (default: [])
+ -h, --help display help for command
+```
+
+## app:diff
+
+Scope: `app`
+
+Diff an existing app with the template used in `@backstage/create-app`. This
+will verify that your app package has not diverged from the template, and can be
+useful to run after updating the version of `@backstage/cli` in your app.
+
+This command is experimental and may be removed in the future.
+
+```text
+Usage: backstage-cli app:diff
+
+Options:
+ --check Fail if changes are required
+ --yes Apply all changes
+ -h, --help display help for command
+```
+
+## app:serve
+
+Scope: `app`
+
+Serve an app for local development. This starts up a local development server,
+using a bundling configuration that is quite similar to that of the `app:build`
+command, but with development features such as React Hot Module Replacement,
+faster sourcemaps, no minification, etc.
+
+The static configuration is injected into the frontend, but it does not support
+watching, meaning that changes in for example `app-config.yaml` are not
+reflected until the serve process is restarted.
+
+During the build, the following variables are set:
+
+```java
+process.env.NODE_ENV = 'development';
+process.env.BUILD_INFO = { /* See app:build */ };
+```
+
+The server listening configuration is controlled through the static
+configuration. The `app.baseUrl` determines the listening host and port, as well
+as whether HTTPS is used or not. It is also possible to override the listening
+host and port if needed by setting `app.listen.host` and `app.listen.port`.
+
+```text
+Usage: backstage-cli app:serve [options]
+
+Options:
+ --check Enable type checking and linting
+ --config <path> Config files to load instead of app-config.yaml (default: [])
+ -h, --help display help for command
+```
+
+## backend:build
+
+Scope: `backend-plugin`
+
+This builds a backend package for publishing and use in production. The build
+output is written to `dist/`. Be sure to list any additional file that the
+package depends on at runtime in the `"files"` field inside `package.json`, a
+common example being the `migrations` directory.
+
+```text
+Usage: backstage-cli backend:build [options]
+
+Options:
+ -h, --help display help for command
+```
+
+## backend:bundle
+
+Scope: `backend`
+
+Bundle the backend and all of its local dependencies into a deployment archive.
+The archive is written to `dist/bundle.tar.gz`, and contains the packaged
+version of all dependencies of the target package, along with the target package
+itself. The layout of the packages in the archive is the same as the directory
+layout in the target monorepo, and the bundle also contains the root
+`package.json` and `yarn.lock`.
+
+To use the bundle, extract it into a target directory, run
+`yarn install --production`, and then start the target backend package using for
+example `node package/backend`.
+
+The `dist/bundle.tar.gz` is accompanied by a `dist/skeleton.tar.gz`, which has
+the same layout, but only contains `package.json` files and `yarn.lock`. This
+can be used to run a `yarn install` in environments that will benefit from the
+caching that this enables, such as Docker image builds. To use the skeleton
+archive, simply extract it first, run install, and then extract the main bundle.
+
+The following is an example of a `Dockerfile` that can be used to package the
+output of `backstage-cli backend:bundle` into an image:
+
+```Dockerfile
+FROM node:14-buster
+WORKDIR /app
+
+ADD yarn.lock package.json packages/backend/dist/skeleton.tar.gz ./
+RUN yarn install --production --network-timeout 600000 && rm -rf "$(yarn cache dir)"
+
+ADD packages/backend/dist/bundle.tar.gz app-config.yaml ./
+
+CMD node packages/backend
+```
+
+```text
+Usage: backstage-cli backend:bundle [options]
+
+Bundle the backend into a deployment archive
+
+Options:
+ --build-dependencies Build all local package dependencies before bundling the backend
+ -h, --help display help for command
+```
+
+## backend:build-image
+
+Scope: `backend`
+
+Builds a Docker image of the backend package, forwarding all unknown options to
+`docker image build`. For example:
+
+```bash
+yarn backstage-cli backend:build-image --build --tag my-backend-image
+```
+
+The image is built using the backend package along with all of its local package
+dependencies. It expects to find a `Dockerfile` at the root of the backend
+package, which will be used during the build.
+
+The Dockerfile is **NOT** executed within the package or repo itself. Because
+the packages in the repo itself are configured for development instead of
+production use, the final Docker build happens in a separate temporary
+directory, to which the backend package and dependencies have been copied. Only
+files listed within the `"files"` field within each package's `package.json` are
+copied over, along with the root `package.json`, `yarn.lock`, and any
+`app-config.*.yaml` files.
+
+During the build a `skeleton.tar` file is created and put at the repo root. This
+file contains the `package.json` of each included package, which together with
+the root `package.json` and `yarn.lock` can be used to run a cached
+`yarn install` before the full production builds of all the packages are copied
+over, providing a significant speedup if Docker build layer caching available.
+
+This command is experimental and we hope to be able to replace it with one that
+is less integrated directly with Docker, and also supports multi-stage Docker
+builds. It is possible to replicate most of what this command does by manually
+building each package, and then use the `build-workspace` to create the
+temporary workspace, and finally copy over any additional files to the workspace
+and execute the Docker build within it.
+
+```text
+Usage: backstage-cli backend:build-image [options]
+
+Options:
+ --build Build packages before packing them into the image
+ --backstage-cli-help display help for command
+```
+
+## backend:dev
+
+Scope: `backend`, `backend-plugin`
+
+Starts a backend package in development mode, with watch mode enabled for all
+local dependencies.
+
+```text
+Usage: backstage-cli backend:dev [options]
+
+Options:
+ --check Enable type checking and linting
+ --inspect Enable debugger
+ --config <path> Config files to load instead of app-config.yaml (default: [])
+ -h, --help display help for command
+```
+
+## create-plugin
+
+Scope: `root`
+
+Creates a new plugin within the repository. This command is typically wrapped up
+in the root `package.json` to be executed with `yarn create-plugin`, using
+options that are appropriate for the organization that owns the app repo. A
+recommended scope for internal packages is `@internal`.
+
+```text
+Usage: backstage-cli create-plugin [options]
+
+Options:
+ --backend Create plugin with the backend dependencies as default
+ --scope <scope> npm scope
+ --npm-registry <URL> npm registry URL
+ --no-private Public npm package
+ -h, --help display help for command
+```
+
+## remove-plugin
+
+Scope: `root`
+
+A utility to remove a plugin from a repo, essentially undoing everything that
+was done by `create-plugin`.
+
+This is primarily intended as a utility for manual tests and end to end testing
+scripts.
+
+```text
+Usage: backstage-cli remove-plugin [options]
+
+Options:
+ -h, --help display help for command
+```
+
+## plugin:build
+
+Scope: `frontend-plugin`
+
+Build a frontend plugin for publishing to a package registry. There is no need
+to run this command during development or even in CI unless the package is being
+published. The `app:bundle` command does not use the output for this command
+when bundling local package dependencies.
+
+The output is written to a `dist/` folder. It also outputs type declarations for
+the plugin, and therefore requires `yarn tsc` to have been run first. The input
+type declarations are expected to be found within `dist-types/` at the root of
+the monorepo.
+
+```text
+Usage: backstage-cli plugin:build [options]
+
+Options:
+ -h, --help display help for command
+```
+
+## plugin:serve
+
+Scope: `frontend-plugin`
+
+Serves a frontend plugin by itself for isolated development. The serve task
+itself is essentially identical to `app:serve`, but the entrypoint is instead
+set to the `dev/` folder within the plugin.
+
+The `dev/` folder typically contains a small wrapper script that hooks up any
+necessary mock APIs or other things that are needed for the plugin to function.
+The `@backstage/dev-utils` package provides utilities to that end.
+
+```text
+Usage: backstage-cli plugin:serve [options]
+
+Options:
+ --check Enable type checking and linting
+ --config <path> Config files to load instead of app-config.yaml (default: [])
+ -h, --help display help for command
+```
+
+## plugin:diff
+
+Scope: `frontend-plugin`
+
+Compares a frontend plugin to the `create-plugin` template, making sure that it
+hasn't diverged from the template and recommending updates when it has. A good
+practice is to run this command after updating the version of the CLI in a
+project.
+
+```text
+Usage: backstage-cli plugin:diff [options]
+
+Options:
+ --check Fail if changes are required
+ --yes Apply all changes
+ -h, --help display help for command
+```
+
+## build
+
+Scope: `any`
+
+Build a single package for publishing, just like the `plugin:build` and
+`backend:build` commands. This command is intended for standalone packages that
+aren't plugins, and for example support building of isomorphic packages for
+usage in both the frontend and backend.
+
+For frontend packages you'll want to include `esm` output, and for backend
+packages `cjs`. Whether to include `types` depends on if you need type
+declarations for the package, and also requires `yarn tsc` to have been run
+first.
+
+```text
+Usage: backstage-cli build [options]
+
+Options:
+ --outputs <formats> List of formats to output [types,cjs,esm]
+ -h, --help display help for command
+```
+
+## lint
+
+Scope: `any`
+
+Lint a package. In addition to the default `eslint` behavior, this command will
+include TypeScript files, treat warnings as errors, and default to linting the
+entire directory if no specific files are listed.
+
+```text
+Usage: backstage-cli lint [options]
+
+Options:
+ --format <format> Lint report output format (default: "eslint-formatter-friendly")
+ --fix Attempt to automatically fix violations
+ -h, --help display help for command
+```
+
+## test
+
+Scope: `any`
+
+Run tests, forwarding all unknown options to Jest, and defaulting to watch mode.
+When executing the tests, `process.env.NODE_ENV` will be set to `"test"`.
+
+This command uses a default Jest configuration that is included in the CLI,
+which is set up with similar goals for speed, scale, and working within a
+monorepo. The configuration sets the `src` as the root directory, enforces the
+`.test.` infix for tests, and uses `src/setupTests.ts` as the test setup
+location.
+
+If needed, the configuration can be extended using a `"jest"` field in
+`package.json`, both within the target package and the monorepo root, with
+configuration in the target package taking precedence. Refer to the
+[Jest configuration documentation](https://jestjs.io/docs/en/configuration) for
+a full list of configuration options.
+
+In addition to the Jest configuration there's an optional `transformModules`
+option, which is an array of module names to include in transformations.
+Normally modules inside `node_modules` are not transformed, but there are cases
+were published packages are not transpiled far enough to be usable by Jest, in
+which case you need to enable transform of them.
+
+Another way to override the Jest configuration is to place a `jest.config.js` or
+`jest.config.ts` file in the package root. As opposed to the `package.json` way
+of overriding config, this completely removes the base config, and so you need
+to set it up from scratch.
+
+```text
+Usage: backstage-cli test [options]
+
+Options:
+ --backstage-cli-help display help for command
+```
+
+## config:print
+
+Scope: `root`
+
+Print the static configuration, defaulting to reading `app-config.yaml` in the
+repo root, using schema collected from all local packages in the repo.
+
+For example, to validate that a given configuration value is visible in the
+frontend when building the `my-app` package, you can use the following:
+
+```bash
+yarn backstage-cli config:print --frontend --package my-app
+```
+
+```text
+Usage: backstage-cli config:print [options]
+
+Options:
+ --package <name> Only load config schema that applies to the given package
+ --frontend Print only the frontend configuration
+ --with-secrets Include secrets in the printed configuration
+ --format <format> Format to print the configuration in, either json or yaml [yaml]
+ --config <path> Config files to load instead of app-config.yaml (default: [])
+ -h, --help display help for command
+```
+
+## config:check
+
+Scope: `root`
+
+Validate that static configuration loads and matches schema, defaulting to
+reading `app-config.yaml` in the repo root and using schema collected from all
+local packages in the repo.
+
+```text
+Usage: backstage-cli config:check [options]
+
+Options:
+ --package <name> Only load config schema that applies to the given package
+ --config <path> Config files to load instead of app-config.yaml (default: [])
+ -h, --help display help for command
+```
+
+## versions:bump
+
+Scope: `root`
+
+Bump all `@backstage` packages to the latest versions. This checks for updates
+in the package registry, and will update entries both in `yarn.lock` and
+`package.json` files when necessary.
+
+```text
+Usage: backstage-cli versions:bump [options]
+
+Options:
+ -h, --help display help for command
+```
+
+## versions:check
+
+Scope: `root`
+
+Validate `@backstage` dependencies within the repo, making sure that there are
+no duplicates of packages that might lead to breakages. For example,
+`@backstage/core` must not be loaded in twice, so having two different versions
+of it installed will cause this command to exit with an error.
+
+By supplying the `--fix` flag the command will attempt to fix any conflict that
+can be resolved by editing `yarn.lock`, but will not attempt to search for
+remote updates or modify any `package.json` files.
+
+```text
+Usage: backstage-cli versions:check [options]
+
+Options:
+ --fix Fix any auto-fixable versioning problems
+ -h, --help display help for command
+```
+
+## prepack
+
+Scope: `any`
+
+This command should be added as `scripts.prepack` in all packages. It enables
+packaging- and publish-time overrides for fields inside `packages.json`.
+
+The checked in version of all packages in a Backstage monorepo are tailored for
+local development, and as such `main` and similar fields inside `package.json`
+point to development source, i.e. `src/index.ts`. Using this when publishing
+would lead to a broken package, since `src/` is not included in the published
+package and we instead need to point to files in the `dist/` directory. This
+command allows for those fields to be rewritten when needed, and does so by
+copying all fields within `publishConfig` to the top-level of each
+`package.json`, skipping `access`, `registry`, and `tag`.
+
+The need for this command may be removed in the future, as this exact method of
+overriding fields for publishing is already supported by some package managers.
+
+```text
+Usage: backstage-cli prepack [options]
+
+Options:
+ -h, --help display help for command
+```
+
+## postpack
+
+Scope: `any`
+
+This should be added as `scripts.postpack` in all packages. It restores
+`package.json` to what it looked like before calling the `prepack` command.
+
+```text
+Usage: backstage-cli postpack [options]
+
+Options:
+ -h, --help display help for command
+```
+
+## clean
+
+Scope: `any`
+
+Remove cache and output directories.
+
+```text
+Usage: backstage-cli clean [options]
+
+Options:
+ -h, --help display help for command
+```
+
+## build-workspace
+
+Scope: `any`, `root`
+
+Builds a mirror of the workspace using the packaged production version of each
+package. This essentially calls `yarn pack` in each included package and unpacks
+the resulting archive in the target `workspace-dir`.
+
+```text
+Usage: backstage-cli build-workspace [options] <workspace-dir>
+```
diff --git a/docs/cli/index.md b/docs/cli/index.md
new file mode 100644
index 0000000000..1b2e01be62
--- /dev/null
+++ b/docs/cli/index.md
@@ -0,0 +1,108 @@
+---
+id: index
+title: Overview
+description: Overview of the Backstage CLI
+---
+
+## Summary
+
+Backstage provides an opinionated set of tooling for both frontend and backend
+development. It is delivered through the
+[`@backstage/cli`](https://www.npmjs.com/package/@backstage/cli) package and
+executed either directly through `yarn backstage-cli ` or within
+`package.json` scripts. When creating an app using
+[`@backstage/create-app`](https://www.npmjs.com/package/@backstage/create-app)
+it contains package scripts for executing the most common commands.
+
+Under the hood the CLI uses [Webpack](https://webpack.js.org/) for bundling,
+[Rollup](https://rollupjs.org/) for building packages,
+[Jest](https://jestjs.io/) for testing, and [eslint](https://eslint.org/) for
+linting. It also includes custom tooling for working within Backstage apps, for
+example for keeping the app up to date and verifying static configuration.
+
+For a full list of CLI commands, see the [commands](./commands.md) page.
+
+## Introduction
+
+A goal of Backstage is to provide a delightful developer experience in and
+around the project. Creating new apps and plugins should be simple, iteration
+speed should be fast, and the overhead of maintaining custom tooling should be
+minimal. As a part of accomplishing this goal, Backstage provides its own set of
+opinionated tooling, delivered primarily through the
+[`@backstage/cli`](https://www.npmjs.com/package/@backstage/cli) package.
+
+The `@backstage/cli` package provides a single executable script,
+`backstage-cli`, which you can run directly with `yarn` or within a script in
+`package.json`. If you have a Backstage app set up, you can try out the
+following command to print the top-level help page of the CLI:
+
+```text
+yarn backstage-cli --help
+```
+
+If you are familiar with [`create-react-app`](https://create-react-app.dev/) you
+may recognize the pattern of bundling tooling up as a CLI, as it uses a package
+called [`react-scripts`](https://www.npmjs.com/package/react-scripts) to bring
+most of the functionality into the created project. The Backstage equivalent of
+`create-react-app` is
+[`@backstage/create-app`](https://www.npmjs.com/package/@backstage/create-app),
+and the equivalent of `react-scripts` is `@backstage/cli`. There are however a
+couple of key differences between the two. Most notably, Backstage apps are
+monorepos and the CLI is tailored for that environment. It provides tooling both
+for bundling and developing full end-user apps, but also for developing,
+building and publishing individual packages within the monorepo, as well as
+tooling that is more unique to Backstage, such as commands for working with
+static configuration.
+
+## Opinionated Tooling
+
+The Backstage CLI is highly opinionated in what tools are used and how they are
+configured. It is tailored for development in large TypeScript monorepos with
+hundreds of separate packages, but with the ability to have edits anywhere in
+the codebase reflected within a few seconds. The build output is also optimized
+for this setup, and aims to provide an excellent user experience with fast page
+load times in modern browsers, rather than a wide range of support.
+
+While the Backstage tooling is opinionated in how to develop and build packages,
+it is also possible to use your own tooling either partially or fully. For
+example, the CLI provides a command for building a plugin package for
+publishing, but the output is a quite standard combination of transpiled
+JavaScript and TypeScript type declarations. The usage of the command from the
+CLI can therefore easily be replaced with other tools if necessary.
+
+Just like `react-scripts`, the Backstage CLI does not provide many hooks for
+overriding or customizing the build process. This is to allow for evolution of
+the CLI without having to take a wide API surface into account. This allows us
+to quickly iterate and improve the tooling, as well as to more easily keep
+dependencies up to date.
+
+## Opinions & Goals
+
+In no particular order, this is a list of opinions and goals that guide the
+design and development of the Backstage CLI:
+
+- All you need for development is `yarn start`, there should be no need to
+ manually build packages or run other separate tasks.
+- Development experience comes first. The toolchain is optimized for keeping
+ development smooth, rather than making it easy to for example build and
+ publish packages.
+- Type checking and linting is left for text editors and Continuous Integration.
+ Most text editors provide tooling for these checks, and running them a second
+ time during compilation slows down iteration speed and consumes more system
+ resources.
+- Backstage is run in modern browsers. We keep transpilation lightweight and
+ rely on modern technologies such as HTTP/2 to optimize frontend speed.
+
+## Glossary
+
+- **Package** - A package in the Node.js ecosystem, often published to a package
+ registry such as [NPM](https://www.npmjs.com/).
+- **Monorepo** - A project layout that consists of multiple packages within a
+ single project, where packages are able to have local dependencies on each
+ other. Often enabled through tooling such as [lerna](https://lerna.js.org/)
+ and [yarn workspaces](https://classic.yarnpkg.com/en/docs/workspaces/)
+- **Local Package** - One of the packages within a monorepo. These package may
+ or may not also be published to a package registry.
+- **Bundle** - A collection of the deployment artifacts. The output of the
+ bundling process, which brings a collection of packages into a single
+ collection of deployment artifacts.
diff --git a/docs/conf/defining.md b/docs/conf/defining.md
index bea03e4e44..34b9b11977 100644
--- a/docs/conf/defining.md
+++ b/docs/conf/defining.md
@@ -4,16 +4,119 @@ title: Defining Configuration for your Plugin
description: Documentation on Defining Configuration for your Plugin
---
-There is currently no tooling support or helpers for defining plugin
-configuration. But it's on the roadmap.
+Configuration in Backstage is organized via a configuration schema, which in
+turn is defined using a superset of
+[JSON Schema Draft-07](https://json-schema.org/specification-links.html#draft-7).
+Each plugin or package within a Backstage app can contribute to the schema,
+which during validation is stitched together into a single schema.
-Meanwhile, document the config values that you are reading in your plugin
-README.
+## Schema Collection and Definition
-## Format
+Schemas are collected from all packages and dependencies in each repo that are a
+part of the Backstage ecosystem, including transitive dependencies. The current
+definition of "part of the ecosystem" is that a package has at least one
+dependency in the `@backstage` namespace, but this is subject to change.
+
+Each package is searched for a schema at a single point of entry, a top-level
+`"configSchema"` field in `package.json`. The field can either contain an
+inlined JSON schema, or a relative path to a schema file. Supported schema file
+formats are `.json` or `.d.ts`.
+
+> When defining a schema file, be sure to include the file in your
+> `package.json` > `"files"` field as well!
+
+TypeScript configuration schema files should export a single `Config` type, for
+example:
+
+```ts
+export interface Config {
+ app: {
+ /**
+ * Frontend root URL
+ * @visibility frontend
+ */
+ baseUrl: string;
+
+ // Use @items. to assign annotations to primitive array items
+ /** @items.visibility frontend */
+ myItems: string[];
+ };
+}
+```
+
+Separate `.json` schema files can use a top-level
+`"$schema": "https://backstage.io/schema/config-v1"` declaration in order to
+receive schema validation and autocompletion. For example:
+
+```json
+{
+ "$schema": "https://backstage.io/schema/config-v1",
+ "type": "object",
+ "properties": {
+ "app": {
+ "type": "object",
+ "properties": {
+ "baseUrl": {
+ "type": "string",
+ "description": "Frontend root URL",
+ "visibility": "frontend"
+ }
+ },
+ "required": ["baseUrl"]
+ },
+ "required": ["app"]
+ }
+}
+```
+
+## Visibility
+
+The `https://backstage.io/schema/config-v1` meta schema is a superset of JSON
+Schema Draft 07. The single addition is a custom `visibility` keyword, which is
+used to indicate whether the given config value should be visible in the
+frontend or not. The possible values are `frontend`, `backend`, and `secret`,
+where `backend` is the default. A visibility of `secret` has the same scope at
+runtime, but it will be treated with more care in certain contexts, and defining
+both `frontend` and `secret` for the same value in two different schemas will
+result in an error during schema merging.
+
+The visibility only applies to the direct parent of where the keyword is placed
+in the schema. For example, if you set the visibility to `frontend` for a subset
+of the schema with `type: "object"`, but none of the descendants, only an empty
+object will be available in the frontend. The full ancestry does not need to
+have correctly defined visibilities however, so it is enough to only for example
+declare the visibility of a leaf node of `type: "string"`.
+
+| `visibility` | |
+| ------------ | ------------------------------------------------------------------ |
+| `frontend` | Visible in frontend and backend |
+| `backend` | (Default) Only in backend |
+| `secret` | Only in backend and may be excluded from logs for security reasons |
+
+## Validation
+
+Schemas can be validated using the `backstage-cli config:check` command. If you
+want to validate anything else than the default `app-config.yaml`, be sure to
+pass in all of the configuration files as `--config ` options as well.
+
+To validate and examine the frontend configuration, use the
+`backstage-cli config:print --frontend` command. Just like for validation you
+may need to pass in all files using one or multiple `--config ` options.
+
+## Guidelines
+
+> Make limited use of static configuration. The first question to ask is whether
+> a particular option actually needs to be static configuration, or if it might
+> just as well be a TypeScript API. In general, options that you want to be able
+> to change for different deployment environments should be static
+> configuration, while it should otherwise be avoided.
When defining configuration for your plugin, keep keys camelCased and stick to
-existing casing conventions such as `baseUrl`.
+existing casing conventions such as `baseUrl` rather than `baseURL`.
It is also usually best to prefer objects over arrays, as it makes it possible
to override individual values using separate files or environment variables.
+
+Avoid creating new top-level fields as much as possible. Either place your
+configuration within an existing known top-level block, or create a single new
+one using e.g. the name of the product that the plugin integrates.
diff --git a/docs/conf/index.md b/docs/conf/index.md
index 2c3ee06ba6..a6f1d1f6f7 100644
--- a/docs/conf/index.md
+++ b/docs/conf/index.md
@@ -28,11 +28,25 @@ development or small tweaks to be able to reuse deployment artifacts in
different environments.
The configuration is shared between the frontend and backend, meaning that
-values that are common between the two only needs to be defined once. Such as
-the `backend.baseUrl`.
+values that are common between the two only need to be defined once. Such as the
+`backend.baseUrl`.
For more details, see [Writing Configuration](./writing.md).
+## Configuration Schema
+
+The configuration is validated using JSON Schema definitions. Each plugin and
+package can provide pieces of the configuration schema, which are stitched
+together to form a complete schema during validation. The configuration schema
+is also used to select what configuration is available in the frontend using a
+custom `visibility` keyword, as configuration is by default only available in
+the backend.
+
+You can validate your configuration against the schema using
+`backstage-cli config:check`, and define a schema for your own plugin either
+using JSON Schema or TypeScript. For more information, see
+[Defining Configuration](./defining.md).
+
## Reading Configuration
As a plugin developer, you likely end up wanting to define configuration that
@@ -49,5 +63,5 @@ More details are provided in dedicated sections of the documentation.
plugin.
- [Writing Configuration](./writing.md): How to provide configuration for your
Backstage deployment.
-- [Defining Configuration](./defining.md): How to define configuration for users
- of your plugin.
+- [Defining Configuration](./defining.md): How to define a configuration schema
+ for users of your plugin or package.
diff --git a/docs/conf/reading.md b/docs/conf/reading.md
index a43ec8c026..6d4b61224d 100644
--- a/docs/conf/reading.md
+++ b/docs/conf/reading.md
@@ -117,7 +117,7 @@ The [ConfigApi](../reference/utility-apis/Config.md) in the frontend is a
Depending on the config api in another API is slightly different though, as the
`ConfigApi` implementation is supplied via the App itself and not instantiated
like other APIs. See
-[packages/app/src/apis.ts](https://github.com/spotify/backstage/blob/244eef851f5aa19f91c7c9b5c12d5df95cf482ca/packages/app/src/apis.ts#L66)
+[packages/app/src/apis.ts](https://github.com/backstage/backstage/blob/244eef851f5aa19f91c7c9b5c12d5df95cf482ca/packages/app/src/apis.ts#L66)
for an example of how this wiring is done.
For standalone plugin setups in `dev/index.ts`, register a factory with a
@@ -129,4 +129,4 @@ from `@backstage/core`.
In backend plugins the configuration is passed in via options from the main
backend package. See for example
-[packages/backend/src/plugins/auth.ts](https://github.com/spotify/backstage/blob/244eef851f5aa19f91c7c9b5c12d5df95cf482ca/packages/backend/src/plugins/auth.ts#L23).
+[packages/backend/src/plugins/auth.ts](https://github.com/backstage/backstage/blob/244eef851f5aa19f91c7c9b5c12d5df95cf482ca/packages/backend/src/plugins/auth.ts#L23).
diff --git a/docs/conf/writing.md b/docs/conf/writing.md
index 06d4b52f3f..7e8402b6f6 100644
--- a/docs/conf/writing.md
+++ b/docs/conf/writing.md
@@ -19,7 +19,7 @@ backend:
baseUrl: http://localhost:7000
organization:
- name: Spotify
+ name: CNCF
proxy:
/my/api:
@@ -74,7 +74,7 @@ Note that if any config flags are provided, the default `app-config.yaml` files
are NOT loaded. To include them you need to explicitly include them with a flag,
for example:
-```
+```shell
yarn start --config ../../app-config.yaml --config ../../app-config.staging.yaml
```
@@ -97,10 +97,10 @@ order:
- If no config flags are provided, `app-config.local.yaml` has higher priority
than `app-config.yaml`.
-## Secrets
+## Secrets and Dynamic Data
-Secrets are supported via a special secret keys that are prefixed with `$`,
-which in turn provides a number of different ways to read in secrets. To load a
+Secrets are supported via special data loading keys that are prefixed with `$`,
+which in turn provide a number of different ways to read in secrets. To load a
configuration value as a secret, supply an object with one of the special secret
keys, for example `$env` or `$file`. A full list of supported secret keys can be
found below. For example, the following will read the config key
@@ -117,10 +117,6 @@ will return the value of the environment variable `MY_SECRET_KEY` when the
backend started up. All secrets are loaded at startup, so changing the contents
of secret files or environment variables will not be reflected at runtime.
-Note that secrets will never be included in the frontend bundle or development
-builds. When loading configuration you have to explicitly enable reading of
-secrets, which is only done for the backend configuration.
-
As hinted at, secrets can be loaded from a bunch of different sources, and can
be extended with more. Below is a list of the currently supported methods for
loading secrets.
@@ -145,18 +141,22 @@ itself:
$file: ./my-secret.txt
```
-### Data File Secrets
+### Including Files
-This reads secrets from a path within a JSON-like data file. The file path
-behaves similar to file secrets, but with the addition of a url fragment that is
-used to point to a specific value inside the file. Supported file extensions are
-`.json`, `.yaml`, and `.yml`. For example, the following would read out
-`my-secret-key` from `my-secrets.json`:
+The `$include` keyword can be used to load in JSON data from an external file.
+It's able to load and parse data from `.json`, `.yml`, and `.yaml` files. It's
+also possible to include a url fragment (`#`) to point to a value at the given
+path in the file.
+
+For example, the following would read `my-secret-key` from `my-secrets.json`:
```yaml
-$data: ./my-secrets.json#deployment.key
+$include: ./my-secrets.json#deployment.key
+```
-# my-secrets.json
+Example `my-secrets.json` file:
+
+```json
{
"deployment": {
"key": "my-secret-key"
diff --git a/docs/dls/design.md b/docs/dls/design.md
index fa3a0c159e..3bf283b77f 100644
--- a/docs/dls/design.md
+++ b/docs/dls/design.md
@@ -46,9 +46,9 @@ referencing Figma documents to share specs and prototypes with the community.
### Creating a New Design Component
-| Step 1 | Step 2 | Step 3 | Step 4 | Step 5 | Step 6 |
-| :------------------------------------------------------------------------------------------------ | :------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------- | :----------------------------------------------------------------------- | :--------------------------------------------------------------------------- | :------------------------------------------------------------------------------------- |
-| Platform design team submits an issue to **spotify/Backstage GitHub** with a potential component. | Backstage community offers feedback or approval on **spotify/Backstage GitHub**. | Platform design team adjusts accordingly (as they see fit) and update the Figma DLS document. | Designed component is added to **spotify/Backstage GitHub** as an issue. | External or internal Backstage open source contributors build the component. | External or internal contributors add the component to the **Backstage Storybook**. 🎉 |
+| Step 1 | Step 2 | Step 3 | Step 4 | Step 5 | Step 6 |
+| :-------------------------------------------------------------------------------------------------- | :--------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------- | :--------------------------------------------------------------------------- | :------------------------------------------------------------------------------------- |
+| Platform design team submits an issue to **backstage/backstage GitHub** with a potential component. | Backstage community offers feedback or approval on **backstage/backstage GitHub**. | Platform design team adjusts accordingly (as they see fit) and update the Figma DLS document. | Designed component is added to **backstage/backstage GitHub** as an issue. | External or internal Backstage open source contributors build the component. | External or internal contributors add the component to the **Backstage Storybook**. 🎉 |
### Building for Backstage
@@ -56,9 +56,9 @@ referencing Figma documents to share specs and prototypes with the community.
| :------------------------------------------------------------------------------------------------------------ | :-------------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------- |
| External or internal contributors use Backstage and come up with an idea of an entity to build for Backstage. | External or internal contributors refer to the Backstage Open Source design system documentation in the Figma DLS document. | External or internal contributors leverage the components and tokens from the Backstage Storybook. | External or internal contributors build their Backstage entity. |
-| Step 5 | Step 6 | Step 7 | Step 8 |
-| :------------------------------------------------------------------------------------------------------------- | :--------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------ |
-| External or internal contributors make a pull request for their entity on spotify/Backstage GitHub for review. | Platform designers and devs review the entity and submit feedback or approval on spotify/Backstage GitHub. | External or internal contributors make the changes, pull request is approved and the entity is merged. It’s live on Backstage! 🎉 | If the entity happens to be or include a UX component, it’s added to Backstage Storybook as well. |
+| Step 5 | Step 6 | Step 7 | Step 8 |
+| :--------------------------------------------------------------------------------------------------------------- | :----------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------ |
+| External or internal contributors make a pull request for their entity on backstage/backstage GitHub for review. | Platform designers and devs review the entity and submit feedback or approval on backstage/backstage GitHub. | External or internal contributors make the changes, pull request is approved and the entity is merged. It’s live on Backstage! 🎉 | If the entity happens to be or include a UX component, it’s added to Backstage Storybook as well. |
The following diagram shows the relationship between the Backstage Design System
and our foundation, which comprises of [Material UI](https://material-ui.com/)
@@ -99,9 +99,10 @@ issues in GitHub with ‘design’ and/or ‘storybook’ - so feel free to brow
tackle the tasks that interest you. If you have any questions regarding an
issue, you can ask them in the comments section of the issue or on
[Discord](https://discord.gg/EBHEGzX). We absolutely adore our external
-contributors and will send you virtual semlas for your contributions!
+contributors and will send you virtual
+[semlas](https://en.wikipedia.org/wiki/Semla) for your contributions!
-### Request a component.
+### Request a component
Create an issue (label it design and assign it to katz95) or send us a message
on [Discord](https://discord.gg/EBHEGzX) (_#design_ channel) with details of
@@ -135,5 +136,3 @@ contributing to Backstage as a designer is easy. From styling guidelines to UX
principles to Figma documents, we’ll make sure you’re equipped to chip in on
this project. We’re excited to work with you! In the meantime, we’d love to hear
from you on [Discord](https://discord.gg/EBHEGzX).
-
-[Back to Docs](../README.md)
diff --git a/docs/features/software-catalog/configuration.md b/docs/features/software-catalog/configuration.md
index dd19d4cd51..d10fb29e30 100644
--- a/docs/features/software-catalog/configuration.md
+++ b/docs/features/software-catalog/configuration.md
@@ -89,7 +89,7 @@ the catalog under the `catalog.locations` key, for example:
catalog:
locations:
- type: url
- target: https://github.com/spotify/backstage/blob/master/packages/catalog-model/examples/artist-lookup-component.yaml
+ target: https://github.com/backstage/backstage/blob/master/packages/catalog-model/examples/artist-lookup-component.yaml
```
The locations added through static configuration can not be removed through the
diff --git a/docs/features/software-catalog/descriptor-format.md b/docs/features/software-catalog/descriptor-format.md
index a330ef196a..763acd2261 100644
--- a/docs/features/software-catalog/descriptor-format.md
+++ b/docs/features/software-catalog/descriptor-format.md
@@ -2,8 +2,8 @@
id: descriptor-format
title: Descriptor Format of Catalog Entities
sidebar_label: YAML File Format
-description: Documentation on Descriptor Format of Catalog Entities which
-describes the default data shape and semantics of catalog entities
+# prettier-ignore
+description: Documentation on Descriptor Format of Catalog Entities which describes the default data shape and semantics of catalog entities
---
This section describes the default data shape and semantics of catalog entities.
@@ -22,11 +22,16 @@ we recommend that you name them `catalog-info.yaml`.
- [Overall Shape Of An Entity](#overall-shape-of-an-entity)
- [Common to All Kinds: The Envelope](#common-to-all-kinds-the-envelope)
- [Common to All Kinds: The Metadata](#common-to-all-kinds-the-metadata)
+- [Common to All Kinds: Relations](#common-to-all-kinds-relations)
- [Kind: Component](#kind-component)
- [Kind: Template](#kind-template)
- [Kind: API](#kind-api)
- [Kind: Group](#kind-group)
- [Kind: User](#kind-user)
+- [Kind: Resource](#kind-resource)
+- [Kind: System](#kind-system)
+- [Kind: Domain](#kind-domain)
+- [Kind: Location](#kind-location)
## Overall Shape Of An Entity
@@ -39,7 +44,7 @@ software catalog API.
"kind": "Component",
"metadata": {
"annotations": {
- "backstage.io/managed-by-location": "file:/tmp/component-info.yaml",
+ "backstage.io/managed-by-location": "file:/tmp/catalog-info.yaml",
"example.com/service-discovery": "artistweb",
"circleci.com/project-slug": "github/example-org/artist-website"
},
@@ -89,6 +94,43 @@ significance and have reserved purposes and distinct shapes.
See below for details about these fields.
+## Substitutions In The Descriptor Format
+
+The descriptor format supports substitutions using `$text`, `$json`, and
+`$yaml`.
+
+Placeholders like `$json: https://example.com/entity.json` are substituted by
+the content of the referenced file. Files can be referenced from any configured
+integration similar to locations by passing an absolute URL. It's also possible
+to reference relative files like `./referenced.yaml` from the same location.
+Relative references are handled relative to the folder of the
+`catalog-info.yaml` that contains the placeholder. There are three different
+types of placeholders:
+
+- `$text`: Interprets the contents of the referenced file as plain text and
+ embeds it as a string.
+- `$json`: Interprets the contents of the referenced file as JSON and embeds the
+ parsed structure.
+- `$yaml`: Interprets the contents of the referenced file as YAML and embeds the
+ parsed structure.
+
+For example, this can be used to load the definition of an API entity from a web
+server and embed it as a string in the field `spec.definition`:
+
+```yaml
+apiVersion: backstage.io/v1alpha1
+kind: API
+metadata:
+ name: petstore
+ description: The Petstore API
+spec:
+ type: openapi
+ lifecycle: production
+ owner: petstore@example.com
+ definition:
+ $text: https://petstore.swagger.io/v2/swagger.json
+```
+
## Common to All Kinds: The Envelope
The root envelope object has the following structure.
@@ -259,6 +301,61 @@ This field is optional, and currently has no special semantics.
Each tag must be sequences of `[a-z0-9]` separated by `-`, at most 63 characters
in total.
+## Common to All Kinds: Relations
+
+The `relations` root field is a read-only list of relations, between the current
+entity and other entities, described in the
+[well-known relations section](well-known-relations.md). Relations are commonly
+two-way, so that there's a pair of relation types each describing one direction
+of the relation.
+
+A relation as part of a single entity that's read out of the API may look as
+follows.
+
+```js
+{
+ // ...
+ "relations": [
+ {
+ "target": {
+ "kind": "group",
+ "namespace": "default",
+ "name": "dev.infra"
+ },
+ "type": "ownedBy"
+ }
+ ],
+ "spec": {
+ "owner": "dev.infra",
+ // ...
+ }
+}
+```
+
+The fields of a relation are:
+
+| Field | Type | Description |
+| ---------- | ------ | -------------------------------------------------------------------------------- |
+| `target` | Object | A complete [compound reference](references.md) to the other end of the relation. |
+| `type` | String | The type of relation FROM a source entity TO the target entity. |
+| `metadata` | Object | Reserved for future use. |
+
+Entity descriptor YAML files are not supposed to contain this field. Instead,
+catalog processors analyze the entity descriptor data and its surroundings, and
+deduce relations that are then attached onto the entity as read from the
+catalog.
+
+Where relations are produced, they are to be considered the authoritative source
+for that piece of data. In the example above, a plugin would do better to
+consume the relation rather than `spec.owner` for deducing the owner of the
+entity, because it may even be the case that the owner isn't taken from the YAML
+at all - it could be taken from a CODEOWNERS file nearby instead for example.
+Also, the `spec.owner` is on a shortened form and may have semantics associated
+with it (such as the default kind being `Group` if not specified).
+
+See the [well-known relations section](well-known-relations.md) for a list of
+well-known / common relations and their semantics.
+
## Kind: Component
Describes the following entity kind:
@@ -285,7 +382,7 @@ spec:
type: website
lifecycle: production
owner: artist-relations@example.com
- implementsApis:
+ providesApis:
- artist-api
```
@@ -310,7 +407,7 @@ The current set of well-known and common values for this field is:
- `service` - a backend service, typically exposing an API
- `website` - a website
-- `library` - a software library, such as an NPM module or a Java library
+- `library` - a software library, such as an npm module or a Java library
### `spec.lifecycle` [required]
@@ -347,10 +444,18 @@ Apart from being a string, the software catalog leaves the format of this field
open to implementers to choose. Most commonly, it is set to the ID or email of a
group of people in an organizational structure.
-### `spec.implementsApis` [optional]
+### `spec.providesApis` [optional]
-Links APIs that are implemented by the component, e.g. `artist-api`. This field
-is optional.
+Links APIs that are provided by the component, e.g. `artist-api`. This field is
+optional.
+
+The software catalog expects a list of one or more strings that references the
+names of other entities of the `kind` `API`.
+
+### `spec.consumesApis` [optional]
+
+Links APIs that are consumed by the component, e.g. `artist-api`. This field is
+optional.
The software catalog expects a list of one or more strings that references the
names of other entities of the `kind` `API`.
@@ -438,7 +543,7 @@ The current set of well-known and common values for this field is:
- `service` - a backend service, typically exposing an API
- `website` - a website
-- `library` - a software library, such as an NPM module or a Java library
+- `library` - a software library, such as an npm module or a Java library
### `spec.templater` [required]
@@ -533,6 +638,9 @@ The current set of well-known and common values for this field is:
[OpenAPI](https://swagger.io/specification/) version 2 or version 3 spec.
- `asyncapi` - An API definition based on the
[AsyncAPI](https://www.asyncapi.com/docs/specifications/latest/) spec.
+- `graphql` - An API definition based on
+ [GraphQL schemas](https://spec.graphql.org/) for consuming
+ [GraphQL](https://graphql.org/) based APIs.
- `grpc` - An API definition based on
[Protocol Buffers](https://developers.google.com/protocol-buffers) to use with
[gRPC](https://grpc.io/).
@@ -600,10 +708,12 @@ metadata:
description: The infra business unit
spec:
type: business-unit
+ profile:
+ displayName: Infrastructure
+ email: infrastructure@example.com
+ picture: https://example.com/groups/bu-infrastructure.jpeg
parent: ops
- ancestors: [ops, global-synergies, acme-corp]
children: [backstage, other]
- descendants: [backstage, other, team-a, team-b, team-c, team-d]
```
In addition to the [common envelope metadata](#common-to-all-kinds-the-metadata)
@@ -626,6 +736,14 @@ Some common values for this field could be:
- `product-area`
- `root` - as a common virtual root of the hierarchy, if desired
+### `spec.profile` [optional]
+
+Optional profile information about the group, mainly for display purposes. All
+fields of this structure are also optional. The email would be a group email of
+some form, that the group may wish to be used for contacting them. The picture
+is expected to be a URL pointing to an image that's representative of the group,
+and that a browser could fetch and render on a group page or similar.
+
### `spec.parent` [optional]
The immediate parent group in the hierarchy, if any. Not all groups must have a
@@ -639,20 +757,6 @@ namespace as the user. Only `Group` entities may be referenced. Most commonly,
this field points to a group in the same namespace, so in those cases it is
sufficient to enter only the `metadata.name` field of that group.
-### `spec.ancestors` [required]
-
-The recursive list of parents up the hierarchy, by stepping through parents one
-by one. The list must be present, but may be empty if `parent` is not present.
-The first entry in the list is equal to `parent`, and then the following ones
-are progressively farther up the hierarchy.
-
-The entries of this array are
-[entity references](https://backstage.io/docs/features/software-catalog/references),
-with the default kind `Group` and the default namespace equal to the same
-namespace as the user. Only `Group` entities may be referenced. Most commonly,
-these entries point to groups in the same namespace, so in those cases it is
-sufficient to enter only the `metadata.name` field of those groups.
-
### `spec.children` [required]
The immediate child groups of this group in the hierarchy (whose `parent` field
@@ -667,20 +771,6 @@ namespace as the user. Only `Group` entities may be referenced. Most commonly,
these entries point to groups in the same namespace, so in those cases it is
sufficient to enter only the `metadata.name` field of those groups.
-### `spec.descendants` [required]
-
-The immediate and recursive child groups of this group in the hierarchy
-(children, and children's children, etc.). The list must be present, but may be
-empty if there are no child groups. The items are not guaranteed to be ordered
-in any particular way.
-
-The entries of this array are
-[entity references](https://backstage.io/docs/features/software-catalog/references),
-with the default kind `Group` and the default namespace equal to the same
-namespace as the user. Only `Group` entities may be referenced. Most commonly,
-these entries point to groups in the same namespace, so in those cases it is
-sufficient to enter only the `metadata.name` field of those groups.
-
## Kind: User
Describes the following entity kind:
@@ -740,3 +830,70 @@ with the default kind `Group` and the default namespace equal to the same
namespace as the user. Only `Group` entities may be referenced. Most commonly,
these entries point to groups in the same namespace, so in those cases it is
sufficient to enter only the `metadata.name` field of those groups.
+
+## Kind: Resource
+
+This kind is not yet defined, but is reserved [for future use](system-model.md).
+
+## Kind: System
+
+This kind is not yet defined, but is reserved [for future use](system-model.md).
+
+## Kind: Domain
+
+This kind is not yet defined, but is reserved [for future use](system-model.md).
+
+## Kind: Location
+
+Describes the following entity kind:
+
+| Field | Value |
+| ------------ | ----------------------- |
+| `apiVersion` | `backstage.io/v1alpha1` |
+| `kind` | `Location` |
+
+A location is a marker that references other places to look for catalog data.
+
+Descriptor files for this kind may look as follows.
+
+```yaml
+apiVersion: backstage.io/v1alpha1
+kind: Location
+metadata:
+ name: org-data
+spec:
+ type: url
+ targets:
+ - http://github.com/myorg/myproject/org-data-dump/catalog-info-staff.yaml
+ - http://github.com/myorg/myproject/org-data-dump/catalog-info-consultants.yaml
+```
+
+In addition to the [common envelope metadata](#common-to-all-kinds-the-metadata)
+shape, this kind has the following structure.
+
+### `apiVersion` and `kind` [required]
+
+Exactly equal to `backstage.io/v1alpha1` and `Location`, respectively.
+
+### `spec.type` [optional]
+
+The single location type, that's common to the targets specified in the spec. If
+it is left out, it is inherited from the location type that originally read the
+entity data. For example, if you have a `url` type location, that when read
+results in a `Location` kind entity with no `spec.type`, then the referenced
+targets in the entity will implicitly also be of `url` type. This is useful
+because you can define a hierarchy of things in a directory structure using
+relative target paths (see below), and it will work out no matter if it's
+consumed locally on disk from a `file` location, or as uploaded on a VCS.
+
+### `spec.target` [optional]
+
+A single target as a string. Can be either an absolute path/URL (depending on
+the type), or a relative path such as `./details/catalog-info.yaml` which is
+resolved relative to the location of this Location entity itself.
+
+### `spec.targets` [optional]
+
+A list of targets as strings. They can all be either absolute paths/URLs
+(depending on the type), or relative paths such as `./details/catalog-info.yaml`
+which are resolved relative to the location of this Location entity itself.
diff --git a/docs/features/software-catalog/extending-the-model.md b/docs/features/software-catalog/extending-the-model.md
index b045660202..d4dca0c059 100644
--- a/docs/features/software-catalog/extending-the-model.md
+++ b/docs/features/software-catalog/extending-the-model.md
@@ -1,41 +1,351 @@
---
id: extending-the-model
title: Extending the model
-description: Documentation on Extending the model
+description: Documentation on extending the catalog model
---
-Backstage natively supports tracking of the following component
-[`type`](descriptor-format.md)'s:
+The Backstage catalog [entity data model](descriptor-format.md) is based on the
+[Kubernetes objects format](https://kubernetes.io/docs/concepts/overview/working-with-objects/kubernetes-objects/),
+and borrows a lot of its semantics as well. This page describes those semantics
+at a higher level and how to extend them to fit your organization.
-- Services
-- Websites
-- Libraries
-- Documentation
-- Other
+Backstage comes with a number of catalog concepts out of the box:
-
+- There are a number of builtin versioned _kinds_, such as `Component`, `User`
+ etc. These encapsulate the high level concept of an entity, and define the
+ schema for its entity definition data.
+- An entity has both a _metadata_ object and a _spec_ object at the root.
+- Each kind may or may not have a _type_. For example, there are several well
+ known types of component, such as `service` and `website`. These clarify the
+ more detailed nature of the entity, and may affect what features are exposed
+ in the interface.
+- Entities may have a number of _[annotations](well-known-annotations.md)_ on
+ them. These can be added either by humans into the descriptor files, or added
+ by automated processes when the entity is ingested into the catalog.
+- Entities may have a number of _labels_ on them.
+- Entities may have a number of _relations_, expressing how they relate to each
+ other in different ways.
-Since these types are likely not the only kind of software you will want to
-track in Backstage, it is possible to add your own software types that fit your
-organization's data model. Inside Spotify our model has grown significantly over
-the years, and now includes ML models, Apps, data pipelines and many more.
+We'll list different possibilities for extending this below.
-## Adding a new type
+## Adding a New apiVersion of an Existing Kind
-TODO: Describe what changes are needed to add a new type that shows up in the
-catalog.
+Example intents:
-## The Other type
+> "I want to evolve this core kind, tweaking the semantics a bit so I will bump
+> the apiVersion a step"
+
+> "This core kind is a decent fit but we want to evolve it at will so we'll move
+> it to our own company's apiVersion space and use that instead of
+> `backstage.io`."
+
+The `backstage.io` apiVersion space is reserved for use by the Backstage
+maintainers. Please do not change or add versions within that space.
+
+If you add an [apiVersion](descriptor-format.md#apiversion-and-kind-required)
+space of your own, you are effectively branching out from the underlying kind
+and making your own. An entity kind is identified by the apiVersion + kind pair,
+so even though the resulting entity may be similar to the core one, there will
+be no guarantees that plugins will be able to parse or understand its data. See
+below about adding a new kind.
+
+## Adding a New Kind
+
+Example intents:
+
+> "The kinds that come with the package are lacking. I want to model this other
+> thing that is a poor fit for either of the builtins."
+
+> "This core kind is a decent fit but we want to evolve it at will so we'll move
+> it to our own company's apiVersion space and use that instead of
+> `backstage.io`."
+
+A [kind](descriptor-format.md#apiversion-and-kind-required) is an overarching
+family, or an idea if you will, of entities that also share a schema. Backstage
+comes with a number of builtin ones that we believe are useful for a large
+variety of needs that one may want to model in Backstage. The primary ambition
+is to map things to these kinds, but sometimes you may want or need to extend
+beyond them.
+
+Introducing a new apiVersion is basically the same as adding a new kind. Bear in
+mind that most plugins will be compiled against the builtin
+`@backstage/catalog-model` package and have expectations that kinds align with
+that.
+
+The catalog backend itself, from a storage and API standpoint, does not care
+about the kind of entities it stores. Extending with new kinds is mainly a
+matter of permitting them to pass validation when building the backend catalog
+using the `CatalogBuilder`, and then to make plugins be able to understand the
+new kind.
+
+For the consuming side, it's a different story. Adding a kind has a very large
+impact. The very foundation of Backstage is to attach behavior and views and
+functionality to entities that we ascribe some meaning to. There will be many
+places where code checks `if (kind === 'X')` for some hard coded `X`, and casts
+it to a concrete type that it imported from a package such as
+`@backstage/catalog-model`.
+
+If you want to model something that doesn't feel like a fit for either of the
+builtin kinds, feel free to reach out to the Backstage maintainers to discuss
+how to best proceed.
+
+If you end up adding that new kind, you must namespace its `apiVersion`
+accordingly with a prefix that makes sense, typically based on your organization
+name - e.g. `my-company.net/v1`. Also do pick a new `kind` identifier that does
+not collide with the builtin kinds.
+
+## Adding a New Type of an Existing Kind
+
+Example intents:
+
+> "This is clearly a component, but it's of a type that doesn't quite fit with
+> the ones I've seen before."
+
+> "We don't call our teams "team", can't we put "flock" as the group type?"
+
+Some entity kinds have a `type` field in its spec. This is where an organization
+are free to express the variety of entities within a kind. This field is
+expected to follow some taxonomy that makes sense for yourself. The chosen value
+may affect what operations and views are enabled in Backstage for that entity.
+Inside Spotify our model has grown significantly over the years, and our
+component types now include ML models, apps, data pipelines and many more.
It might be tempting to put software that doesn't fit into any of the existing
-types into Other. There are a few reasons why we advise against this; firstly,
-we have found that it is preferred to match the conceptual model that your
-engineers have when describing your software. Secondly, Backstage helps your
-engineers manage their software by integrating the infrastructure tooling
-through plugins. Different plugins are used for managing different types of
-components.
+types into an Other catch-all type. There are a few reasons why we advise
+against this; firstly, we have found that it is preferred to match the
+conceptual model that your engineers have when describing your software.
+Secondly, Backstage helps your engineers manage their software by integrating
+the infrastructure tooling through plugins. Different plugins are used for
+managing different types of components.
For example, the
-[Lighthouse plugin](https://github.com/spotify/backstage/tree/master/plugins/lighthouse)
+[Lighthouse plugin](https://github.com/backstage/backstage/tree/master/plugins/lighthouse)
only makes sense for Websites. The more specific you can be in how you model
your software, the easier it is to provide plugins that are contextual.
+
+Adding a new type takes relatively little effort and carries little risk. Any
+type value is accepted by the catalog backend, but plugins may have to be
+updated if you want particular behaviors attached to that new type.
+
+## Changing the Validation Rules for The Entity Envelope or Metadata Fields
+
+Example intents:
+
+> "We want to import our old catalog but the default set of allowed characters
+> for a metadata.name are too strict."
+
+> "I want to change the rules for annotations so that I'm allowed to store any
+> data in annotation values, not just strings."
+
+After pieces of raw entity data have been read from a location, they are passed
+through a fixed number of so called `Validators`, as part of the entity policy
+check step. They ensure that the types and syntax of the base envelope and
+metadata make sense - in short, things that aren't entity-kind-specific. Some or
+all of these validators can be replaced when building the backend catalog using
+the `CatalogBuilder`.
+
+The risk and impact of this type of extension varies, based on what it is that
+you want to do. For example, extending the valid character set for kinds,
+namespaces and names can be fairly harmless, with a few notable exceptions -
+there is code that expects these to never ever contain a colon or slash, for
+example, and introducing URL-unsafe characters risks breaking plugins that
+aren't careful about encoding arguments. Supporting non-strings in annotations
+may be possible but has not yet been tried out in the real world - there is
+likely to be some level of plugin breakage that can be hard to predict.
+
+Before making this kind of extension, we recommend that you contact the
+Backstage maintainers or a support partner to discuss your use case.
+
+## Changing the Validation Rules for Core Entity Fields
+
+Example intent:
+
+> "I don't like that the owner is mandatory. I'd like it to be optional."
+
+After reading and policy-checked entity data from a location, it is sent through
+the processor chain looking for processors that implement the
+`validateEntityKind` step, to see that the data is of a known kind and abides by
+its schema. There is a builtin processor that implements this for all known core
+kinds and matches the data against their fixed validation schema. This processor
+can be replaced when building the backend catalog using the `CatalogBuilder`,
+with a processor of your own that validates the data differently.
+
+This type of extension is high risk, and may have high impact across the
+ecosystem depending on the type of change that is made. It is therefore not
+recommended in normal cases. There will be a large number of plugins and
+processors - and even the core itself - that make assumptions about the shape of
+the data and import the typescript data type from the `@backstage/catalog-model`
+package.
+
+## Adding New Fields to the Metadata Object
+
+Example intent:
+
+> "Our entities have this auxiliary property that I would like to express for
+> several entity kinds and it doesn't really fit as a spec field."
+
+The metadata object is currently left open for extension. Any unknown fields
+found in the metadata will just be stored verbatim in the catalog. However we
+want to caution against extending the metadata excessively. Firstly, you run the
+risk of colliding with future extensions to the model. Secondly, it is common
+that this type of extension lives more comfortably elsewhere - primarily in the
+metadata labels or annotations, but sometimes you even may want to make a new
+component type or similar instead.
+
+There are some situations where metadata can be the right place. If you feel
+that you have run into such a case and that it would apply to others, do feel
+free to contact the Backstage maintainers or a support partner to discuss your
+use case. Maybe we can extend the core model to benefit both you and others.
+
+## Adding New Fields to the Spec Object of an Existing Kind
+
+Example intent:
+
+> "The builtin Component kind is fine but we want to add an additional field to
+> the spec for describing whether it's in prod or staging."
+
+A kind's schema validation typically doesn't forbid "unknown" fields in an
+entity `spec`, and the catalog will happily store whatever is in it. So doing
+this will usually work from the catalog's point of view.
+
+Adding fields like this is subject to the same risks as mentioned about metadata
+extensions above. Firstly, you run the risk of colliding with future extensions
+to the model. Secondly, it is common that this type of extension lives more
+comfortably elsewhere - primarily in the metadata labels or annotations, but
+sometimes you even may want to make a new component type or similar instead.
+
+There are some situations where the spec can be the right place. If you feel
+that you have run into such a case and that it would apply to others, do feel
+free to contact the Backstage maintainers or a support partner to discuss your
+use case. Maybe we can extend the core model to benefit both you and others.
+
+## Adding a New Annotation
+
+Example intents:
+
+> "Our custom made build system has the concept of a named pipeline-set, and we
+> want to associate individual components with their corresponding pipeline-sets
+> so we can show their build status."
+
+> "We have an alerting system that automatically monitors service health, and
+> there's this integration key that binds the service to an alerts pool. We want
+> to be able to show the ongoing alerts for our services in Backstage so it'd be
+> nice to attach that integration key to the entity somehow."
+
+Annotations are mainly intended to be consumed by plugins, for feature detection
+or linking into external systems. Sometimes they are added by humans, but often
+they are automatically generated at ingestion time by processors. There is a set
+of [well-known annotations](well-known-annotations.md), but you are free to add
+additional ones. This carries no risk or impact to other systems as long as you
+abide by the following naming rules.
+
+- The `backstage.io` annotation prefix is reserved for use by the Backstage
+ maintainers. Reach out to us if you feel that you would like to make an
+ addition to that prefix.
+- Annotations that pertain to a well known third party system should ideally be
+ prefixed with a domain, in a way that makes sense to a reader and connects it
+ clearly to the system (or the maker of the system). For example, you might use
+ a `pagerduty.com` prefix for pagerduty related annotations, but maybe not
+ `ldap.com` for LDAP annotations since it's not directly affiliated with or
+ owned by an LDAP foundation/company/similar.
+- Annotations that have no prefix at all, are considered local to your Backstage
+ instance and can be used freely as such, but you should not make use of them
+ outside of your organization. For example, if you were to open source a plugin
+ that generates or consumes annotations, then those annotations must be
+ properly prefixed with your company domain or a domain that pertains to the
+ annotation at hand.
+
+## Adding a New Label
+
+Example intents:
+
+> "Our process reaping system wants to periodically scrape for components that
+> have a certain property."
+
+> "It'd be nice if our service owners could just tag their components somehow to
+> let the CD system know to automatically generate SRV records or not for that
+> service."
+
+Labels are mainly intended to be used for filtering of entities, by external
+systems that want to find entities that have some certain property. This is
+sometimes used for feature detection / selection. An example could be to add a
+label `deployments.my-company.net/register-srv: "true"`.
+
+At the time of writing this, the use of labels is very limited and we are still
+settling together with the community on how to best use them. If you feel that
+your use case fits the labels best, we would appreciate if you let the Backstage
+maintainers know.
+
+You are free to add labels. This carries no risk or impact to other systems as
+long as you abide by the following naming rules.
+
+- The `backstage.io` label prefix is reserved for use by the Backstage
+ maintainers. Reach out to us if you feel that you would like to make an
+ addition to that prefix.
+- Labels that pertain to a well known third party system should ideally be
+ prefixed with a domain, in a way that makes sense to a reader and connects it
+ clearly to the system (or the maker of the system). For example, you might use
+ a `pagerduty.com` prefix for pagerduty related labels, but maybe not
+ `ldap.com` for LDAP labels since it's not directly affiliated with or owned by
+ an LDAP foundation/company/similar.
+- Labels that have no prefix at all, are considered local to your Backstage
+ instance and can be used freely as such, but you should not make use of them
+ outside of your organization. For example, if you were to open source a plugin
+ that generates or consumes labels, then those labels must be properly prefixed
+ with your company domain or a domain that pertains to the label at hand.
+
+## Adding a New Relation Type
+
+Example intents:
+
+> "We have this concept of service maintainership, separate from ownership, that
+> we would like to make relations to individual users for."
+
+> We feel that we want to explicitly model the team-to-global-department mapping
+> as a relation, because it is core to our org setup and we frequently query for
+> it.
+
+Any processor can emit relations for entities as they are being processed, and
+new processors can be added when building the backend catalog using the
+`CatalogBuilder`. They can emit relations based on the entity data itself, or
+based on information gathered from elsewhere. Relations are directed and go from
+a source entity to a target entity. They are also tied to the entity that
+originated them - the one that was subject to processing when the relation was
+emitted. Relations may be dangling (referencing something that does not actually
+exist by that name in the catalog), and callers need to be aware of that.
+
+There is a set of [well-known relations](well-known-relations.md), but you are
+free to emit your own as well. You cannot change the fact that they are directed
+and have a source and target that have to be an
+[entity reference](references.md), but you can invent your own types. You do not
+have to make any changes to the catalog backend in order to accept new relation
+types.
+
+At the time of writing this, we do not have any namespacing/prefixing scheme for
+relation types. The type is also not validated to contain only some particular
+set of characters. Until rules for this are settled, you should stick to using
+only letters, dashes and digits, and to avoid collisions with future core
+relation types, you may want to prefix the type somehow. For example:
+`myCompany-maintainerOf` + `myCompany-maintainedBy`.
+
+If you have a suggestion for a relation type to be elevated to the core
+offering, reach out to the Backstage maintainers or a support partner.
+
+## Using a Well-Known Relation Type for a New Purpose
+
+Example intents:
+
+> "The ownerOf/ownedBy relation types sound like a good fit for expressing how
+> users are technical owners of our company specific ServiceAccount kind, and we
+> want to reuse those relation types for that."
+
+At the time of writing, this is uncharted territory. If the documented use of a
+relation states that one end of the relation commonly is a User or a Group, for
+example, then consumers are likely to have conditional statements on the form
+`if (x.kind === 'User') {} else {}`, which get confused when an unexpected kind
+appears.
+
+If you want to extend the use of an established relation type in a way that has
+an effect outside of your organization, reach out to the Backstage maintainers
+or a support partner to discuss risk/impact. It may even be that one end of the
+relation could be considered for addition to the core.
diff --git a/docs/features/software-catalog/external-integrations.md b/docs/features/software-catalog/external-integrations.md
index 00a9d95fc2..e7d253f11e 100644
--- a/docs/features/software-catalog/external-integrations.md
+++ b/docs/features/software-catalog/external-integrations.md
@@ -1,13 +1,163 @@
---
id: external-integrations
title: External integrations
-description: Documentation on External integrations to integrate systems
-with Backstage
+# prettier-ignore
+description: Documentation on External integrations to integrate systems with Backstage
---
-Backstage natively supports storing software components in
-[metadata YAML files](descriptor-format.md). However, companies that already
-have an existing system for keeping track of software and its owners can
-integrate such systems with Backstage.
+Backstage natively supports importing catalog data through the use of
+[entity descriptor YAML files](descriptor-format.md). However, companies that
+already have an existing system for keeping track of software and its owners can
+leverage those systems by integrating them with Backstage. This article shows
+the most common way of doing that integration: by adding a custom catalog
+_processor_.
-TODO: Describe the API contract.
+## Background
+
+The catalog has a frontend plugin part, that communicates via a service API to
+the backend plugin part. The backend has a processing loop that repeatedly
+ingests data from the sources you specify, to store them in its database.
+
+As a Backstage adopter, you would be able to customize or extend the catalog in
+several ways - by replacing the entire backend API, or by replacing entire
+implementation classes at certain points in the backend, or by leveraging the
+ingestion process to fetch data from your own authoritative source. Each method
+has benefits and drawbacks, but this article will focus on the last one of the
+above. It is the one that is the most straight forward and future proof, and
+leverages a lot of benefits that come with the builtin catalog.
+
+## Processors and the Ingestion Loop
+
+The catalog holds a number of registered locations, that were added either by
+site admins or by individual Backstage users. Their purpose is to reference some
+sort of data that the catalog shall keep itself up to date with. Each location
+has a `type`, and a `target` that are both strings.
+
+```yaml
+# Example location
+type: url
+target: https://github.com/backstage/backstage/blob/master/catalog-info.yaml
+```
+
+The builtin catalog backend has an ingestion loop that periodically goes through
+all of these registered locations, and pushes them and their resulting output
+through the list of _processors_.
+
+Processors are classes that the site admin has registered with the catalog at
+startup. They are at the heart of all catalog logic, and have the ability to
+read the contents of locations, modify in-flight entities that were read out of
+a location, perform validation, and more. The catalog comes with a set of
+builtin processors, that have the ability to read from a list of well known
+location types, to perform the basic processing needs, etc, but more can be
+added by the organization that adopts Backstage.
+
+We will now show the process of creating a new processor and location type,
+which enables the ingestion of catalog data from an existing external API.
+
+## Deciding on the New Locations
+
+The first step is to decide how we want to point at the system that holds our
+data. Let's assume that it is internally named System-X and can be reached
+through HTTP REST calls to its API.
+
+Let's decide that our locations shall take the following form:
+
+```yaml
+type: system-x
+target: http://systemx.services.example.net/api/v2
+```
+
+It got its own made-up `type`, and the `target` conveniently points to the
+actual API endpoint to talk to.
+
+So now we have to make the catalog aware of such a location so that it can start
+feeding it into the ingestion loop. For this kind of an integration, you'd
+typically want to add it to the list of statically always-available locations in
+the config.
+
+```yaml
+# In app-config.yaml
+catalog:
+ locations:
+ - type: system-x
+ target: http://systemx.services.example.net/api/v2
+```
+
+If you start up the backend now, it will start to periodically say that it could
+not find a processor that supports that location. So let's make a processor that
+does so!
+
+## Creating a Catalog Data Reader Processor
+
+The recommended way of instantiating the catalog backend classes is to use the
+[`CatalogBuilder`](https://github.com/backstage/backstage/blob/master/plugins/catalog-backend/src/service/CatalogBuilder.ts),
+as illustrated in the
+[example backend here](https://github.com/backstage/backstage/blob/master/packages/backend/src/plugins/catalog.ts).
+We will create a new
+[`CatalogProcessor`](https://github.com/backstage/backstage/blob/master/plugins/catalog-backend/src/ingestion/types.ts)
+subclass that can be added to this catalog builder.
+
+It is up to you where you put the code for this new processor class. For quick
+experimentation you could place it in your backend package, but we recommend
+putting all extensions like this in a backend plugin package of their own in the
+`plugins` folder of your Backstage repo.
+
+The class will have this basic structure:
+
+```ts
+import { UrlReader } from '@backstage/backend-common';
+import { LocationSpec } from '@backstage/catalog-model';
+import {
+ results,
+ CatalogProcessor,
+ CatalogProcessorEmit,
+} from '@backstage/plugin-catalog-backend';
+
+// A processor that reads from the fictional System-X
+export class SystemXReaderProcessor implements CatalogProcessor {
+ constructor(private readonly reader: UrlReader) {}
+
+ async readLocation(
+ location: LocationSpec,
+ _optional: boolean,
+ emit: CatalogProcessorEmit,
+ ): Promise {
+ // Pick a custom location type string. A location will be
+ // registered later with this type.
+ if (location.type !== 'system-x') {
+ return false;
+ }
+
+ try {
+ // Use the builtin reader facility to grab data from the
+ // API. If you prefer, you can just use plain fetch here
+ // (from the cross-fetch package), or any other method of
+ // your choosing.
+ const data = await this.reader.read(location.target);
+ const json = JSON.parse(data.toString());
+ // Repeatedly call emit(results.entity(location, ))
+ } catch (error) {
+ const message = `Unable to read ${location.type}, ${error}`;
+ emit(results.generalError(location, message));
+ }
+
+ return true;
+ }
+}
+```
+
+The key points to note are:
+
+- Make a class that implements `CatalogProcessor`
+- Only act on location types that you care about, and leave the rest alone by
+ returning `false`
+- Read the data from the external system in any way you see fit. Use the
+ location `target` field if you designed it as mentioned above
+- Call `emit` any number of times with the results of that process
+- Finally return `true`
+
+You should now be able to instantiate this class in your backend, and add it to
+the `CatalogBuilder` using the `addProcessors` method.
+
+Start up the backend - it should now start reading from the previously
+registered location and you'll see your entities start to appear in Backstage.
diff --git a/docs/features/software-catalog/index.md b/docs/features/software-catalog/index.md
index 953540227c..70541b85db 100644
--- a/docs/features/software-catalog/index.md
+++ b/docs/features/software-catalog/index.md
@@ -2,8 +2,8 @@
id: software-catalog-overview
title: Backstage Service Catalog (alpha)
sidebar_label: Overview
-description: The Backstage Service Catalog — actually, a software catalog, since
-it includes more than just services
+# prettier-ignore
+description: The Backstage Service Catalog — actually, a software catalog, since it includes more than just services
---
## What is a Service Catalog?
@@ -33,10 +33,10 @@ More specifically, the Service Catalog enables two main use-cases:
## Getting Started
-The Software Catalog is available to browse on the start page at `/`. If you've
-followed [Installing in your Backstage App](./installation.md) in your separate
-App or [Getting Started with Backstage](../../getting-started) for this repo,
-you should be able to browse the catalog at `http://localhost:3000`.
+The Software Catalog is available to browse at `/catalog`. If you've followed
+[Installing in your Backstage App](./installation.md) in your separate App or
+[Getting Started with Backstage](../../getting-started) for this repo, you
+should be able to browse the catalog at `http://localhost:3000`.

@@ -62,11 +62,11 @@ Users can register new components by going to `/create` and clicking the
Backstage expects the full URL to the YAML in your source control. Example:
```bash
-https://github.com/spotify/backstage/blob/master/packages/catalog-model/examples/artist-lookup-component.yaml
+https://github.com/backstage/backstage/blob/master/packages/catalog-model/examples/components/artist-lookup-component.yaml
```
_More examples can be found
-[here](https://github.com/spotify/backstage/tree/master/packages/catalog-model/examples)._
+[here](https://github.com/backstage/backstage/tree/master/packages/catalog-model/examples)._

@@ -91,7 +91,7 @@ above example can be added using the following configuration:
catalog:
locations:
- type: url
- target: https://github.com/spotify/backstage/blob/master/packages/catalog-model/examples/artist-lookup-component.yaml
+ target: https://github.com/backstage/backstage/blob/master/packages/catalog-model/examples/components/artist-lookup-component.yaml
```
More information about catalog configuration can be found
@@ -135,7 +135,7 @@ in the catalog.

The Backstage platform can be customized by incorporating
-[existing open source plugins](https://github.com/spotify/backstage/tree/master/plugins),
+[existing open source plugins](https://github.com/backstage/backstage/tree/master/plugins),
or by [building your own](../../plugins/index.md).
## Links
diff --git a/docs/features/software-catalog/installation.md b/docs/features/software-catalog/installation.md
index 26990033aa..b2afd62878 100644
--- a/docs/features/software-catalog/installation.md
+++ b/docs/features/software-catalog/installation.md
@@ -56,7 +56,7 @@ The catalog components depend on a number of other
[Utility APIs](../../api/utility-apis.md) to function, including at least the
`ErrorApi` and `StorageApi`. You can find an example of how to install these in
your app
-[here](https://github.com/spotify/backstage/blob/61c3a7e5b750dc7c059ef16b188594d31b2c04c2/packages/app/src/apis.ts#L80).
+[here](https://github.com/backstage/backstage/blob/61c3a7e5b750dc7c059ef16b188594d31b2c04c2/packages/app/src/apis.ts#L80).
## Gotchas that we will fix
@@ -122,6 +122,7 @@ export default async function createPlugin({
entitiesCatalog,
locationsCatalog,
locationReader,
+ db,
logger,
);
@@ -167,21 +168,21 @@ catalog:
locations:
# Backstage Example Component
- type: url
- target: https://github.com/spotify/backstage/blob/master/packages/catalog-model/examples/artist-lookup-component.yaml
+ target: https://github.com/backstage/backstage/blob/master/packages/catalog-model/examples/artist-lookup-component.yaml
- type: url
- target: https://github.com/spotify/backstage/blob/master/packages/catalog-model/examples/playback-order-component.yaml
+ target: https://github.com/backstage/backstage/blob/master/packages/catalog-model/examples/playback-order-component.yaml
- type: url
- target: https://github.com/spotify/backstage/blob/master/packages/catalog-model/examples/podcast-api-component.yaml
+ target: https://github.com/backstage/backstage/blob/master/packages/catalog-model/examples/podcast-api-component.yaml
- type: url
- target: https://github.com/spotify/backstage/blob/master/packages/catalog-model/examples/queue-proxy-component.yaml
+ target: https://github.com/backstage/backstage/blob/master/packages/catalog-model/examples/queue-proxy-component.yaml
- type: url
- target: https://github.com/spotify/backstage/blob/master/packages/catalog-model/examples/searcher-component.yaml
+ target: https://github.com/backstage/backstage/blob/master/packages/catalog-model/examples/searcher-component.yaml
- type: url
- target: https://github.com/spotify/backstage/blob/master/packages/catalog-model/examples/playback-lib-component.yaml
+ target: https://github.com/backstage/backstage/blob/master/packages/catalog-model/examples/playback-lib-component.yaml
- type: url
- target: https://github.com/spotify/backstage/blob/master/packages/catalog-model/examples/www-artist-component.yaml
+ target: https://github.com/backstage/backstage/blob/master/packages/catalog-model/examples/www-artist-component.yaml
- type: url
- target: https://github.com/spotify/backstage/blob/master/packages/catalog-model/examples/shuffle-api-component.yaml
+ target: https://github.com/backstage/backstage/blob/master/packages/catalog-model/examples/shuffle-api-component.yaml
```
### Running the Backend
diff --git a/docs/features/software-catalog/references.md b/docs/features/software-catalog/references.md
index e438ddc977..d347035950 100644
--- a/docs/features/software-catalog/references.md
+++ b/docs/features/software-catalog/references.md
@@ -51,7 +51,7 @@ spec:
type: service
lifecycle: experimental
owner: group:pet-managers
- implementsApis:
+ providesApis:
- petstore
- internal/streetlights
- hello-world
@@ -66,7 +66,7 @@ catalog that is of kind `Group`, namespace `default` (which, actually, also can
be left out in its own yaml file because that's the default value there too),
and name `pet-managers`.
-The entries in `implementsApis` are also references. In this case, none of them
+The entries in `providesApis` are also references. In this case, none of them
needs to specify a kind since we know from the context that that's the only kind
that's supported here. The second entry specifies a namespace but the other ones
don't, and in this context, the default is to refer to the same namespace as the
diff --git a/docs/features/software-catalog/system-model.md b/docs/features/software-catalog/system-model.md
index 44dac13d65..d797e87499 100644
--- a/docs/features/software-catalog/system-model.md
+++ b/docs/features/software-catalog/system-model.md
@@ -8,7 +8,7 @@ We believe that a strong shared understanding and terminology around software
and resources leads to a better Backstage experience.
_This description originates from
-[this RFC](https://github.com/spotify/backstage/issues/390). Note that some of
+[this RFC](https://github.com/backstage/backstage/issues/390). Note that some of
the concepts are not yet supported in Backstage._
## Core Entities
@@ -44,8 +44,8 @@ Backstage model and the primary way to discover existing functionality in the
ecosystem.
APIs are implemented by components and form boundaries between components. They
-might be defined using an RPC IDL (eg Protobuf, GraphQL, ...), a data schema (eg
-Avro, TFRecord, ...), or as code interfaces. In any case, APIs exposed by
+might be defined using an RPC IDL (e.g., Protobuf, GraphQL, ...), a data schema
+(e.g., Avro, TFRecord, ...), or as code interfaces. In any case, APIs exposed by
components need to be in a known machine-readable format so we can build further
tooling and analysis on top.
@@ -113,5 +113,5 @@ Backstage currently supports Components and APIs.
## Links
-- [Original RFC](https://github.com/spotify/backstage/issues/390)
+- [Original RFC](https://github.com/backstage/backstage/issues/390)
- [YAML file format](../../architecture-decisions/adr002-default-catalog-file-format.md)
diff --git a/docs/features/software-catalog/well-known-annotations.md b/docs/features/software-catalog/well-known-annotations.md
index 40a4ca3ea1..3627c74b9a 100644
--- a/docs/features/software-catalog/well-known-annotations.md
+++ b/docs/features/software-catalog/well-known-annotations.md
@@ -2,9 +2,8 @@
id: well-known-annotations
title: Well-known Annotations on Catalog Entities
sidebar_label: Well-known Annotations
-description: Documentation on lists a number of well known Annotations, that
-have defined semantics. They can be attached to catalog entities and consumed
-by plugins as needed
+# prettier-ignore
+description: Documentation that lists a number of well known Annotations, that have defined semantics. They can be attached to catalog entities and consumed by plugins as needed.
---
This section lists a number of well known
@@ -23,7 +22,7 @@ use.
# Example:
metadata:
annotations:
- backstage.io/managed-by-location: github:http://github.com/spotify/backstage/catalog-info.yaml
+ backstage.io/managed-by-location: github:http://github.com/backstage/backstage/catalog-info.yaml
```
The value of this annotation is a so called location reference string, that
@@ -47,7 +46,7 @@ colon is always present.
# Example:
metadata:
annotations:
- backstage.io/techdocs-ref: github:https://github.com/spotify/backstage.git
+ backstage.io/techdocs-ref: github:https://github.com/backstage/backstage.git
```
The value of this annotation is a location reference string (see above). If this
@@ -75,7 +74,7 @@ that entity.
# Example:
metadata:
annotations:
- github.com/project-slug: spotify/backstage
+ github.com/project-slug: backstage/backstage
```
The value of this annotation is the so-called slug that identifies a project on
@@ -93,7 +92,7 @@ that entity.
# Example:
metadata:
annotations:
- github.com/team-slug: spotify/backstage-core
+ github.com/team-slug: backstage/maintainers
```
The value of this annotation is the so-called slug that identifies a team on
@@ -146,7 +145,7 @@ that entity.
# Example:
metadata:
annotations:
- rollbar.com/project-slug: spotify/pump-station
+ rollbar.com/project-slug: backstage/pump-station
```
The value of this annotation is the so-called slug (or alternatively, the ID) of
@@ -158,6 +157,27 @@ fallback (`rollbar.organization` followed by `organization.name`).
Specifying this annotation may enable Rollbar related features in Backstage for
that entity.
+### circleci.com/project-slug
+
+```yaml
+# Example:
+metadata:
+ annotations:
+ circleci.com/project-slug: github/spotify/pump-station
+```
+
+The value of this annotation is the so-called slug (or alternatively, the ID) of
+a [CircleCI](https://circleci.com/) project within your organization. The value
+can be the format of `[source-control-manager]/[organization]/[project-slug]` or
+just `[organization]/[project-slug]`. When the `[source-control-manager]` slug
+is omitted, `bitbucket` will be used as a fallback.
+
+Specifying this annotation will cause the CI/CD features in Backstage to display
+data from CircleCI for that entity.
+
+Providing both the `github.com/project-slug` and `circleci.com/project-slug`
+annotations can cause problems as both may be used for CI/CD features.
+
### backstage.io/ldap-rdn, backstage.io/ldap-uuid, backstage.io/ldap-dn
```yaml
@@ -170,9 +190,41 @@ metadata:
```
The value of these annotations are the corresponding attributes that were found
-when ingestion the entity from LDAP. Not all of them may be present, depending
+when ingesting the entity from LDAP. Not all of them may be present, depending
on what attributes that the server presented at ingestion time.
+### graph.microsoft.com/tenant-id, graph.microsoft.com/group-id, graph.microsoft.com/user-id
+
+```yaml
+# Example:
+metadata:
+ annotations:
+ graph.microsoft.com/tenant-id: 6902611b-ffc1-463f-8af3-4d5285dc057b
+ graph.microsoft.com/group-id: c57e8ba2-6cc4-1039-9ebc-d5f241a7ca21
+ graph.microsoft.com/user-id: 2de244b5-104b-4e8f-a3b8-dce3c31e54b6
+```
+
+The value of these annotations are the corresponding attributes that were found
+when ingesting the entity from the Microsoft Graph API. Not all of them may be
+present, depending on what attributes that the server presented at ingestion
+time.
+
+### sonarqube.org/project-key
+
+```yaml
+# Example:
+metadata:
+ annotations:
+ sonarqube.org/project-key: pump-station
+```
+
+The value of this annotation is the project key of a
+[SonarQube](https://sonarqube.org) or [SonarCloud](https://sonarcloud.io)
+project within your organization.
+
+Specifying this annotation may enable SonarQube related features in Backstage
+for that entity.
+
## Deprecated Annotations
The following annotations are deprecated, and only listed here to aid in
@@ -186,22 +238,9 @@ annotation, with the same value format.
### backstage.io/definition-at-location
-This annotation allowed to load the API definition from another location. Now
-placeholders can be used instead:
-
-```
-apiVersion: backstage.io/v1alpha1
-kind: API
-metadata:
- name: petstore
- description: The Petstore API
-spec:
- type: openapi
- lifecycle: production
- owner: petstore@example.com
- definition:
- $text: https://petstore.swagger.io/v2/swagger.json
-```
+This annotation allowed to load the API definition from another location. Use
+[substitution](./descriptor-format.md#substitutions-in-the-descriptor-format)
+instead.
## Links
diff --git a/docs/features/software-catalog/well-known-relations.md b/docs/features/software-catalog/well-known-relations.md
new file mode 100644
index 0000000000..54f7833d1b
--- /dev/null
+++ b/docs/features/software-catalog/well-known-relations.md
@@ -0,0 +1,93 @@
+---
+id: well-known-relations
+title: Well-known Relations between Catalog Entities
+sidebar_label: Well-known Relations
+# prettier-ignore
+description: Documentation that lists a number of well known Relations, that have defined semantics. They can be attached to catalog entities and consumed by plugins as needed.
+---
+
+This section lists a number of well known
+[entity relation types](descriptor-format.md#common-to-all-kinds-relations),
+that have defined semantics. They can be attached to catalog entities and
+consumed by plugins as needed.
+
+If you are looking to extend the set of relations, see
+[Extending the model](extending-the-model.md).
+
+## Relations
+
+This is a (non-exhaustive) list of relations that are known to be in active use.
+
+Each relation has a _source_ (implicitly: the entity that holds the relation), a
+_target_ (the entity to which the source has a relation), and a _type_ that
+tells what relation the source has with the target. The relation is directional;
+there are commonly pairs of relation types and the entity at the other end will
+have the opposite relation in the opposite direction (e.g. when querying for
+`A`, you will see `A.ownedBy.B`, and when querying `B`, you will see
+`B.ownerOf.A`).
+
+### `ownedBy` and `ownerOf`
+
+An ownership relation where the owner is usually an organizational entity
+([User](descriptor-format.md#kind-user) or
+[Group](descriptor-format.md#kind-group)), and the other entity can be anything.
+
+In Backstage, the owner of an entity is the singular entity (commonly a team)
+that bears ultimate responsibility for the entity, and has the authority and
+capability to develop and maintain it. They will be the point of contact if
+something goes wrong, or if features are to be requested. The main purpose of
+this relation is for display purposes in Backstage, so that people looking at
+catalog entities can get an understanding of to whom this entity belongs. It is
+not to be used by automated processes to for example assign authorization in
+runtime systems. There may be others that also develop or otherwise touch the
+entity, but there will always be one ultimate owner.
+
+This relation is commonly generated based on `spec.owner` of the owned entity,
+where present.
+
+### `providesApi` and `apiProvidedBy`
+
+A relation with an [API](descriptor-format.md#kind-api) entity, typically from a
+[Component](descriptor-format.md#kind-component) or
+[System](descriptor-format.md#kind-system).
+
+These relations express that a component or system exposes an API - meaning that
+it hosts callable endpoints from which you can consume that API.
+
+This relation is commonly generated based on `spec.providesApis` of the
+component or system in question.
+
+### `consumesApi` and `apiConsumedBy`
+
+A relation with an [API](descriptor-format.md#kind-api) entity, typically from a
+[Component](descriptor-format.md#kind-component) or
+[System](descriptor-format.md#kind-system).
+
+These relations express that a component or system consumes an API - meaning
+that it depends on endpoints of the API.
+
+This relation is commonly generated based on `spec.consumesApis` of the
+component or system in question.
+
+### `dependsOn` and `dependencyOf`
+
+A relation denoting a dependency on another entity.
+
+This relation is a general expression of being in need of that other entity for
+an entity to function. It can for example be used to express that a website
+component needs a library component as part of its build, or that a service
+component uses a persistent storage resource.
+
+### `parentOf` and `childOf`
+
+A parent/child relation to build up a tree, used for example to describe the
+organizational structure between [Groups](descriptor-format.md#kind-group).
+
+This relation is commonly based on `spec.parent` and/or `spec.children`.
+
+### `memberOf` and `hasMember`
+
+A membership relation, typically for [Users](descriptor-format.md#kind-user) in
+[Groups](descriptor-format.md#kind-group).
+
+This relation is commonly based on `spec.memberOf`.
diff --git a/docs/features/software-templates/adding-templates.md b/docs/features/software-templates/adding-templates.md
index 75a75003f7..e2b69d6767 100644
--- a/docs/features/software-templates/adding-templates.md
+++ b/docs/features/software-templates/adding-templates.md
@@ -55,6 +55,10 @@ contains more information about the required fields.
Once we have a `template.yaml` ready, we can then add it to the service catalog
for use by the scaffolder.
+_NOTE_: When the `publish` step is completed, it is currently assumed by the
+scaffolder that the final repository should contain a `catalog-info.yaml` in
+order to register this with the Catalog in Backstage.
+
Currently the catalog supports loading definitions from GitHub + Local Files. To
load from other places, not only will there need to be another preparer, but the
support to load the location will also need to be added to the Catalog.
diff --git a/docs/features/software-templates/extending/create-your-own-preparer.md b/docs/features/software-templates/extending/create-your-own-preparer.md
index ef9d709bce..5419748c3a 100644
--- a/docs/features/software-templates/extending/create-your-own-preparer.md
+++ b/docs/features/software-templates/extending/create-your-own-preparer.md
@@ -15,10 +15,10 @@ location protocols:
- `github://`
These two are added to the `PreparersBuilder` and then passed into the
-`createRouter` function of the `@spotify/plugin-scaffolder-backend`.
+`createRouter` function of the `@backstage/plugin-scaffolder-backend`.
A full example backend can be found in
-[`scaffolder.ts`](https://github.com/spotify/backstage/blob/d91c10f654475a60829fa33a5c81018e517a319a/packages/backend/src/plugins/scaffolder.ts),
+[`scaffolder.ts`](https://github.com/backstage/backstage/blob/d91c10f654475a60829fa33a5c81018e517a319a/packages/backend/src/plugins/scaffolder.ts),
but it looks something like the following
```ts
@@ -85,8 +85,8 @@ and put the contents into a temporary directory and return that directory path.
Some good examples exist here:
-- https://github.com/spotify/backstage/blob/master/plugins/scaffolder-backend/src/scaffolder/stages/prepare/file.ts
-- https://github.com/spotify/backstage/blob/master/plugins/scaffolder-backend/src/scaffolder/stages/prepare/github.ts
+- https://github.com/backstage/backstage/blob/master/plugins/scaffolder-backend/src/scaffolder/stages/prepare/file.ts
+- https://github.com/backstage/backstage/blob/master/plugins/scaffolder-backend/src/scaffolder/stages/prepare/github.ts
### Registering your own Preparer
diff --git a/docs/features/software-templates/extending/create-your-own-publisher.md b/docs/features/software-templates/extending/create-your-own-publisher.md
index 546980f033..97854c999a 100644
--- a/docs/features/software-templates/extending/create-your-own-publisher.md
+++ b/docs/features/software-templates/extending/create-your-own-publisher.md
@@ -18,11 +18,11 @@ Currently we provide the following `publishers`:
- `github`
This publisher is passed through to the `createRouter` function of the
-`@spotify/plugin-scaffolder-backend`. Currently, only one publisher is
+`@backstage/plugin-scaffolder-backend`. Currently, only one publisher is
supported, but PR's are always welcome.
An full example backend can be found
-[here](https://github.com/spotify/backstage/blob/d91c10f654475a60829fa33a5c81018e517a319a/packages/backend/src/plugins/scaffolder.ts),
+[here](https://github.com/backstage/backstage/blob/d91c10f654475a60829fa33a5c81018e517a319a/packages/backend/src/plugins/scaffolder.ts),
but it looks something like the following
```ts
@@ -82,7 +82,7 @@ Now it's up to you to implement the `publish` function and return
Some good examples exist here:
-- https://github.com/spotify/backstage/blob/master/plugins/scaffolder-backend/src/scaffolder/stages/publish/github.ts
+- https://github.com/backstage/backstage/blob/master/plugins/scaffolder-backend/src/scaffolder/stages/publish/github.ts
### Registering your own Publisher
diff --git a/docs/features/software-templates/extending/create-your-own-templater.md b/docs/features/software-templates/extending/create-your-own-templater.md
index d4a6eef5d2..63acd38286 100644
--- a/docs/features/software-templates/extending/create-your-own-templater.md
+++ b/docs/features/software-templates/extending/create-your-own-templater.md
@@ -17,10 +17,10 @@ Currently we provide the following templaters:
- `cookiecutter`
This templater is added to the `TemplaterBuilder` and then passed into the
-`createRouter` function of the `@spotify/plugin-scaffolder-backend`
+`createRouter` function of the `@backstage/plugin-scaffolder-backend`
An full example backend can be found
-[here](https://github.com/spotify/backstage/blob/d91c10f654475a60829fa33a5c81018e517a319a/packages/backend/src/plugins/scaffolder.ts),
+[here](https://github.com/backstage/backstage/blob/d91c10f654475a60829fa33a5c81018e517a319a/packages/backend/src/plugins/scaffolder.ts),
but it looks something like the following
```ts
@@ -96,7 +96,7 @@ Now it's up to you to implement the `run` function, and then return a
Some good examples exist here:
-- https://github.com/spotify/backstage/blob/master/plugins/scaffolder-backend/src/scaffolder/stages/templater/cookiecutter.ts
+- https://github.com/backstage/backstage/blob/master/plugins/scaffolder-backend/src/scaffolder/stages/templater/cookiecutter.ts
### Registering your own Templater
diff --git a/docs/features/software-templates/extending/index.md b/docs/features/software-templates/extending/index.md
index 944bf0e3ca..aaf42d6b12 100644
--- a/docs/features/software-templates/extending/index.md
+++ b/docs/features/software-templates/extending/index.md
@@ -51,7 +51,7 @@ passed through to the scaffolder backend.
### How it works
Most of the heavy lifting is done in the
-[router.ts](https://github.com/spotify/backstage/blob/master/plugins/scaffolder-backend/src/service/router.ts#L93)
+[router.ts](https://github.com/backstage/backstage/blob/master/plugins/scaffolder-backend/src/service/router.ts#L93)
file in the `scaffolder-backend` plugin.
There are two routes defined in the router: `POST /v1/jobs` and
diff --git a/docs/features/software-templates/installation.md b/docs/features/software-templates/installation.md
index bac5f60789..724b86aed1 100644
--- a/docs/features/software-templates/installation.md
+++ b/docs/features/software-templates/installation.md
@@ -156,11 +156,11 @@ catalog:
locations:
# Backstage Example Templates
- type: url
- target: https://github.com/spotify/backstage/blob/master/plugins/scaffolder-backend/sample-templates/react-ssr-template/template.yaml
+ target: https://github.com/backstage/backstage/blob/master/plugins/scaffolder-backend/sample-templates/react-ssr-template/template.yaml
- type: url
- target: https://github.com/spotify/backstage/blob/master/plugins/scaffolder-backend/sample-templates/springboot-grpc-template/template.yaml
+ target: https://github.com/backstage/backstage/blob/master/plugins/scaffolder-backend/sample-templates/springboot-grpc-template/template.yaml
- type: url
- target: https://github.com/spotify/backstage/blob/master/plugins/scaffolder-backend/sample-templates/create-react-app/template.yaml
+ target: https://github.com/backstage/backstage/blob/master/plugins/scaffolder-backend/sample-templates/create-react-app/template.yaml
- type: url
target: https://github.com/spotify/cookiecutter-golang/blob/master/template.yaml
```
diff --git a/docs/features/techdocs/FAQ.md b/docs/features/techdocs/FAQ.md
index e81e9d82c7..de424778cb 100644
--- a/docs/features/techdocs/FAQ.md
+++ b/docs/features/techdocs/FAQ.md
@@ -17,14 +17,12 @@ This page answers frequently asked questions about [TechDocs](README.md).
TechDocs is using [MkDocs](https://www.mkdocs.org/) to build project
documentation under the hood. Documentation built with the
-[techdocs-container](https://github.com/spotify/backstage/blob/master/packages/techdocs-container/README.md)
-is using the MkDocs
-[Material Theme](https://github.com/squidfunk/mkdocs-material).
+[techdocs-container](https://github.com/backstage/techdocs-container) is using
+the MkDocs [Material Theme](https://github.com/squidfunk/mkdocs-material).
#### What is the mkdocs-techdocs-core plugin?
-The
-[mkdocs-techdocs-core](https://github.com/spotify/backstage/blob/master/packages/techdocs-container/techdocs-core/README.md)
+The [mkdocs-techdocs-core](https://github.com/backstage/mkdocs-techdocs-core)
package is a MkDocs Plugin that works like a wrapper around multiple MkDocs
plugins (e.g.
[MkDocs Monorepo Plugin](https://github.com/spotify/mkdocs-monorepo-plugin)) as
diff --git a/docs/features/techdocs/README.md b/docs/features/techdocs/README.md
index e2b81b4a53..f4e89d8f6f 100644
--- a/docs/features/techdocs/README.md
+++ b/docs/features/techdocs/README.md
@@ -40,12 +40,10 @@ about TechDocs and the philosophy in its
| [TechDocs V.2 🔮⌛][v2] | Easy adoption of TechDocs (whatever environment you have) [See V.2 Use Cases.](#techdocs-v2) |
| [TechDocs V.3 🔮⌛][v3] | Build a widget (plugin) framework so that contributors can easily contribute features to TechDocs - that others can use. [See V.3 Use Cases.](#techdocs-v3) |
-[v0]: https://github.com/spotify/backstage/milestone/15
-[v1]: https://github.com/spotify/backstage/milestone/16
-[v2]: https://github.com/spotify/backstage/milestone/22
-[v3]: https://github.com/spotify/backstage/milestone/17
-
-
+[v0]: https://github.com/backstage/backstage/milestone/15
+[v1]: https://github.com/backstage/backstage/milestone/16
+[v2]: https://github.com/backstage/backstage/milestone/22
+[v3]: https://github.com/backstage/backstage/milestone/17
## Use Cases
@@ -96,31 +94,53 @@ Build a widget (plugin) framework so that contributors can easily contribute
features to TechDocs - that others can use. And, also, so that we can easily
migrate Spotify's existing TechDocs features to open source.
-## Structure
+## Platforms Supported
-- [Getting Started]
-- [Concepts]
-- [Creating and Publishing Documentation]
-- [FAQ]
+See [TechDocs Architecture](architecture.md) to get an overview of where these
+providers are used.
+
+| Source Code Hosting Provider | Support Status |
+| ---------------------------- | -------------- |
+| GitHub | Yes ✅ |
+| GitHub Enterprise | Yes ✅ |
+| BitBucket | Yes ✅ |
+| Azure DevOps | Yes ✅ |
+| GitLab | Yes ✅ |
+| GitLab Enterprise | Yes ✅ |
+
+| File Storage Provider | Support Status | Track status |
+| --------------------------------- | -------------- | ----------------------------------------------------------- |
+| Local Filesystem of Backstage app | Yes ✅ | |
+| Google Cloud Storage (GCS) | Yes ✅ | |
+| Amazon Web Services (AWS) S3 | No ❌ | [#3714](https://github.com/backstage/backstage/issues/3714) |
+| Azure Storage | No ❌ | |
+
+[Reach out to us](#feedback) if you want to request more platforms.
## Tech Stack
-| Stack | Location |
-| ------------------------------------------- | -------------------------------------------------------- |
-| Frontend | [`@backstage/plugin-techdocs`][techdocs/frontend] |
-| Backend | [`@backstage/plugin-techdocs-backend`][techdocs/backend] |
-| Docker Container (for generating doc sites) | [`packages/techdocs-container`][techdocs/container] |
-| CLI (for local development) | [`packages/techdocs-cli`][techdocs/cli] |
+| Stack | Location |
+| ----------------------------------------------- | -------------------------------------------------------- |
+| Frontend Plugin | [`@backstage/plugin-techdocs`][techdocs/frontend] |
+| Backend Plugin | [`@backstage/plugin-techdocs-backend`][techdocs/backend] |
+| CLI (for local development and generating docs) | [`@techdocs/cli`][techdocs/cli] |
+| Docker Container (for generating docs) | [`techdocs-container`][techdocs/container] |
-[getting started]: getting-started.md
-[concepts]: concepts.md
-[creating and publishing documentation]: creating-and-publishing.md
-[faq]: FAQ.md 'Frequently asked questions'
[techdocs/frontend]:
- https://github.com/spotify/backstage/blob/master/plugins/techdocs
+ https://github.com/backstage/backstage/blob/master/plugins/techdocs
[techdocs/backend]:
- https://github.com/spotify/backstage/blob/master/plugins/techdocs-backend
-[techdocs/container]:
- https://github.com/spotify/backstage/blob/master/packages/techdocs-container
-[techdocs/cli]:
- https://github.com/spotify/backstage/blob/master/packages/techdocs-cli
+ https://github.com/backstage/backstage/blob/master/plugins/techdocs-backend
+[techdocs/container]: https://github.com/backstage/techdocs-container
+[techdocs/cli]: https://github.com/backstage/techdocs-cli
+
+## Feedback
+
+We have created a sweet and short TechDocs user survey -
+https://docs.google.com/forms/d/e/1FAIpQLSdn5Vn3MQhCdyYRuW8cMzZkMQF0bFxXYN168gZRvESLfJWVVg/viewform
+
+This is to gather inputs from you (the Backstage community) which will help us
+best serve TechDocs adopters and existing users. Your inputs will shape our
+roadmap and we will share it in the open.
+
+For any other general queries, reach out to us in the `#docs-like-code` channel
+of our [Discord chatroom](https://github.com/backstage/backstage#community).
diff --git a/docs/features/techdocs/architecture.md b/docs/features/techdocs/architecture.md
index 926ec238e1..7c35fbc943 100644
--- a/docs/features/techdocs/architecture.md
+++ b/docs/features/techdocs/architecture.md
@@ -1,7 +1,153 @@
---
id: architecture
-title: Architecture
-description: Documentation on Architecture
+title: TechDocs Architecture
+description: Documentation on TechDocs Architecture
---
-
+## Basic (out-of-the-box)
+
+When you deploy Backstage (with TechDocs enabled by default), you get a basic
+out-of-the box experience.
+
+
+
+> Note: See below for our recommended deployment architecture which takes care
+> of stability, scalability and speed.
+
+When you open a TechDocs site in Backstage, the
+[TechDocs Reader](./concepts.md#techdocs-reader) makes a request to
+`techdocs-backend` with the entity ID and the path of the current page you are
+looking at. In response, it receives the static files (HTML, CSS, JSON, etc.) to
+render on the page in TechDocs/Backstage.
+
+The static files consist of HTML, CSS and Images generated by MkDocs. We remove
+all the JavaScript before adding them to Backstage for security reasons. And
+there are some additional techdocs metadata JSON files that TechDocs needs to
+render a site.
+
+The TechDocs Reader then applies a list of "Transformers" (see
+[Concepts](./concepts.md)) which modify the generated static HTML files for a
+number of use cases e.g. Remove certain headers, filter out some HTML tags, etc.
+
+Currently, we use the Backstage server's (or techdocs-backend's) local file
+system to store the generated files. Publishing to an external storage system
+(AWS S3, GCS, etc.) is also possible, but has not been implemented yet.
+
+A word about `UrlReader` vs Git preparer - Right now, we have two ways to fetch
+files from its source repository for docs site generation. 1. By using Git
+and 2. By directly using Source control (GitHub, Azure, etc.) APIs. This work is
+heavily in progress. Please reach out to us on Discord in the #docs-like-code
+channel to talk about it.
+
+## Recommended deployment
+
+This is how we recommend deploying TechDocs in production environment.
+
+
+
+The key difference in the recommended deployment approach is where the docs are
+built.
+
+We assume each entity lives in a repository somewhere (GitHub, GitLab, etc.). We
+recommend using a CI/CD pipeline with the repository that has a dedicated
+step/job to generate docs for TechDocs. The generated static files are then
+stored in a cloud storage solution of your choice.
+[Track progress here](https://github.com/backstage/backstage/issues/3096).
+
+Similar to how it is done in the Basic setup, the TechDocs Reader requests
+`techdocs-backend` plugin for the docs site. `techdocs-backend` then requests
+your configured storage solution for the necessary files and returns them to
+TechDocs Reader.
+
+We will provide instructions, scripts and/or templates (e.g. GitHub Actions) to
+generate docs in your CI/CD system.
+[Track progress here.](https://github.com/backstage/backstage/issues/3400) You
+will be able to use `techdocs-cli` to generate docs and publish the generated
+docs site files to your cloud storage system.
+
+Note about caching: We have noticed internally that some storage providers can
+be quite slow, which is why we are recommending a cache that sits between the
+TechDocs Reader and the Storage.
+
+_Feel free to suggest better ideas to us in #docs-like-code channel in Discord
+or via a GitHub issue._
+
+### Security consideration
+
+Our biggest security concern is managing the access to the docs in the cloud
+storage. We also want to have only one security solution for all different types
+of storage (GCS, AWS, custom SFTP server, etc.) Restricting access to the
+storage and only allowing `techdocs-backend` to fetch files is a good way to
+achieve this.
+
+This would also allow us to use the access control management Backstage when
+that is ready.
+[Track progress here.](https://github.com/backstage/backstage/issues/3218)
+
+In theory, you can directly enable TechDocs Reader to read from your storage.
+But, you will have to think about how to do it without the docs being public and
+how access to user groups is managed.
+
+For cloud storage access tokens, `techdocs-backend` only needs a token with Read
+permissions. But in your CI/CD system, there needs to be a token with Write
+permissions to publish the generated docs site files.
+
+## FAQs
+
+**Q: Why do you have separate "basic" and "recommended" deployment approaches?**
+
+A: The basic or out-of-the-box setup is what you get when you create a new app
+or do a git clone of the Backstage repository. We want the first experience to
+_just work magically_ so that you can have your first experience with TechDocs
+which is smooth. However, if you decide to deploy Backstage/TechDocs for
+production use, the basic setup would work but there are going to be downsides
+as you scale with the number of documentation sites and sizes of them. So you
+would want to make sure the deployment is as stable as possible. Hence there is
+a recommended approach. There can be even more deployment approaches to TechDocs
+and we welcome such "Alternative" ideas from the community.
+
+**Q: Why don't you recommend techdocs-backend local filesystem to serve static
+files?**
+
+A: It would make scaling a Backstage instance harder. Think about the case where
+we have distributed Backstage deployments. Using a separate file storage system
+for TechDocs makes it easier to do some operations like delete a docs site and
+wipe its contents.
+
+**Q: Why aren't docs built on the fly i.e. when users visits a page, generate
+docs site in real-time?**
+
+A: Generating the content from Markdown on the fly is not optimal (although that
+is how the basic out-of-the-box setup is implemented). Storage solutions act as
+a cache for the generated static content. TechDocs is also currently built on
+MkDocs which does not allow us to generate docs per-page, so we would have to
+build all docs for a entity on every request.
+
+# Future work
+
+_Ideas here are far fetched and not in the project's milestone for near future
+(~6 months)._
+
+We currently depend on MkDocs to parse doc sites written in Markdown. And we
+store the generated static assets and re-use it later to render in Backstage. A
+better (futuristic) approach will be to directly parse whatever type of source
+files you have in your docs repository and directly render in Backstage in
+real-time.
+
+# Features status
+
+Status of all the features mentioned above.
+
+**In place ✅**
+
+- Basic setup with techdocs-backend file server as storage.
+- Basic setup with cloud storage solution.
+
+**Work in progress 🚧**
+
+- `techdocs-cli` is able to generate docs in CI/CD environment.
+- `techdocs-cli` is able to publish docs site to any storage.
+
+**Not implemented yet ❌**
+
+- `techdocs-backend` integration with Backstage access control management.
diff --git a/docs/features/techdocs/concepts.md b/docs/features/techdocs/concepts.md
index 13144f8df0..26254a7e12 100644
--- a/docs/features/techdocs/concepts.md
+++ b/docs/features/techdocs/concepts.md
@@ -8,42 +8,71 @@ Spotify's docs-like-code solution in Backstage
This page describes concepts that are introduced with Spotify's docs-like-code
solution in Backstage.
-### TechDocs Core Plugin
+## Generating TechDocs Steps
-The TechDocs Core Plugin is an [MkDocs](https://www.mkdocs.org/) plugin created
-as a wrapper around multiple MkDocs plugins and Python Markdown extensions to
-standardize the configuration of MkDocs used for TechDocs.
+### TechDocs Preparer
-[TechDocs Core](https://github.com/spotify/backstage/blob/master/packages/techdocs-container/techdocs-core/README.md)
+Preparing is the first step of generating documentation for an entity. It
+fetches the source markdown files from the source code hosting provider (GitHub,
+GitLab, etc.) and passes the files to the generator for next steps.
-### TechDocs container
+There are two kinds of preparers available -
+
+1. Common Git Preparer - Uses `git clone` on any repository url.
+2. Url Reader - Uses source code hosting provider's API to download files.
+ (Faster and recommended)
+
+### TechDocs Generator
+
+Generating is the second step after preparing the markdown source files. This
+step either runs the TechDocs container (defined below) or runs `mkdocs` CLI to
+generate static HTML files and its assets.
+
+### TechDocs Publisher
+
+Publishing is the third and final step after preparing and generating docs.
+TechDocs Publisher uploads the generated files to a storage.
+
+The `techdocs-backend` plugin currently comes with two publishers - Google Cloud
+Storage and Local Filesystem. You can configure them in your Backstage app.
+[See here](./configuration.md).
+
+A TechDocs publisher is responsible for two things (two-way communication
+between `techdocs-backend` and the storage)
+
+1. Publish generated static files to a storage (Configured by
+ `techdocs.builder`)
+2. Read files from the storage when users visit a TechDocs site
+
+[TechDocs Backend](https://github.com/backstage/backstage/tree/master/plugins/techdocs-backend)
+
+## TechDocs Container
The TechDocs container is a Docker container available at
[DockerHub](https://hub.docker.com/r/spotify/techdocs). It builds static HTML
pages, including stylesheets and scripts from Python flavored Markdown, through
MkDocs.
-[TechDocs Container](https://github.com/spotify/backstage/blob/master/packages/techdocs-container/README.md)
+[TechDocs Container](https://github.com/backstage/techdocs-container)
-### TechDocs publisher
+## TechDocs Core Plugin
-The `techdocs-backend` plugin currently comes with one publisher -
-`LocalPublish`.
+The TechDocs Core Plugin is an [MkDocs](https://www.mkdocs.org/) plugin created
+as a wrapper around multiple MkDocs plugins and Python Markdown extensions to
+standardize the configuration of MkDocs used for TechDocs.
-[TechDocs Backend](https://github.com/spotify/backstage/tree/master/plugins/techdocs-backend)
+[TechDocs Core](https://github.com/backstage/mkdocs-techdocs-core)
-More standalone publishers will come in the near future...
-
-### TechDocs CLI
+## TechDocs CLI
The TechDocs CLI was created to make it easy to write, generate and preview
documentation for publishing. Currently it mostly acts as a wrapper around the
TechDocs container and provides an easy-to-use interface for our docker
container.
-[TechDocs CLI](https://github.com/spotify/backstage/blob/master/packages/techdocs-cli/README.md)
+[TechDocs CLI](https://github.com/backstage/techdocs-cli)
-### TechDocs Reader
+## TechDocs Reader
Documentation generated by TechDocs is generated as static HTML sites. The
TechDocs Reader was therefore created to be able to integrate pre-generated HTML
@@ -53,13 +82,13 @@ The TechDocs Reader purpose is also to open up the opportunity to integrate
TechDocs widgets for a customized full-featured TechDocs experience.
([coming soon V.3](./README.md#project-roadmap))
-[TechDocs Reader](https://github.com/spotify/backstage/blob/master/plugins/techdocs/src/reader/README.md)
+[TechDocs Reader](https://github.com/backstage/backstage/blob/master/plugins/techdocs/src/reader/README.md)
-### Transformers
+## Transformers
Transformers are different pieces of functionality used inside the TechDocs
Reader. The reason why transformers were introduced was to provide a way to
transform the HTML content on pre and post render (e.g. rewrite docs links or
modify css).
-[Transformers API docs](https://github.com/spotify/backstage/blob/master/plugins/techdocs/src/reader/README.md)
+[Transformers API docs](https://github.com/backstage/backstage/blob/master/plugins/techdocs/src/reader/README.md)
diff --git a/docs/features/techdocs/configuration.md b/docs/features/techdocs/configuration.md
new file mode 100644
index 0000000000..b3cb349778
--- /dev/null
+++ b/docs/features/techdocs/configuration.md
@@ -0,0 +1,73 @@
+---
+id: configuration
+title: TechDocs Configuration Options
+description:
+ Reference documentation for configuring TechDocs using app-config.yaml
+---
+
+Using the `app-config.yaml` in the Backstage app, you can configure TechDocs
+using several options. This page serves as a reference to all the available
+configuration options for TechDocs.
+
+```yaml
+# File: app-config.yaml
+
+techdocs:
+
+ # TechDocs makes API calls to techdocs-backend using this URL. e.g. get docs of an entity, get metadata, etc.
+
+ requestUrl: http://localhost:7000/api/techdocs
+
+
+ # Just another route in techdocs-backend where TechDocs requests the static files from. This URL uses an HTTP middleware
+ # to serve files from either a local directory or an External storage provider.
+
+ storageUrl: http://localhost:7000/api/techdocs/static/docs
+
+
+ # generators.techdocs can have two values: 'docker' or 'local'. This is to determine how to run the generator - whether to
+ # spin up the techdocs-container docker image or to run mkdocs locally (assuming all the dependencies are taken care of).
+ # You want to change this to 'local' if you are running Backstage using your own custom Docker setup and want to avoid running
+ # into Docker in Docker situation. Read more here
+ # https://backstage.io/docs/features/techdocs/getting-started#disable-docker-in-docker-situation-optional
+
+ generators:
+ techdocs: 'docker'
+
+
+ # techdocs.builder can be either 'local' or 'external.
+ # If builder is set to 'local' and you open a TechDocs page, techdocs-backend will try to generate the docs, publish to storage
+ # and show the generated docs afterwords. This is the "Basic" setup of the TechDocs Architecture.
+ # If builder is set to 'external', techdocs-backend will only fetch the docs and will NOT try to generate and publish. In this case of 'external',
+ # we assume that docs are being built by an external process (e.g. in the CI/CD pipeline of the repository). This is the "Recommended" setup of
+ # the architecture. Read more here https://backstage.io/docs/features/techdocs/architecture
+
+ builder: 'local'
+
+
+ # techdocs.publisher is used to configure the Storage option, whether you want to use the local filesystem to store generated docs
+ # or you want to use External storage providers like Google Cloud Storage, AWS S3, etc.
+
+ publisher:
+
+ # techdocs.publisher.type can be - 'local' or 'googleGcs' (awsS3, azureStorage, etc. to be available as well).
+ # When set to 'local', techdocs-backend will create a 'static' directory at its root to store generated documentation files.
+ # When set to 'googleGcs', techdocs-backend will use a Google Cloud Storage Bucket to store generated documentation files.
+
+ type: 'local'
+
+
+ # Required when techdocs.publisher.type is set to 'googleGcs'. Skip otherwise.
+
+ googleGcs:
+ # An API key is required to write to a storage bucket.
+ credentials:
+ $file: '/path/to/google_application_credentials.json',
+
+ # Your GCP Project ID where the Cloud Storage Bucket is hosted.
+ projectId: 'gcp-project-id'
+
+ # Cloud Storage Bucket Name
+ bucketName: 'techdocs-storage',
+
+```
diff --git a/docs/features/techdocs/creating-and-publishing.md b/docs/features/techdocs/creating-and-publishing.md
index 38f452dcf3..187fe97aed 100644
--- a/docs/features/techdocs/creating-and-publishing.md
+++ b/docs/features/techdocs/creating-and-publishing.md
@@ -41,7 +41,7 @@ setup for free.
### Manually add documentation setup to already existing repository
-Prerequisities:
+Prerequisites:
- An existing component
[registered in backstage](../software-catalog/index.md#adding-components-to-the-catalog)
diff --git a/docs/features/techdocs/getting-started.md b/docs/features/techdocs/getting-started.md
index 72efb6eee0..e1ddfd23f9 100644
--- a/docs/features/techdocs/getting-started.md
+++ b/docs/features/techdocs/getting-started.md
@@ -1,7 +1,7 @@
---
id: getting-started
title: Getting Started
-description: Getting Started Guidelines
+description: Getting Started Documentation
---
TechDocs functions as a plugin to Backstage, so you will need to use Backstage
@@ -10,50 +10,147 @@ to use TechDocs.
If you haven't setup Backstage already, start
[here](../../getting-started/index.md).
-## Installing TechDocs
+> If you used `npx @backstage/create-app`, TechDocs may already be present.
+>
+> You should skip to [`Setting the Configuration`](#setting-the-configuration)
+> below.
-TechDocs is provided with the Backstage application by default. If you want to
-set up TechDocs manually, keep following the instructions below.
-
-### Adding the package
+## Adding TechDocs frontend plugin
The first step is to add the TechDocs plugin to your Backstage application.
-Navigate to your new Backstage application folder:
-
-```bash
-cd hello-world/
-```
-
-Then navigate to your `packages/app` folder to install TechDocs:
+Navigate to your new Backstage application directory. And then to your
+`packages/app` directory, and install the `@backstage/plugin-techdocs` package.
```bash
+cd my-backstage-app/
cd packages/app
yarn add @backstage/plugin-techdocs
```
-After a short while, the TechDocs plugin should be successfully installed.
+Once the package has been installed, you need to import the plugin in your app.
-Next, you need to set up some basic configuration. Enter the following command:
-
-```bash
-yarn install
-```
-
-Add this to `packages/app/src/plugins.ts`:
+Add the following to `packages/app/src/plugins.ts`:
```typescript
export { plugin as TechDocs } from '@backstage/plugin-techdocs';
```
-### Setting the configuration
+Now let us embed the TechDocs router in our main Backstage frontend router. In
+`packages/app/src/App.tsx`, import the TechDocs router and add the following to
+`AppRoutes`:
-TechDocs allows for configuration of the docs storage URL through your
-`app-config.yaml` file. We provide two different values to be configured,
-`requestUrl` and `storageUrl`. The `requestUrl` is what the reader will request
-its data from, and `storageUrl` is where the backend can find the stored
-documentation.
+```tsx
+import { Router as DocsRouter } from '@backstage/plugin-techdocs';
-The default storage and request URLs:
+// ...
+
+const AppRoutes = () => {
+
+ // ... other plugin routes
+ } />
+ ;
+};
+```
+
+That's it! But now, we need the TechDocs Backend plugin for the frontend to
+work.
+
+## Adding TechDocs Backend plugin
+
+Navigate to `packages/backend` of your Backstage app, and install the
+`@backstage/plugin-techdocs-backend` package.
+
+```bash
+cd my-backstage-app/
+cd packages/backend
+yarn add @backstage/plugin-techdocs-backend
+```
+
+Create a file called `techdocs.ts` inside `packages/backend/src/plugins/` and
+add the following
+
+```typescript
+import {
+ createRouter,
+ Preparers,
+ Generators,
+ Publisher,
+} from '@backstage/plugin-techdocs-backend';
+import { PluginEnvironment } from '../types';
+import Docker from 'dockerode';
+
+export default async function createPlugin({
+ logger,
+ config,
+ discovery,
+ reader,
+}: PluginEnvironment) {
+ // Preparers are responsible for fetching source files for documentation.
+ const preparers = await Preparers.fromConfig(config, {
+ logger,
+ reader,
+ });
+
+ // Generators are used for generating documentation sites.
+ const generators = await Generators.fromConfig(config, {
+ logger,
+ });
+
+ // Publisher is used for
+ // 1. Publishing generated files to storage
+ // 2. Fetching files from storage and passing them to TechDocs frontend.
+ const publisher = await Publisher.fromConfig(config, {
+ logger,
+ discovery,
+ });
+
+ // Docker client (conditionally) used by the generators, based on techdocs.generators config.
+ const dockerClient = new Docker();
+
+ return await createRouter({
+ preparers,
+ generators,
+ publisher,
+ dockerClient,
+ logger,
+ config,
+ discovery,
+ });
+}
+```
+
+You may need to install the `dockerode` package. But you may already have it in
+your backend since [Scaffolder plugin](../software-templates/index.md) also uses
+it.
+
+See [Concepts](concepts.md) and [TechDocs Architecture](architecture.md) to
+learn more about how preparers, generators and publishers work.
+
+Final step is to import the techdocs backend plugin in Backstage app backend.
+Add the following to your `packages/backend/src/index.ts`:
+
+```typescript
+import techdocs from './plugins/techdocs';
+
+// .... main should already be present.
+async function main() {
+ // ... other backend plugin envs
+ const techdocsEnv = useHotMemoize(module, () => createEnv('techdocs'));
+
+ // ... other backend plugin routes
+ apiRouter.use('/techdocs', await techdocs(techdocsEnv));
+}
+```
+
+That's it! TechDocs frontend and backend have now been added to your Backstage
+app. Now let us tweak some configurations to suit your needs.
+
+## Setting the configuration
+
+**See [TechDocs Configuration Options](configuration.md) for complete
+configuration reference.**
+
+### Setting TechDocs URLs
```yaml
techdocs:
@@ -61,22 +158,59 @@ techdocs:
requestUrl: http://localhost:7000/api/techdocs/
```
-If you want `techdocs-backend` to manage building and publishing, you want
-`requestUrl` to point to the default value (or wherever `techdocs-backend` is
-hosted). `storageUrl` should be where your publisher publishes your docs. Using
-the default `LocalPublish` that is the default value.
+`requestUrl` is used by TechDocs frontend plugin to discover techdocs-backend
+endpoints, and the `storageUrl` is another endpoint in `techdocs-backend` which
+acts as a middleware between TechDocs and the storage (where the static
+generated docs site are stored). These default values should mostly work for
+you. These options will soon be optional to set.
-If you have a setup where you are not using `techdocs-backend` for managing
-building and publishing of your documentation, you want to change the
-`requestUrl` to point to your storage. In this case `storageUrl` is not
-required.
+### Should TechDocs Backend generate docs?
-### Disable Docker in Docker situation (Optional)
+```yaml
+techdocs:
+ storageUrl: http://localhost:7000/api/techdocs/static/docs
+ requestUrl: http://localhost:7000/api/techdocs/
+ builder: 'local'
+```
-The TechDocs backend plugin runs a docker container with mkdocs to generate the
-frontend of the docs from source files (Markdown). If you are deploying
-Backstage using Docker, this will mean that your Backstage Docker container will
-try to run another Docker container for TechDocs backend.
+Set `techdocs.builder` to `'local'` if you want your TechDocs Backend to be
+responsible for generating documentation sites. If set to `'external'`,
+Backstage will assume that the sites are being generated on each entity's CI/CD
+pipeline, and are being stored in a storage somewhere.
+
+When `techdocs.builder` is set to `'external'`, TechDocs becomes more or less a
+read-only experience where it serves static files from a storage containing all
+the generated documentation. Read more in the "Basic" and "Recommended" setup of
+TechDocs [here](architecture.md)
+
+### Choosing storage (publisher)
+
+TechDocs needs to know where to store generated documentation sites and where to
+fetch the sites from. This is managed by a
+[Publisher](./concepts.md#techdocs-publisher). Examples: Google Cloud Storage,
+Amazon S3, or local filesystem of Backstage server.
+
+It is okay to use the local filesystem in a "Basic" setup when you are trying
+out Backstage for the first time. Using Cloud Storage is documented
+[here](./using-cloud-storage.md).
+
+```yaml
+techdocs:
+ storageUrl: http://localhost:7000/api/techdocs/static/docs
+ requestUrl: http://localhost:7000/api/techdocs/
+ builder: 'local'
+ publisher:
+ type: 'local'
+```
+
+### Disabling Docker in Docker situation (Optional)
+
+You can skip this if your `techdocs.builder` is set to `'external'`.
+
+The TechDocs Backend plugin runs a docker container with mkdocs installed to
+generate the frontend of the docs from source files (Markdown). If you are
+deploying Backstage using Docker, this will mean that your Backstage Docker
+container will try to run another Docker container for TechDocs Backend.
To avoid this problem, we have a configuration available. You can set a value in
your `app-config.yaml` that tells the techdocs generator if it should run the
@@ -90,28 +224,31 @@ techdocs:
```
Setting `generators.techdocs` to `local` means you will have to make sure your
-environment is compatible with techdocs. You will have to install the
-`mkdocs-techdocs-container` and 'mkdocs' package from pip, as well as graphviz
-and plantuml from your package manager. This has only been tested with python
-3.7 and python 3.8.
+environment is compatible with techdocs.
-## Run Backstage locally
+You will have to install the `mkdocs` and `mkdocs-techdocs-core` package from
+pip, as well as `graphviz` and `plantuml` from your OS package manager (e.g.
+apt). See our
+[Dockerfile](https://github.com/backstage/techdocs-container/blob/main/Dockerfile)
+for the latest requirements. You should be trying to match your Dockerfile with
+this one.
-Change folder to `/packages/backend` and run the
-following command:
+Note: We recommend Python version 3.7 or higher.
-```bash
-yarn start
-```
+Caveat: Please install the `mkdocs-techdocs-core` package after all other Python
+packages. The order is important to make sure we get correct version of some of
+the dependencies. For example, we want `Markdown` version to be
+[3.2.2](https://github.com/backstage/backstage/blob/f9f70c225548017b6a14daea75b00fbd399c11eb/packages/techdocs-container/techdocs-core/requirements.txt#L11).
+You can also explicitly install `Markdown==3.2.2` after installing all other
+Python packages.
-Open a new command line window. Change directory to your Backstage application
-root and run the following command:
+## Running Backstage locally
-```bash
-yarn start
-```
+Start the frontend and the backend app by
+[running backstage locally](../../getting-started/running-backstage-locally.md).
-Open your browser at [http://localhost:3000/docs/](http://localhost:3000/docs/).
+Open your browser at [http://localhost:3000/docs/](http://localhost:3000/docs/)
+to see all your documentation sites.
## Additional reading
diff --git a/docs/features/techdocs/using-cloud-storage.md b/docs/features/techdocs/using-cloud-storage.md
new file mode 100644
index 0000000000..c7b5ec9a9f
--- /dev/null
+++ b/docs/features/techdocs/using-cloud-storage.md
@@ -0,0 +1,95 @@
+---
+id: using-cloud-storage
+title: Using Cloud Storage for TechDocs generated files
+description: Using Cloud Storage for TechDocs generated files
+---
+
+In the [TechDocs architecture](./architecture.md) you have the option to choose
+where you want to store the Generated static files which TechDocs uses to render
+documentation. In both the "Basic" and "Recommended" setup, you can add cloud
+storage providers like Google GCS, Amazon AWS S3, etc. By default, TechDocs uses
+the local filesystem of the `techdocs-backend` plugin in the "Basic" setup. And
+in the recommended setup, having one of the cloud storage is a prerequisite.
+Read more on the TechDocs Architecture documentation page.
+
+On this page you can read how to enable them.
+
+## Configuring Google GCS Bucket with TechDocs
+
+Follow the
+[official Google Cloud documentation](https://googleapis.dev/nodejs/storage/latest/index.html#quickstart)
+for the latest instructions on the following steps involving GCP.
+
+**1. Set `techdocs.publisher.type` config in your `app-config.yaml`**
+
+Set `techdocs.publisher.type` to `'googleGcs'`.
+
+```yaml
+techdocs:
+ publisher:
+ type: 'googleGcs'
+```
+
+**2. GCP (Google Cloud Platform) Project**
+
+Create or choose a dedicated GCP project. Set
+`techdocs.publisher.googleGcs.projectId` to the project ID.
+
+```yaml
+techdocs:
+ publisher:
+ type: 'googleGcs'
+ googleGcs:
+ projectId: 'gcp-project-id'
+```
+
+**3. Service account API key**
+
+Create a new Service Account and a key associated with it. In roles of the
+service account, use "Storage Admin".
+
+If you want to create a custom role, make sure to include both `get` and
+`create` permissions for both "Objects" and "Buckets". See
+https://cloud.google.com/storage/docs/access-control/iam-permissions
+
+A service account can have many keys. Open your newly created account's page (in
+IAM & Admin console), and create a new key. Use JSON format for the key.
+
+A `.json` file will be downloaded. This is the secret
+key TechDocs will use to make API calls. Make it available in your Backstage
+server and/or your local development server and set it in the app config
+`techdocs.publisher.googleGcs.credentials`.
+
+```yaml
+techdocs:
+ publisher:
+ type: 'googleGcs'
+ googleGcs:
+ projectId: 'gcp-project-id'
+ credentials:
+ $file: '/path/to/google_application_credentials.json'
+```
+
+**4. GCS Bucket**
+
+Create a dedicated bucket for TechDocs sites. techdocs-backend will publish
+documentation to this bucket. TechDocs will fetch files from here to serve
+documentation in Backstage.
+
+Set the name of the bucket to `techdocs.publisher.googleGcs.bucketName`.
+
+```yaml
+techdocs:
+ publisher:
+ type: 'googleGcs'
+ googleGcs:
+ projectId: 'gcp-project-id'
+ credentials:
+ $file: '/path/to/google_application_credentials.json'
+ bucketName: 'name-of-techdocs-storage-bucket'
+```
+
+**5. That's it!**
+
+Your Backstage app is now ready to use Google Cloud Storage for TechDocs, to
+store the static generated documentation files.
diff --git a/docs/getting-started/app-custom-theme.md b/docs/getting-started/app-custom-theme.md
index 97876c2ba1..79cd405198 100644
--- a/docs/getting-started/app-custom-theme.md
+++ b/docs/getting-started/app-custom-theme.md
@@ -37,7 +37,7 @@ in combination with
[createMuiTheme](https://material-ui.com/customization/theming/#createmuitheme-options-args-theme)
from [@material-ui/core](https://www.npmjs.com/package/@material-ui/core). See
the
-[@backstage/theme source](https://github.com/spotify/backstage/tree/master/packages/theme/src)
+[@backstage/theme source](https://github.com/backstage/backstage/tree/master/packages/theme/src)
and the implementation of the `createTheme` function for how this is done.
You can also create a theme from scratch that matches the `BackstageTheme` type
diff --git a/docs/getting-started/configure-app-with-plugins.md b/docs/getting-started/configure-app-with-plugins.md
index 1d02f147c1..64b9e772d1 100644
--- a/docs/getting-started/configure-app-with-plugins.md
+++ b/docs/getting-started/configure-app-with-plugins.md
@@ -6,7 +6,53 @@ description: Documentation on How Configuring App with plugins
## Adding existing plugins to your app
-Coming soon!
+The following steps assume that you have created a new Backstage app and want to
+add an existing plugin to it. We are using the
+[CircleCI](https://github.com/backstage/backstage/blob/master/plugins/circleci/README.md)
+plugin in this example.
+
+1. Add the plugin's npm package to the repo:
+
+```bash
+yarn add @backstage/plugin-circleci
+```
+
+2. Add the plugin itself:
+
+```js
+// packages/app/src/plugins.ts
+export { plugin as Circleci } from '@backstage/plugin-circleci';
+```
+
+3. Register the plugin router:
+
+```jsx
+// packages/app/src/components/catalog/EntityPage.tsx
+
+import { Router as CircleCIRouter } from '@backstage/plugin-circleci';
+
+// Then somewhere inside
+}
+/>;
+```
+
+Note that stand-alone plugins that are not "attached" to the Software Catalog
+would be added outside the `EntityPage`.
+
+4. [Optional] Add proxy config:
+
+```yaml
+// app-config.yaml
+proxy:
+ '/circleci/api':
+ target: https://circleci.com/api/v1.1
+ headers:
+ Circle-Token:
+ $env: CIRCLECI_AUTH_TOKEN
+```
### Adding a plugin page to the Sidebar
diff --git a/docs/getting-started/create-an-app.md b/docs/getting-started/create-an-app.md
index c35eded6a5..52ea90db5b 100644
--- a/docs/getting-started/create-an-app.md
+++ b/docs/getting-started/create-an-app.md
@@ -14,7 +14,7 @@ need to run Backstage in your own environment.
To create a Backstage app, you will need to have
[Node.js](https://nodejs.org/en/download/) Active LTS Release installed
-(currently v12).
+(currently v14).
Backstage provides a utility for creating new apps. It guides you through the
initial setup of selecting the name of the app and a database for the backend.
@@ -38,6 +38,42 @@ app-folder is the name that was provided when prompted.
Inside that directory, it will generate all the files and folder structure
needed for you to run your app.
+### Linking in local Backstage packages
+
+It can often be useful to try out changes to the packages in the main Backstage
+repo within your own app. For example if you want to make modifications to
+`@backstage/core` and try them out in your app.
+
+To link in external packages, add them to your `package.json` and `lerna.json`
+workspace paths. These can be either relative or absolute paths with or without
+globs. For example:
+
+```json
+"packages": [
+ "packages/*",
+ "plugins/*",
+ "../backstage/packages/core", // New path added to work on @backstage/core
+],
+```
+
+Then reinstall packages to make yarn set up symlinks:
+
+```bash
+yarn install
+```
+
+With this in place you can now modify the `@backstage/core` package within the
+main repo, and have those changes be reflected and tested in your app. Simply
+run your app using `yarn start` as normal.
+
+Note that for backend packages you need to make sure that linked packages are
+not dependencies of any non-linked package. If you for example want to work on
+`@backstage/backend-common`, you need to also link in other backend plugins and
+packages that depend on `@backstage/backend-common`, or temporarily disable
+those plugins in your backend. This is because the transformation of backend
+module tree stops whenever a non-local package is encountered, and from that
+point node will `require` packages directly for that entire module subtree.
+
### Troubleshooting
The create app command doesn't always work as expected, this is a collection of
@@ -51,7 +87,7 @@ You may encounter the following error message:
Couldn't find any versions for "file-saver" that matches "eligrey-FileSaver.js-1.3.8.tar.gz-art-external"
```
-This is likely because you have a globally configured NPM proxy, which breaks
+This is likely because you have a globally configured npm proxy, which breaks
the installation of the `material-table` dependency. This is a known issue and
being worked on in `material-table`, but for now you can work around it using
the following:
diff --git a/docs/getting-started/deployment-helm.md b/docs/getting-started/deployment-helm.md
index c062ed3951..e1f3ea7629 100644
--- a/docs/getting-started/deployment-helm.md
+++ b/docs/getting-started/deployment-helm.md
@@ -8,7 +8,7 @@ sidebar_label: Kubernetes and Helm
# Helm charts
An example Backstage app can be deployed in Kubernetes using the
-[Backstage Helm charts](https://github.com/spotify/backstage/tree/master/contrib/chart/backstage).
+[Backstage Helm charts](https://github.com/backstage/backstage/tree/master/contrib/chart/backstage).
First, choose a DNS name where Backstage will be hosted, and create a YAML file
for your custom configuration.
@@ -32,7 +32,7 @@ appConfig:
Then use it to run:
```bash
-git clone https://github.com/spotify/backstage.git
+git clone https://github.com/backstage/backstage.git
cd contrib/chart/backstage
helm dependency update
helm install -f backstage-mydomain.yaml backstage .
@@ -61,4 +61,4 @@ backstage-ingress * 123.1.2.3 80 17m
> **NOTE**: this is not a production ready deployment.
For more information on how to customize the deployment check the
-[README](https://github.com/spotify/backstage/tree/master/contrib/chart/backstage/README.md).
+[README](https://github.com/backstage/backstage/tree/master/contrib/chart/backstage/README.md).
diff --git a/docs/getting-started/deployment-k8s.md b/docs/getting-started/deployment-k8s.md
index f123dd2548..bc24894ed1 100644
--- a/docs/getting-started/deployment-k8s.md
+++ b/docs/getting-started/deployment-k8s.md
@@ -9,5 +9,5 @@ Beyond that point we do not have an opinionated way to deploy Backstage within
Kubernetes, as each cluster has its own unique set of tooling and patterns.
We do provide examples to help you get started though. Check out
-[this example](https://github.com/spotify/backstage/tree/master/contrib/kubernetes/plain_single_backend_deplyoment/)
+[this example](https://github.com/backstage/backstage/tree/master/contrib/kubernetes/plain_single_backend_deployment/)
for a basic single-deployment setup.
diff --git a/docs/getting-started/development-environment.md b/docs/getting-started/development-environment.md
index aa9aa0bde1..c5275114ce 100644
--- a/docs/getting-started/development-environment.md
+++ b/docs/getting-started/development-environment.md
@@ -56,7 +56,7 @@ system resources and slow things down.
## Package Scripts
There are many commands to be found in the root
-[package.json](https://github.com/spotify/backstage/blob/master/package.json),
+[package.json](https://github.com/backstage/backstage/blob/master/package.json),
here are some useful ones:
```python
@@ -86,7 +86,7 @@ yarn create-plugin # Create a new plugin
```
> See
-> [package.json](https://github.com/spotify/backstage/blob/master/package.json)
+> [package.json](https://github.com/backstage/backstage/blob/master/package.json)
> for other yarn commands/options.
## Local configuration
diff --git a/docs/getting-started/index.md b/docs/getting-started/index.md
index 855c8b0634..16c837d676 100644
--- a/docs/getting-started/index.md
+++ b/docs/getting-started/index.md
@@ -10,7 +10,7 @@ you're planning to do.
Creating a standalone instance makes it simpler to customize the application for
your needs whilst staying up to date with the project. You will also depend on
-`@backstage` packages from NPM, making the project much smaller. This is the
+`@backstage` packages from npm, making the project much smaller. This is the
recommended approach if you want to kick the tyres of Backstage or setup your
own instance.
@@ -24,7 +24,7 @@ Requests towards this repo.
Backstage provides the `@backstage/create-app` package to scaffold standalone
instances of Backstage. You will need to have
[Node.js](https://nodejs.org/en/download/) Active LTS Release installed
-(currently v12), [Yarn](https://classic.yarnpkg.com/en/docs/install) and
+(currently v14), [Yarn](https://classic.yarnpkg.com/en/docs/install) and
[Python](https://www.python.org/downloads/) (although you likely have it
already). You will also need to have
[Docker](https://docs.docker.com/engine/install/) installed to use some features
@@ -44,7 +44,7 @@ look something like this. You can read more about this process in
### Contributing to Backstage
You can read more in our
-[CONTRIBUTING](https://github.com/spotify/backstage/blob/master/CONTRIBUTING.md)
+[CONTRIBUTING](https://github.com/backstage/backstage/blob/master/CONTRIBUTING.md)
guide, which can help you get setup with a Backstage development environment.
### Next steps
diff --git a/docs/getting-started/running-backstage-locally.md b/docs/getting-started/running-backstage-locally.md
index 1a9097afd3..6de9d234e3 100644
--- a/docs/getting-started/running-backstage-locally.md
+++ b/docs/getting-started/running-backstage-locally.md
@@ -8,19 +8,19 @@ description: Documentation on How to run Backstage Locally
- Node.js
-First make sure you are using Node.js with an Active LTS Release, currently v12.
+First make sure you are using Node.js with an Active LTS Release, currently v14.
This is made easy with a version manager such as
[nvm](https://github.com/nvm-sh/nvm) which allows for version switching.
```bash
# Installing a new version
-nvm install 12
-> Downloading and installing node v12.18.3...
-> Now using node v12.18.3 (npm v6.14.6)
+nvm install 14
+> Downloading and installing node v14.15.1...
+> Now using node v14.15.1 (npm v6.14.8)
# Checking your version
node --version
-> v12.18.3
+> v14.15.1
```
- Yarn
@@ -42,7 +42,7 @@ of GitHub and run an initial build.
```bash
# Start from your local development folder
-git clone --depth 1 git@github.com:spotify/backstage.git
+git clone --depth 1 git@github.com:backstage/backstage.git
cd backstage
# Fetch our dependencies and run an initial build
@@ -84,19 +84,19 @@ exploring.
But you can also set up any of the available authentication methods. The easiest
option will be GitHub. To setup GitHub authentication in Backstage, see
-[these instructions](https://github.com/spotify/backstage/tree/master/plugins/auth-backend#github).
+[these instructions](https://github.com/backstage/backstage/tree/master/plugins/auth-backend#github).
---
Congratulations! That should be it. Let us know how it went
[on discord](https://discord.gg/EBHEGzX), file issues for any
-[feature](https://github.com/spotify/backstage/issues/new?labels=help+wanted&template=feature_template.md)
+[feature](https://github.com/backstage/backstage/issues/new?labels=help+wanted&template=feature_template.md)
or
-[plugin suggestions](https://github.com/spotify/backstage/issues/new?labels=plugin&template=plugin_template.md&title=%5BPlugin%5D+THE+PLUGIN+NAME),
+[plugin suggestions](https://github.com/backstage/backstage/issues/new?labels=plugin&template=plugin_template.md&title=%5BPlugin%5D+THE+PLUGIN+NAME),
or
-[bugs](https://github.com/spotify/backstage/issues/new?labels=bug&template=bug_template.md)
+[bugs](https://github.com/backstage/backstage/issues/new?labels=bug&template=bug_template.md)
you have, and feel free to
-[contribute](https://github.com/spotify/backstage/blob/master/CONTRIBUTING.md)!
+[contribute](https://github.com/backstage/backstage/blob/master/CONTRIBUTING.md)!
## Creating a Plugin
diff --git a/docs/openapi/definitions/auth.yaml b/docs/openapi/definitions/auth.yaml
index cb736fd2a9..411ce69253 100644
--- a/docs/openapi/definitions/auth.yaml
+++ b/docs/openapi/definitions/auth.yaml
@@ -12,14 +12,14 @@ info:
The API is supplied with a list of providers - such as `Google` or `Github` - and will add the endpoints
described below to each of those providers.
- Read more about [User Authentication and Authorization in Backstage](https://github.com/spotify/backstage/blob/master/docs/auth/overview.md).
+ Read more about [User Authentication and Authorization in Backstage](https://github.com/backstage/backstage/blob/master/docs/auth/overview.md).
license:
name: Apache 2.0
url: http://www.apache.org/licenses/LICENSE-2.0.html
version: 0.1.1-alpha.8
externalDocs:
description: Backstage official documentation
- url: https://github.com/spotify/backstage/blob/master/docs/README.md
+ url: https://github.com/backstage/backstage/blob/master/docs/README.md
servers:
- url: http://localhost:7000/api/auth/
tags:
diff --git a/docs/overview/architecture-overview.md b/docs/overview/architecture-overview.md
index 6f3c6b1a71..d8069c8665 100644
--- a/docs/overview/architecture-overview.md
+++ b/docs/overview/architecture-overview.md
@@ -63,17 +63,17 @@ Each plugin is a client side application which mounts itself on the UI. Plugins
are written in TypeScript or JavaScript. They each live in their own directory
in `backstage/plugins`. For example, the source code for the lighthouse plugin
is available at
-[backstage/plugins/lighthouse](https://github.com/spotify/backstage/tree/master/plugins/lighthouse).
+[backstage/plugins/lighthouse](https://github.com/backstage/backstage/tree/master/plugins/lighthouse).
### Installing plugins
Plugins are typically loaded by the UI in your Backstage applications
`plugins.ts` file. For example,
-[here](https://github.com/spotify/backstage/blob/master/packages/app/src/plugins.ts)
+[here](https://github.com/backstage/backstage/blob/master/packages/app/src/plugins.ts)
is that file in the Backstage sample app.
Plugins can be enabled, and passed configuration in `apis.ts`. For example,
-[here](https://github.com/spotify/backstage/blob/master/packages/app/src/apis.ts)
+[here](https://github.com/backstage/backstage/blob/master/packages/app/src/apis.ts)
is that file in the Backstage sample app.
This is how the Lighthouse plugin would be enabled in a typical Backstage
@@ -148,7 +148,7 @@ The CircleCI plugin is an example of a third-party backed plugin. CircleCI is a
SaaS service which can be used without any knowledge of Backstage. It has an API
which a Backstage plugin consumes to display content.
-Requests which go to CircleCI from the users browser are passed through a proxy
+Requests going to CircleCI from the user's browser are passed through a proxy
service that Backstage provides. Without this, the requests would be blocked by
Cross Origin Resource Sharing policies which prevent a browser page served at
[https://example.com](https://example.com) from serving resources hosted at
@@ -161,16 +161,18 @@ https://circleci.com.
As we have seen, both the `lighthouse-audit-service` and `catalog-backend`
require a database to work with.
-At the time of writing, the `lighthouse-audit-service` requires PostgreSQL to
-work with. The service catalog backend uses an in-memory Sqlite3 instance. This
-is a development-oriented setup and there are plans to support other databases
-in the future.
+The Backstage backend and its builtin plugins are based on the
+[Knex](http://knexjs.org/) library, and set up a separate logical database per
+plugin. This gives great isolation and lets them perform migrations and evolve
+separate from each other.
-To learn more about the future of databases and Backstage, see the following
-GitHub issues.
-
-- [Knex + Plugins (Multiple vs Single Database) · Issue #1598 · spotify/backstage](https://github.com/spotify/backstage/issues/1598)
-- [Update migrations to support postgres by dariddler · Pull Request #1527 · spotify/backstage](https://github.com/spotify/backstage/pull/1527#discussion_r450374145)
+The Knex library supports a multitude of databases, but Backstage is at the time
+of writing tested primarily against two of them: SQLite, which is mainly used as
+an in-memory mock/test database, and PostgreSQL, which is the preferred
+production database. Other databases such as the MySQL variants are reported to
+work but
+[aren't tested as fully](https://github.com/backstage/backstage/issues/2460)
+yet.
## Containerization
diff --git a/docs/overview/logos.md b/docs/overview/logos.md
index 2a684420bc..4c0c345f36 100644
--- a/docs/overview/logos.md
+++ b/docs/overview/logos.md
@@ -8,7 +8,7 @@ description: Guidelines for how to use the Backstage logos and icons
Guidelines for how to use the Backstage logo and icon can be found
[here](/logo_assets/Backstage_Identity_Assets_Overview.pdf). The assets below
are all in `.svg` format. Other formats are available in the
-[repository](https://github.com/spotify/backstage/tree/master/microsite/static/logo_assets).
+[repository](https://github.com/backstage/backstage/tree/master/microsite/static/logo_assets).
## Backstage logo
diff --git a/docs/overview/roadmap.md b/docs/overview/roadmap.md
index 51f09347ce..b0c031689d 100644
--- a/docs/overview/roadmap.md
+++ b/docs/overview/roadmap.md
@@ -9,8 +9,8 @@ description: Roadmap of Backstage Project
> Backstage is currently under rapid development. This means that you can expect
> APIs and features to evolve. It is also recommended that teams who adopt
> Backstage today upgrade their installation as new
-> [releases](https://github.com/spotify/backstage/releases) become available, as
-> Backwards compatibility is not yet guaranteed.
+> [releases](https://github.com/backstage/backstage/releases) become available,
+> as Backwards compatibility is not yet guaranteed.
## Phases
@@ -37,83 +37,79 @@ We have divided the project into three high-level _phases_:
If you have questions about the roadmap or want to provide feedback, we would
love to hear from you! Please create an
-[Issue](https://github.com/spotify/backstage/issues/new/choose), ping us on
+[Issue](https://github.com/backstage/backstage/issues/new/choose), ping us on
[Discord](https://discord.gg/EBHEGzX) or reach out directly at
-[alund@spotify.com](mailto:alund@spotify.com).
+[backstage-interest@spotify.com](mailto:backstage-interest@spotify.com).
Want to help out? Awesome ❤️ Head over to
-[CONTRIBUTING](https://github.com/spotify/backstage/blob/master/CONTRIBUTING.md)
+[CONTRIBUTING](https://github.com/backstage/backstage/blob/master/CONTRIBUTING.md)
guidelines to get started.
### Ongoing work 🚧
-- **[Plugins for managing micro services end-2-end](https://github.com/spotify/backstage/milestone/14)**
- Out of the box Backstage will ship with a set of plugins (Overview, CI, API
- and Docs) that will demonstrate how a user can manage a micro service and
- follow a change all the way out in production. Completing this work will make
- it much easier to see how a plugin can be built that integrates with the
- Backstage Service Catalog.
+- **[Platform stabilization](https://github.com/backstage/backstage/milestone/19)** -
+ Stabilize the core of Backstage, including its core features, so that the
+ platform can be depended on for production use. After this, plugins will
+ require little-to-no maintenance.
-- **[Users and teams](https://github.com/spotify/backstage/issues/1807)**
- Ownership is a central concept in Backstage. It should be easy to import your
- existing organizational data, such as users and groups/teams, into Backstage.
- A user the logs into Backstage should see software components owned by the
- team(s) they are in.
+- **[Kubernetes plugin for service owners](https://github.com/backstage/backstage/issues/2857)** -
+ Improve native support for Kubernetes, making it easier for service owners to
+ see and manage their services running in K8s, regardless if that's locally, in
+ AWS, GCS, Azure, or elsewhere.
-- **[Backstage platform is stable](https://github.com/spotify/backstage/milestone/19)** -
- The platform APIs and features are stable and can be depended on for
- production use. After this plugins will require little to no maintenance.
+- **Global search** - Extend the basic search functionality currently available
+ in the Backstage Service Catalog to become a global search experience.
-* **[Improved Kubernetes plugin](https://github.com/spotify/backstage/issues/2857)** -
- Native support for Kubernetes, making it easier for developers to see and
- manage their services running in k8s.
-
-- Further improvements to platform documentation. Examples include a Golden Path
- for plugin development.
+- **[Software Templates V2](https://github.com/backstage/backstage/issues/2771)** -
+ Expand the templates to make the steps more composable by adding the ability
+ to add more steps for custom logic, including webhooks and using authorization
+ from integrations.
### Future work 🔮
-- **Deploy a product demo at `demo.backstage.io`** - Deploy a typical Backstage
- deployment available publicly so that people can click around and get a feel
- for the product without having to install anything.
+- **Golden Path for Plugin Development** - Create an easy, standardized way for
+ developers to build plugins that will encourage contributions and lead to a
+ richer ecosystem for everyone.
-- **[Global search](https://github.com/spotify/backstage/issues/1499)** - Extend
- the basic search available in the Backstage Service Catalog with a global
- search experience. Long term this search solution should be extensible, making
- it possible for you add custom search results.
-
-- **[[TechDocs V.2] Stabilization release](https://github.com/spotify/backstage/milestone/17)** -
- Platform stability and compatibility improvements.
-
-- **Additional auth providers** - Backstage should work for most (all!) auth
- solutions. Since Backstage can be used by companies regardless of what cloud
- (or on prem) you are using we are especially keen to get auth support for
- [AWS](https://github.com/spotify/backstage/issues/290),
- [Azure](https://github.com/spotify/backstage/issues/348) and others.
-
-- **[Initial GraphQL API](https://github.com/spotify/backstage/milestone/13)** -
- A GraphQL API will open up the rich metadata provided by Backstage in a single
+- **[GraphQL API](https://github.com/backstage/backstage/milestone/13)** - A
+ GraphQL API will open up the rich metadata provided by Backstage in a single
query. Plugins can easily query this API as well as extend the model where
needed.
+- **Inter-Plugin Communication** - **[Under consideration]** Establish more
+ clearly defined patterns for plugins to communicate.
+
+- **Improved Access Control** - **[Under consideration]** Provide finer grained
+ access controls and management for better control of the platform user
+ experience.
+
### Plugins
Building and maintaining [plugins](https://backstage.io/plugins) is the work of
the entire Backstage community.
A list of plugins that are in development is
-[available here](https://github.com/spotify/backstage/issues?q=is%3Aissue+is%3Aopen+label%3Aplugin+sort%3Areactions-%2B1-desc).
+[available here](https://github.com/backstage/backstage/issues?q=is%3Aissue+is%3Aopen+label%3Aplugin+sort%3Areactions-%2B1-desc).
We strongly recommend to upvote 👍 plugins you are interested in. This helps us
and the community prioritize what plugins to build.
Are you missing a plugin for your favorite tool? Please
-[suggest a new one](https://github.com/spotify/backstage/issues/new?labels=plugin&template=plugin_template.md&title=%5BPlugin%5D+THE+PLUGIN+NAME).
+[suggest a new one](https://github.com/backstage/backstage/issues/new?labels=plugin&template=plugin_template.md&title=%5BPlugin%5D+THE+PLUGIN+NAME).
Chances are that someone will jump in and help build it.
+### Community Initiatives 🧑🤝🧑 (Coming soon)
+
+- **Backstage Monthly Meetup** - A space for the community to come together to
+ share and learn about the latest happenings in Backstage.
+
+- **Backstage Hackathons** - Open to everyone in our Backstage community, a
+ celebration of you, the project and building awesome things together
+
### Completed milestones ✅
-- [Kubernetes plugin - v1](https://github.com/spotify/backstage/tree/master/plugins/kubernetes)
-- [Helm charts](https://github.com/spotify/backstage/tree/master/contrib/chart/backstage)
+- [Deploy a product demo at `demo.backstage.io`](https://demo.backstage.io)
+- [Kubernetes plugin - v1](https://github.com/backstage/backstage/tree/master/plugins/kubernetes)
+- [Helm charts](https://github.com/backstage/backstage/tree/master/contrib/chart/backstage)
- [Backstage Design System 💅](https://backstage.io/blog/2020/09/30/backstage-design-system)
- [Cost Insights plugin 💸](https://engineering.atspotify.com/2020/09/29/managing-clouds-from-the-ground-up-cost-engineering-at-spotify/)
- [Donate Backstage to the CNCF 🎉](https://backstage.io/blog/2020/09/23/backstage-cncf-sandbox)
@@ -123,11 +119,11 @@ Chances are that someone will jump in and help build it.
- [Backstage Service Catalog (alpha)](https://backstage.io/blog/2020/06/22/backstage-service-catalog-alpha)
- [Backstage Software Templates (alpha)](https://backstage.io/blog/2020/08/05/announcing-backstage-software-templates)
- [Make it possible to add custom auth providers](https://backstage.io/blog/2020/07/01/how-to-enable-authentication-in-backstage-using-passport)
-- [TechDocs v0](https://github.com/spotify/backstage/milestone/15)
+- [TechDocs v0](https://github.com/backstage/backstage/milestone/15)
- CI plugins: CircleCI, Jenkins, GitHub Actions and TravisCI
-- [Service API documentation](https://github.com/spotify/backstage/pull/1737)
+- [Service API documentation](https://github.com/backstage/backstage/pull/1737)
- Backstage Service Catalog can read from: GitHub, GitLab,
- [Bitbucket](https://github.com/spotify/backstage/pull/1938)
+ [Bitbucket](https://github.com/backstage/backstage/pull/1938)
- Support auth providers: Google, Okta, GitHub, GitLab,
- [auth0](https://github.com/spotify/backstage/pull/1611),
- [AWS](https://github.com/spotify/backstage/pull/1990)
+ [auth0](https://github.com/backstage/backstage/pull/1611),
+ [AWS](https://github.com/backstage/backstage/pull/1990)
diff --git a/docs/overview/stability-index.md b/docs/overview/stability-index.md
new file mode 100644
index 0000000000..c53193f063
--- /dev/null
+++ b/docs/overview/stability-index.md
@@ -0,0 +1,395 @@
+---
+id: stability-index
+title: Stability Index
+description:
+ An overview of the commitment to stability for different parts of the
+ Backstage codebase.
+---
+
+## Overview
+
+The purpose of the Backstage Stability Index is to communicate the stability of
+various parts of the project. It is tracked using a scoring system where a
+higher score indicates a higher level of stability and is a commitment to
+smoother transitions between breaking changes. Importantly, the Stability Index
+does not supersede [semver](https://semver.org/), meaning we will still adhere
+to semver and only do breaking changes in minor releases as long as we are on
+`0.x`.
+
+Each package or section is assigned a stability score between 0 and 3, with each
+point building on top of the previous one:
+
+- **0** - Breaking changes are noted in the changelog, and documentation is
+ updated.
+- **1** - The changelog entry includes a clearly documented upgrade path,
+ providing guidance for how to migrate previous usage patterns to the new
+ version.
+- **2** - Breaking changes always include a deprecation phase where both the old
+ and the new APIs can be used in parallel. This deprecation must have been
+ released for at least two weeks before the deprecated API is removed in a
+ minor version bump.
+- **3** - The time limit for the deprecation is 3 months instead of two weeks.
+
+TL;DR:
+
+- **0** - There's a changelog entry.
+- **1** - There's a migration guide.
+- **2** - 2 weeks of deprecation.
+- **3** - 3 months of deprecation.
+
+## Packages
+
+### `example-app` [GitHub](https://github.com/backstage/backstage/tree/master/packages/app/)
+
+This is the `packages/app` package, and it serves as an example as well as
+utility for local development in the main Backstage repo.
+
+Stability: `N/A`
+
+### `example-backend` [GitHub](https://github.com/backstage/backstage/tree/master/packages/backend/)
+
+This is the `packages/backend` package, and it serves as an example as well as
+utility for local development in the main Backstage repo.
+
+Stability: `N/A`
+
+### `backend-common` [GitHub](https://github.com/backstage/backstage/tree/master/packages/backend-common/)
+
+A collection of common helpers to be used by both backend plugins, and for
+constructing backend packages.
+
+Stability: `1`
+
+### `catalog-client` [GitHub](https://github.com/backstage/backstage/tree/master/packages/catalog-client/)
+
+An HTTP client for interacting with the catalog backend. Usable both in frontend
+and Backend.
+
+Stability: `0`. This is a very new addition and we have some immediate changes
+planned.
+
+### `catalog-model` [GitHub](https://github.com/backstage/backstage/tree/master/packages/catalog-model/)
+
+Contains the core catalog model, and utilities for working with entities. Usable
+both in frontend and Backend.
+
+Stability: `2`. The catalog model is evolving, but because of the broad usage we
+
+want to ensure some stability.
+
+### `cli` [GitHub](https://github.com/backstage/backstage/tree/master/packages/cli/)
+
+The main toolchain used for Backstage development. The various CLI commands and
+options passed to those commands, as well as the environment variables read by
+the CLI, are considered to be the interface that the stability index refers to.
+The build output may change over time and is not considered a breaking change
+unless it is likely to affect external tooling.
+
+Stability: `2`
+
+### `cli-common` [GitHub](https://github.com/backstage/backstage/tree/master/packages/cli-common/)
+
+Lightweight utilities used by the various Backstage CLIs, not intended for
+external use.
+
+Stability: `N/A`
+
+### `config` [GitHub](https://github.com/backstage/backstage/tree/master/packages/config/)
+
+Provides the logic and interfaces for reading static configuration.
+
+Stability: `2`
+
+### `config-loader` [GitHub](https://github.com/backstage/backstage/tree/master/packages/config-loader/)
+
+Used to load in static configuration, mainly for use by the CLI and
+@backstage/backend-common.
+
+Stability: `1`. Mainly intended for internal use.
+
+### `core` [GitHub](https://github.com/backstage/backstage/tree/master/packages/core/)
+
+#### Section: React Components
+
+All of the React components exported from `src/components/` and `src/layout/`
+
+Stability: `1`. These components have not received a proper review of the API,
+but we also want to ensure stability.
+
+#### Section: Plugin API
+
+The parts of the core API that are used by plugins, and the way plugins expose
+functionality to apps and other plugins. Includes for example `createPlugin`,
+`createRouteRef`, `createApiRef`.
+
+Stability: `2`. There are planned breaking changes around the way that plugins
+expose features and do routing. We still commit to keeping a short deprecation
+period so that plugins outside of the main repo have time to migrate.
+
+#### Section: App API
+
+The APIs used exclusively in the app, such as `createApp` and the system icons.
+
+Stability: `2`
+
+#### Section: Utility API Definitions
+
+The type declarations of the core Utility APIs.
+
+Stability: `2`. Changes to the Utility API type declarations need time to
+propagate.
+
+#### Section: Utility API Implementations
+
+The interfaces and default implementations for various Utility APIs, such as
+ErrorApi, IdentityApi, the auth APIs, etc.
+
+Stability: `1`. Most changes to the core utility APIs will not lead to
+widespread breaking changes since most apps rely on the default implementations.
+
+### `core-api` [GitHub](https://github.com/backstage/backstage/tree/master/packages/core-api/)
+
+The non-visual parts of @backstage/core. Everything in this packages is
+re-exported from @backstage/core, and this package should not be used directly.
+
+Stability: See @backstage/core
+
+### `create-app` [GitHub](https://github.com/backstage/backstage/tree/master/packages/create-app/)
+
+The CLI used to scaffold new Backstage projects.
+
+Stability: `2`
+
+### `dev-utils` [GitHub](https://github.com/backstage/backstage/tree/master/packages/dev-utils/)
+
+Provides utilities for developing plugins in isolation.
+
+Stability: `0`. This package is largely broken and needs updates.
+
+### `docgen` [GitHub](https://github.com/backstage/backstage/tree/master/packages/docgen/)
+
+Internal CLI utility for generating API Documentation.
+
+Stability: `N/A`
+
+### `e2e-test` [GitHub](https://github.com/backstage/backstage/tree/master/packages/e2e-test/)
+
+Internal CLI utility for running e2e tests.
+
+Stability: `N/A`
+
+### `integration` [GitHub](https://github.com/backstage/backstage/tree/master/packages/integration/)
+
+Provides shared utilities for managing integrations towards different types of
+third party systems. This package is currently internal and its functionality
+will likely be exposed via separate APIs in the future.
+
+Some of the functionality in this package is not available elsewhere yes, so if
+it's necessary it can be used, but there will be breaking changes.
+
+Stability: `0`
+
+### `storybook` [GitHub](https://github.com/backstage/backstage/tree/master/packages/storybook/)
+
+Internal storybook build for publishing stories to
+https://backstage.io/storybook
+
+Stability: `N/A`
+
+### `test-utils` [GitHub](https://github.com/backstage/backstage/tree/master/packages/test-utils/)
+
+Utilities for writing tests for Backstage plugins and apps.
+
+Stability: `2`
+
+### `test-utils-core` [GitHub](https://github.com/backstage/backstage/tree/master/packages/test-utils-core/)
+
+Internal testing utilities that are separated out for usage in
+@backstage/core-api. All exports are re-exported by @backstage/test-utils. This
+package should not be depended on directly.
+
+Stability: See @backstage/test-utils
+
+### `theme` [GitHub](https://github.com/backstage/backstage/tree/master/packages/theme/)
+
+The core Backstage MUI theme along with customization utilities.
+
+#### Section: TypeScript
+
+This is the TypeScript API exported by the theme package.
+
+Stability: `2`
+
+#### Section: Visual Theme
+
+The visual theme exported by the theme packages, where for example changing a
+color could be considered a breaking change.
+
+Stability: `1`
+
+## Plugins
+
+Plugins are rarely marked as stable as the `@backstage/core` plugin API is under
+heavy development.
+
+Many backend plugins are split into "REST API" and "TypeScript Interface"
+sections. The "TypeScript Interface" refers to the API used to integrate the
+plugin into the backend.
+
+Any plugin that is not listed below is untracked and can generally be considered
+unstable with a score of `0`. Open a Pull Request if you want your plugin to be
+added!
+
+### `api-docs` [GitHub](https://github.com/backstage/backstage/tree/master/plugins/api-docs/)
+
+Components to discover and display API entities as an extension to the catalog
+plugin.
+
+Stability: `0`
+
+### `app-backend` [GitHub](https://github.com/backstage/backstage/tree/master/plugins/app-backend/)
+
+A backend plugin that can be used to serve the frontend app and inject
+configuration.
+
+Stability: `2`
+
+### `auth-backend` [GitHub](https://github.com/backstage/backstage/tree/master/plugins/auth-backend/)
+
+A backend plugin that implements the backend portion of the various
+authentication flows used in Backstage.
+
+#### Section: REST API
+
+Stability: `2`
+
+#### Section: TypeScript Interface
+
+Stability: `1`
+
+### `catalog` [GitHub](https://github.com/backstage/backstage/tree/master/plugins/catalog/)
+
+The frontend plugin for the catalog, with the table and building blocks for the
+entity pages.
+
+Stability: `1`. We're planning some work to overhaul how entity pages are
+constructed.
+
+### `catalog-backend` [GitHub](https://github.com/backstage/backstage/tree/master/plugins/catalog-backend/)
+
+The backend API for the catalog, also exposes the processing subsystem for
+customization of the catalog. Powers the @backstage/plugin-catalog frontend
+plugin.
+
+#### Section: REST API
+
+Stability: `1`. There are plans to remove and rework some endpoints.
+
+#### Section: TypeScript Interface
+
+Stability: `1`. There are plans to rework parts of the Processor interface.
+
+### `catalog-graphql` [GitHub](https://github.com/backstage/backstage/tree/master/plugins/catalog-graphql/)
+
+Provides the catalog schema and resolvers for the graphql backend.
+
+Stability: `0`. Under heavy development and subject to change.
+
+### `explore` [GitHub](https://github.com/backstage/backstage/tree/master/plugins/explore/)
+
+A frontend plugin that introduces the concept of exploring internal and external
+tooling in an organization.
+
+Stability: `0`. Only an example at the moment and not customizable.
+
+### `graphiql` [GitHub](https://github.com/backstage/backstage/tree/master/plugins/graphiql/)
+
+Integrates GraphiQL as a tool to browse GraphQL API endpoints inside Backstage.
+
+Stability: `1`
+
+### `graphql` [GitHub](https://github.com/backstage/backstage/tree/master/plugins/graphql/)
+
+A backend plugin that provides
+
+Stability: `0`. Under heavy development and subject to change.
+
+### `kubernetes` [GitHub](https://github.com/backstage/backstage/tree/master/plugins/kubernetes/)
+
+The frontend component of the Kubernetes plugin, used to browse and visualize
+Kubernetes resources.
+
+Stability: `1`.
+
+### `kubernetes-backend` [GitHub](https://github.com/backstage/backstage/tree/master/plugins/kubernetes-backend/)
+
+The backend component of the Kubernetes plugin, used to fetch Kubernetes
+resources from clusters and associate them with entities in the Catalog.
+
+Stability: `1`.
+
+### `proxy-backend` [GitHub](https://github.com/backstage/backstage/tree/master/plugins/proxy-backend/)
+
+A backend plugin used to set up proxying to other endpoints based on static
+configuration.
+
+Stability: `1`
+
+### `register-component` [GitHub](https://github.com/backstage/backstage/tree/master/plugins/register-component/)
+
+A frontend plugin that allows the user to register entity locations in the
+catalog.
+
+Stability: `0`. This plugin is likely to be replaced by a generic entity import
+plugin instead.
+
+### `scaffolder` [GitHub](https://github.com/backstage/backstage/tree/master/plugins/scaffolder/)
+
+The frontend scaffolder plugin where one can browse templates and initiate
+scaffolding jobs.
+
+Stability: `1`
+
+### `scaffolder-backend` [GitHub](https://github.com/backstage/backstage/tree/master/plugins/scaffolder-backend/)
+
+The backend scaffolder plugin that provides an implementation for templates in
+the catalog.
+
+Stability: `1`. There is planned work to rework the scaffolder in
+https://github.com/backstage/backstage/issues/2771.
+
+### `tech-radar` [GitHub](https://github.com/backstage/backstage/tree/master/plugins/tech-radar/)
+
+Visualize the your company's official guidelines of different areas of software
+development.
+
+Stability: `0`
+
+### `techdocs` [GitHub](https://github.com/backstage/backstage/tree/master/plugins/techdocs/)
+
+The frontend component of the TechDocs plugin, used to browse technical
+documentation of entities.
+
+Stability: `1`
+
+### `techdocs-backend` [GitHub](https://github.com/backstage/backstage/tree/master/plugins/techdocs-backend/)
+
+The backend component of the TechDocs plugin, used to transform and serve
+TechDocs.
+
+Stability: `0`
+
+### `user-settings` [GitHub](https://github.com/backstage/backstage/tree/master/plugins/user-settings/)
+
+A frontend plugin that provides a page where the user can tweak various
+settings.
+
+Stability: `1`
+
+### `welcome` [GitHub](https://github.com/backstage/backstage/tree/master/plugins/welcome/)
+
+A plugin that can be used to welcome the user to Backstage.
+
+Stability: `0`. This used to be the start page for the example app, but has been
+replaced by the catalog plugin. It is still viewable at `/welcome` but may be
+removed.
diff --git a/docs/overview/vision.md b/docs/overview/vision.md
index df75a4f0a6..c17e2b17ba 100644
--- a/docs/overview/vision.md
+++ b/docs/overview/vision.md
@@ -19,5 +19,5 @@ We are working on making Backstage the trusted standard toolbox (read: UX layer)
for the open source infrastructure landscape. Think of it like Kubernetes for
developer experience. We realize this is an ambitious goal. We can’t do it
alone. If this sounds interesting or you'd like to help us shape our product
-vision, we'd love to talk. You can email me directly:
-[alund@spotify.com](mailto:alund@spotify.com).
+vision, we'd love to talk. You can email us directly:
+[backstage-interest@spotify.com](mailto:backstage-interest@spotify.com).
diff --git a/docs/overview/what-is-backstage.md b/docs/overview/what-is-backstage.md
index 3d41c714ee..b414e62853 100644
--- a/docs/overview/what-is-backstage.md
+++ b/docs/overview/what-is-backstage.md
@@ -9,7 +9,7 @@ Powered by a centralized service catalog, Backstage restores order to your micro
[Backstage](https://backstage.io/) is an open platform for building developer
portals. Powered by a centralized service catalog, Backstage restores order to
-your microservices and infrastructure. So your product teams can ship
+your microservices and infrastructure and enables your product teams to ship
high-quality code quickly — without compromising autonomy.
Backstage unifies all your infrastructure tooling, services, and documentation
@@ -30,7 +30,7 @@ Out of the box, Backstage includes:
code" approach
- Plus, a growing ecosystem of
- [open source plugins](https://github.com/spotify/backstage/tree/master/plugins)
+ [open source plugins](https://github.com/backstage/backstage/tree/master/plugins)
that further expand Backstage’s customizability and functionality
## Backstage and the CNCF
diff --git a/docs/plugins/add-to-marketplace.md b/docs/plugins/add-to-marketplace.md
index 59cca07bff..790512e6aa 100644
--- a/docs/plugins/add-to-marketplace.md
+++ b/docs/plugins/add-to-marketplace.md
@@ -8,7 +8,7 @@ description: Documentation on Adding Plugin to Marketplace
To add a new plugin to the [plugin marketplace](https://backstage.io/plugins)
create a file in
-[`microsite/data/plugins`](https://github.com/spotify/backstage/tree/master/microsite/data/plugins)
+[`microsite/data/plugins`](https://github.com/backstage/backstage/tree/master/microsite/data/plugins)
with your plugin's information. Example:
```yaml
diff --git a/docs/plugins/call-existing-api.md b/docs/plugins/call-existing-api.md
index 3fff90c3f6..75e054d2b9 100644
--- a/docs/plugins/call-existing-api.md
+++ b/docs/plugins/call-existing-api.md
@@ -137,7 +137,7 @@ router.use('/summary', async (req, res) => {
```
For a more detailed example, see
-[the lighthouse plugin](https://github.com/spotify/backstage/tree/master/plugins/lighthouse)
+[the lighthouse plugin](https://github.com/backstage/backstage/tree/master/plugins/lighthouse)
that stores some state in a database and adds new capabilities to the underlying
API.
diff --git a/docs/plugins/index.md b/docs/plugins/index.md
index 8836c1cd42..32d523b2f5 100644
--- a/docs/plugins/index.md
+++ b/docs/plugins/index.md
@@ -22,7 +22,7 @@ To create a plugin, follow the steps outlined [here](create-a-plugin.md).
If you start developing a plugin that you aim to release as open source, we
suggest that you create a
-[new Issue](https://github.com/spotify/backstage/issues/new?labels=plugin&template=plugin_template.md&title=%5BPlugin%5D+THE+PLUGIN+NAME).
+[new Issue](https://github.com/backstage/backstage/issues/new?labels=plugin&template=plugin_template.md&title=%5BPlugin%5D+THE+PLUGIN+NAME).
This helps the community know what plugins are in development.
You can also use this process if you have an idea for a good plugin but you hope
@@ -33,4 +33,4 @@ that someone else will pick up the work.
If your plugin isn't supposed to live as a standalone page, but rather needs to
be presented as a part of a Service Catalog (e.g. a separate tab or a card on an
"Overview" tab), then check out
-[the instruction](integrating-plugin-into-service-catalog.md). on how to do it.
+[the instruction](integrating-plugin-into-service-catalog.md) on how to do it.
diff --git a/docs/plugins/proxying.md b/docs/plugins/proxying.md
index f55b4d9229..f2d7d3c12a 100644
--- a/docs/plugins/proxying.md
+++ b/docs/plugins/proxying.md
@@ -52,19 +52,7 @@ configuration will lead to the proxy acting on backend requests to
The value inside each route is either a simple URL string, or an object on the
format accepted by
-[http-proxy-middleware](https://www.npmjs.com/package/http-proxy-middleware). It
-is also possible to limit the forwarded HTTP methods with the configuration
-`allowedMethods`, for example `allowedMethods: ['GET']` to enforce read-only
-access.
-
-By default, the proxy will only forward safe HTTP request headers to the target.
-Those are based on the headers that are considered safe for CORS and includes
-headers like `content-type` or `last-modified`, as well as all headers that are
-set by the proxy. If the proxy should forward other headers like
-`authorization`, this must be enabled by the `allowedHeaders` config, for
-example `allowedHeaders: ['Authorization']`. This should help to not
-accidentally forward confidential headers (`cookie`, `X-Auth-Request-User`) to
-third-parties.
+[http-proxy-middleware](https://www.npmjs.com/package/http-proxy-middleware).
If the value is a string, it is assumed to correspond to:
@@ -85,3 +73,22 @@ except with the following caveats for convenience:
`'^/api/proxy/larger-example/v1/': '/'` is added. That means that a request to
`/api/proxy/larger-example/v1/some/path` will be translated to a request to
`http://larger.example.com:8080/svc.v1/some/path`.
+
+There are also additional settings:
+
+- `allowedMethods`: Limit the forwarded HTTP methods. For example
+ `allowedMethods: ['GET']` enforces read-only access.
+- `allowedHeaders`: A list of headers that should be forwarded to and received
+ from the target.
+
+By default, the proxy will only forward safe HTTP request headers to the target.
+Those are based on the headers that are considered safe for CORS and includes
+headers like `content-type` or `last-modified`, as well as all headers that are
+set by the proxy. If the proxy should forward other headers like
+`authorization`, this must be enabled by the `allowedHeaders` config, for
+example `allowedHeaders: ['Authorization']`. This should help to not
+accidentally forward confidential headers (`cookie`, `X-Auth-Request-User`) to
+third-parties.
+
+The same logic applies to headers that are sent from the target back to the
+frontend.
diff --git a/docs/plugins/publishing.md b/docs/plugins/publishing.md
index fbeab6340c..efea02ee23 100644
--- a/docs/plugins/publishing.md
+++ b/docs/plugins/publishing.md
@@ -1,16 +1,16 @@
---
id: publishing
title: Publishing
-description: Documentation on Publishing NPM packages
+description: Documentation on Publishing npm packages
---
-## NPM
+## npm
-NPM packages are published through CI/CD in the
-[.github/workflows/master.yml](https://github.com/spotify/backstage/blob/master/.github/workflows/master.yml)
+npm packages are published through CI/CD in the
+[.github/workflows/master.yml](https://github.com/backstage/backstage/blob/master/.github/workflows/master.yml)
workflow. Every commit that is merged to master will be checked for new versions
of all public packages, and any new versions will automatically be published to
-NPM.
+npm.
### Creating a new release
@@ -56,5 +56,3 @@ $ git reset --hard master
$ yarn release
$ git push --force
```
-
-[Back to Docs](../README.md)
diff --git a/docs/plugins/structure-of-a-plugin.md b/docs/plugins/structure-of-a-plugin.md
index 0f11896f7a..3f631a9a46 100644
--- a/docs/plugins/structure-of-a-plugin.md
+++ b/docs/plugins/structure-of-a-plugin.md
@@ -106,6 +106,6 @@ environment you will probably face challenges like CORS policies and/or
backend-side authorization. To smooth this process out you can use proxy -
either the one you already have (like Nginx, HAProxy, etc.) or the proxy-backend
plugin that we provide for the Backstage backend.
-[Read more](https://github.com/spotify/backstage/blob/master/plugins/proxy-backend/README.md)
+[Read more](https://github.com/backstage/backstage/blob/master/plugins/proxy-backend/README.md)
[Back to Getting Started](../README.md)
diff --git a/docs/plugins/testing.md b/docs/plugins/testing.md
index e60b5fa8b7..30c3bf0ecc 100644
--- a/docs/plugins/testing.md
+++ b/docs/plugins/testing.md
@@ -16,15 +16,15 @@ frameworks and libraries like [Mocha](https://mochajs.org/),
Running all tests:
- yarn test-react
+ yarn test
Running an individual test (e.g. `MyComponent.test.js`):
- yarn test-react MyComponent
+ yarn test MyComponent
To run both `MyComponent.test.js` and `MyControl.test.js` suite of tests:
- yarn test-react MyCo
+ yarn test MyCo
Note: if `console.logs` are not appearing, run only the individual test you are
working on.
@@ -52,12 +52,12 @@ render React components.
TODO.
-# Writing Unit Tests
+## Writing Unit Tests
The following principles are good guides for determining if you are writing high
quality frontend unit tests.
-## Bad Unit Test Principle
+### Bad Unit Test Principle
> No unit test is better than a bad one.
@@ -69,7 +69,7 @@ Writing a poor unit test:
- Adds to future work by requiring updates to the unit test for irrelevant code
changes.
-## Input/Output Principle
+### Input/Output Principle
> A unit test verifies an output matches an expected input.
@@ -77,7 +77,7 @@ For backend, this would be that when you provide configuration X, then the
object responds with Y. For frontend, this would be that when you provide
properties X to a component, then the visual functionality responds with Y.
-## Blackbox Principle
+### Blackbox Principle
> A good unit test does not tell the object how it should do its job but should
> only compare inputs to outputs.
@@ -86,7 +86,7 @@ Consider a unit test for a form. A good unit test would not test the order of
the form fields. Instead, it would verify that the inputs to the form fields
lead to a certain backend call when submit is clicked.
-## Scalability Principle
+### Scalability Principle
> Unit test quality is directly proportionate to how much code can change
> without having to touch the unit test.
@@ -97,7 +97,7 @@ to the code, you have to update the unit test. A good unit test suite allows a
lot of flexibility in _how_ the code is written so that future refactoring can
occur without having to touch the original unit tests.
-## Increasing Complexity Principle
+### Increasing Complexity Principle
> The ordering of unit tests in a suite should proceed from least specific to
> most specific.
@@ -116,7 +116,7 @@ throwing an error saying that output was incorrect will lead the next developer
into thinking they may have broken the entire functionality of the object rather
than simply letting them know they had an invalid input.
-## Broken Functionality Principle
+### Broken Functionality Principle
> Generally, a unit test should not test exactly how the output appears, it
> should test that the functionality has an expected _general_ response to an
@@ -131,7 +131,7 @@ test a slightly different color on the button the unit test will break. A better
unit test would verify that the button's CSS classname is assigned properly on
hover or test for something completely different.
-## Example: Loading Indicator
+### Example: Loading Indicator
A classic unit test on frontends is verifying a loading indicator displays when
a backend request is being made.
@@ -192,11 +192,14 @@ returns a result or displays an error or console message, like so:
**`StringUtil ellipsis`**
- export function ellipsis(text, maxLength, midCharIx = 0, ellipsis = '...') {
- // Do something blackbox. We should not care about the internals, only inputs and outputs.
- ...
- return someFinalValue;
- }
+```js
+export function ellipsis(text, maxLength, midCharIx = 0, ellipsis = '...') {
+ // Do something blackbox. We should not care about the internals,
+ // only inputs and outputs.
+ ...
+ return someFinalValue;
+}
+```
There are four things to test for in a utility function:
@@ -207,34 +210,40 @@ There are four things to test for in a utility function:
> Handle Invalid Input (handle thrown errors):
- it('Throws an error on improper arguments', () => {
- expect(() => {
- ellipsis();
- }).toThrowError('Expected \'text\' to be defined');
- });
+```js
+it('Throws an error on improper arguments', () => {
+ expect(() => {
+ ellipsis();
+ }).toThrowError("Expected 'text' to be defined");
+});
+```
> Verify default input arguments:
- it('Works with defaults', () => {
- expect(ellipsis('Hello world', 3)).toBe('Hel...');
- expect(ellipsis('', 3)).toBe('');
- expect(ellipsis('H', 3)).toBe('H');
- expect(ellipsis('Hello', 5)).toBe('Hello');
- });
+```js
+it('Works with defaults', () => {
+ expect(ellipsis('Hello world', 3)).toBe('Hel...');
+ expect(ellipsis('', 3)).toBe('');
+ expect(ellipsis('H', 3)).toBe('H');
+ expect(ellipsis('Hello', 5)).toBe('Hello');
+});
+```
> Verify output for expected input arguments:
This is especially true for edge cases!
- it('Works with midCharIx', () => {
- expect(ellipsis('Hello world', 3, 6)).toBe('...o w...');
- expect(ellipsis('', 3, 6)).toBe('');
- expect(ellipsis('Backstage is amazing', 4, 10)).toBe('...e is...');
- });
+```js
+it('Works with midCharIx', () => {
+ expect(ellipsis('Hello world', 3, 6)).toBe('...o w...');
+ expect(ellipsis('', 3, 6)).toBe('');
+ expect(ellipsis('Backstage is amazing', 4, 10)).toBe('...e is...');
+});
+```
## Non-React Classes
-Testing a Javascript object which is _not_ a React component follows a lot of
+Testing a JavaScript object which is _not_ a React component follows a lot of
the same principles as testing objects in other languages.
### API Testing Principles
@@ -243,7 +252,7 @@ Testing an API involves verifying four things:
1. Invalid inputs are caught before being sent to the server.
2. Valid inputs translate into a valid browser request.
-3. Server response is translated into an expected Javascript object.
+3. Server response is translated into an expected JavaScript object.
4. Server errors are handled gracefully.
### Mocking API Calls
@@ -372,4 +381,4 @@ IDE.
In most cases, we have found that using `console.log` works well.
Note: if your console.logs are not being displayed, focus your specific unit
-test from the command line by running them like so `yarn test-react MyTest`.
+test from the command line by running them like so `yarn test MyTest`.
diff --git a/docs/reference/createPlugin-feature-flags.md b/docs/reference/createPlugin-feature-flags.md
index bcea80e26b..622c085291 100644
--- a/docs/reference/createPlugin-feature-flags.md
+++ b/docs/reference/createPlugin-feature-flags.md
@@ -27,7 +27,7 @@ To inspect the state of a feature flag inside your plugin, you can use the
`FeatureFlagsApi`, accessed via the `featureFlagsApiRef`. For example:
```tsx
-import React, { FC } from 'react';
+import React from 'react';
import { Button } from '@material-ui/core';
import { featureFlagsApiRef, useApi } from '@backstage/core';
diff --git a/docs/reference/createPlugin.md b/docs/reference/createPlugin.md
index 45e3303124..4a58a5ecdc 100644
--- a/docs/reference/createPlugin.md
+++ b/docs/reference/createPlugin.md
@@ -4,7 +4,7 @@ title: createPlugin
description: Documentation on createPlugin
---
-Taking a plugin config as argument and returns a new plugin.
+Takes a plugin config as an argument and returns a new plugin.
## Plugin Config
@@ -28,18 +28,22 @@ type PluginHooks = {
### Creating a basic plugin
-Showcasing adding multiple routes, a feature flag and a redirect.
+Showcasing adding a route and a feature flag.
```jsx
-import { createPlugin } from '@backstage/core';
+import { createPlugin, createRouteRef } from '@backstage/core';
import ExampleComponent from './components/ExampleComponent';
+export const rootRouteRef = createRouteRef({
+ path: '/new-plugin',
+ title: 'New Plugin',
+});
+
export default createPlugin({
id: 'new-plugin',
register({ router, featureFlags }) {
+ router.addRoute(rootRouteRef, ExampleComponent);
featureFlags.register('enable-example-component');
-
- router.registerRoute('/new-plugin', ExampleComponent);
},
});
```
diff --git a/docs/reference/utility-apis/AlertApi.md b/docs/reference/utility-apis/AlertApi.md
index 6219f520f5..4116e964ae 100644
--- a/docs/reference/utility-apis/AlertApi.md
+++ b/docs/reference/utility-apis/AlertApi.md
@@ -1,7 +1,7 @@
# AlertApi
The AlertApi type is defined at
-[packages/core-api/src/apis/definitions/AlertApi.ts:29](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/apis/definitions/AlertApi.ts#L29).
+[packages/core-api/src/apis/definitions/AlertApi.ts:29](https://github.com/backstage/backstage/blob/ca535f2f66c3a4980c80f4b1a049dfd07569010e/packages/core-api/src/apis/definitions/AlertApi.ts#L29).
The following Utility API implements this type: [alertApiRef](./README.md#alert)
@@ -38,7 +38,7 @@ export type AlertMessage = {
Defined at
-[packages/core-api/src/apis/definitions/AlertApi.ts:19](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/apis/definitions/AlertApi.ts#L19).
+[packages/core-api/src/apis/definitions/AlertApi.ts:19](https://github.com/backstage/backstage/blob/ca535f2f66c3a4980c80f4b1a049dfd07569010e/packages/core-api/src/apis/definitions/AlertApi.ts#L19).
Referenced by: [post](#post), [alert\$](#alert).
@@ -67,13 +67,13 @@ export type Observable<T> = {
Defined at
-[packages/core-api/src/types.ts:53](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/types.ts#L53).
+[packages/core-api/src/types.ts:53](https://github.com/backstage/backstage/blob/ca535f2f66c3a4980c80f4b1a049dfd07569010e/packages/core-api/src/types.ts#L53).
Referenced by: [alert\$](#alert).
### Observer
-This file contains non-react related core types used through Backstage.
+This file contains non-react related core types used throughout Backstage.
Observer interface for consuming an Observer, see TC39.
@@ -86,7 +86,7 @@ export type Observer<T> = {
Defined at
-[packages/core-api/src/types.ts:24](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/types.ts#L24).
+[packages/core-api/src/types.ts:24](https://github.com/backstage/backstage/blob/ca535f2f66c3a4980c80f4b1a049dfd07569010e/packages/core-api/src/types.ts#L24).
Referenced by: [Observable](#observable).
@@ -109,6 +109,6 @@ export type Subscription = {
Defined at
-[packages/core-api/src/types.ts:33](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/types.ts#L33).
+[packages/core-api/src/types.ts:33](https://github.com/backstage/backstage/blob/ca535f2f66c3a4980c80f4b1a049dfd07569010e/packages/core-api/src/types.ts#L33).
Referenced by: [Observable](#observable).
diff --git a/docs/reference/utility-apis/AppThemeApi.md b/docs/reference/utility-apis/AppThemeApi.md
index eb35eb38ef..0f5c095825 100644
--- a/docs/reference/utility-apis/AppThemeApi.md
+++ b/docs/reference/utility-apis/AppThemeApi.md
@@ -1,7 +1,7 @@
# AppThemeApi
The AppThemeApi type is defined at
-[packages/core-api/src/apis/definitions/AppThemeApi.ts:50](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/apis/definitions/AppThemeApi.ts#L50).
+[packages/core-api/src/apis/definitions/AppThemeApi.ts:56](https://github.com/backstage/backstage/blob/ca535f2f66c3a4980c80f4b1a049dfd07569010e/packages/core-api/src/apis/definitions/AppThemeApi.ts#L56).
The following Utility API implements this type:
[appThemeApiRef](./README.md#apptheme)
@@ -72,11 +72,16 @@ export type AppTheme = {
* The specialized MaterialUI theme instance.
*/
theme: BackstageTheme;
+
+ /**
+ * An Icon for the theme mode setting.
+ */
+ icon?: React.ReactElement<SvgIconProps>;
}
Defined at
-[packages/core-api/src/apis/definitions/AppThemeApi.ts:24](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/apis/definitions/AppThemeApi.ts#L24).
+[packages/core-api/src/apis/definitions/AppThemeApi.ts:25](https://github.com/backstage/backstage/blob/ca535f2f66c3a4980c80f4b1a049dfd07569010e/packages/core-api/src/apis/definitions/AppThemeApi.ts#L25).
Referenced by: [getInstalledThemes](#getinstalledthemes).
@@ -87,7 +92,7 @@ export type BackstagePalette = Palette & Palette
Defined at
-[packages/theme/src/types.ts:70](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/theme/src/types.ts#L70).
+[packages/theme/src/types.ts:74](https://github.com/backstage/backstage/blob/ca535f2f66c3a4980c80f4b1a049dfd07569010e/packages/theme/src/types.ts#L74).
Referenced by: [BackstageTheme](#backstagetheme).
@@ -96,11 +101,13 @@ Referenced by: [BackstageTheme](#backstagetheme).
Defined at
-[packages/theme/src/types.ts:73](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/theme/src/types.ts#L73).
+[packages/theme/src/types.ts:81](https://github.com/backstage/backstage/blob/ca535f2f66c3a4980c80f4b1a049dfd07569010e/packages/theme/src/types.ts#L81).
Referenced by: [AppTheme](#apptheme).
@@ -129,13 +136,13 @@ export type Observable<T> = {
Defined at
-[packages/core-api/src/types.ts:53](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/types.ts#L53).
+[packages/core-api/src/types.ts:53](https://github.com/backstage/backstage/blob/ca535f2f66c3a4980c80f4b1a049dfd07569010e/packages/core-api/src/types.ts#L53).
Referenced by: [activeThemeId\$](#activethemeid).
### Observer
-This file contains non-react related core types used through Backstage.
+This file contains non-react related core types used throughout Backstage.
Observer interface for consuming an Observer, see TC39.
@@ -148,10 +155,38 @@ export type Observer<T> = {
Defined at
-[packages/core-api/src/types.ts:24](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/types.ts#L24).
+[packages/core-api/src/types.ts:24](https://github.com/backstage/backstage/blob/ca535f2f66c3a4980c80f4b1a049dfd07569010e/packages/core-api/src/types.ts#L24).
Referenced by: [Observable](#observable).
+### PageTheme
+
+
Defined at
-[packages/theme/src/types.ts:23](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/theme/src/types.ts#L23).
+[packages/theme/src/types.ts:23](https://github.com/backstage/backstage/blob/ca535f2f66c3a4980c80f4b1a049dfd07569010e/packages/theme/src/types.ts#L23).
Referenced by: [BackstagePalette](#backstagepalette).
@@ -227,6 +266,6 @@ export type Subscription = {
Defined at
-[packages/core-api/src/types.ts:33](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/types.ts#L33).
+[packages/core-api/src/types.ts:33](https://github.com/backstage/backstage/blob/ca535f2f66c3a4980c80f4b1a049dfd07569010e/packages/core-api/src/types.ts#L33).
Referenced by: [Observable](#observable).
diff --git a/docs/reference/utility-apis/BackstageIdentityApi.md b/docs/reference/utility-apis/BackstageIdentityApi.md
index 529b73c576..dafdb7d55f 100644
--- a/docs/reference/utility-apis/BackstageIdentityApi.md
+++ b/docs/reference/utility-apis/BackstageIdentityApi.md
@@ -1,7 +1,7 @@
# BackstageIdentityApi
The BackstageIdentityApi type is defined at
-[packages/core-api/src/apis/definitions/auth.ts:134](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/apis/definitions/auth.ts#L134).
+[packages/core-api/src/apis/definitions/auth.ts:134](https://github.com/backstage/backstage/blob/ca535f2f66c3a4980c80f4b1a049dfd07569010e/packages/core-api/src/apis/definitions/auth.ts#L134).
The following Utility APIs implement this type:
@@ -19,6 +19,8 @@ The following Utility APIs implement this type:
- [oktaAuthApiRef](./README.md#oktaauth)
+- [samlAuthApiRef](./README.md#samlauth)
+
## Members
### getBackstageIdentity()
@@ -68,7 +70,7 @@ export type AuthRequestOptions = {
Defined at
-[packages/core-api/src/apis/definitions/auth.ts:40](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/apis/definitions/auth.ts#L40).
+[packages/core-api/src/apis/definitions/auth.ts:40](https://github.com/backstage/backstage/blob/ca535f2f66c3a4980c80f4b1a049dfd07569010e/packages/core-api/src/apis/definitions/auth.ts#L40).
Referenced by: [getBackstageIdentity](#getbackstageidentity).
@@ -89,6 +91,6 @@ export type BackstageIdentity = {
Defined at
-[packages/core-api/src/apis/definitions/auth.ts:147](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/apis/definitions/auth.ts#L147).
+[packages/core-api/src/apis/definitions/auth.ts:147](https://github.com/backstage/backstage/blob/ca535f2f66c3a4980c80f4b1a049dfd07569010e/packages/core-api/src/apis/definitions/auth.ts#L147).
Referenced by: [getBackstageIdentity](#getbackstageidentity).
diff --git a/docs/reference/utility-apis/Config.md b/docs/reference/utility-apis/Config.md
index b54e122c03..2ae047a700 100644
--- a/docs/reference/utility-apis/Config.md
+++ b/docs/reference/utility-apis/Config.md
@@ -1,7 +1,7 @@
# Config
The Config type is defined at
-[packages/config/src/types.ts:32](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/config/src/types.ts#L32).
+[packages/config/src/types.ts:32](https://github.com/backstage/backstage/blob/ca535f2f66c3a4980c80f4b1a049dfd07569010e/packages/config/src/types.ts#L32).
The following Utility API implements this type:
[configApiRef](./README.md#config)
@@ -140,7 +140,7 @@ export type Config = {
Defined at
-[packages/config/src/types.ts:32](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/config/src/types.ts#L32).
+[packages/config/src/types.ts:32](https://github.com/backstage/backstage/blob/ca535f2f66c3a4980c80f4b1a049dfd07569010e/packages/config/src/types.ts#L32).
Referenced by: [getConfig](#getconfig), [getOptionalConfig](#getoptionalconfig),
[getConfigArray](#getconfigarray),
@@ -153,7 +153,7 @@ export type JsonArray = JsonValue[]
Defined at
-[packages/config/src/types.ts:18](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/config/src/types.ts#L18).
+[packages/config/src/types.ts:18](https://github.com/backstage/backstage/blob/ca535f2f66c3a4980c80f4b1a049dfd07569010e/packages/config/src/types.ts#L18).
Referenced by: [JsonValue](#jsonvalue).
@@ -164,7 +164,7 @@ export type JsonObject = { [key in string]?: JsonValue
Defined at
-[packages/config/src/types.ts:17](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/config/src/types.ts#L17).
+[packages/config/src/types.ts:17](https://github.com/backstage/backstage/blob/ca535f2f66c3a4980c80f4b1a049dfd07569010e/packages/config/src/types.ts#L17).
Referenced by: [JsonValue](#jsonvalue).
@@ -181,7 +181,7 @@ export type JsonValue =
Defined at
-[packages/config/src/types.ts:19](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/config/src/types.ts#L19).
+[packages/config/src/types.ts:19](https://github.com/backstage/backstage/blob/ca535f2f66c3a4980c80f4b1a049dfd07569010e/packages/config/src/types.ts#L19).
Referenced by: [get](#get), [getOptional](#getoptional),
[JsonObject](#jsonobject), [JsonArray](#jsonarray), [Config](#config).
diff --git a/docs/reference/utility-apis/DiscoveryApi.md b/docs/reference/utility-apis/DiscoveryApi.md
index 24371c1729..ac278fdd97 100644
--- a/docs/reference/utility-apis/DiscoveryApi.md
+++ b/docs/reference/utility-apis/DiscoveryApi.md
@@ -1,7 +1,7 @@
# DiscoveryApi
The DiscoveryApi type is defined at
-[packages/core-api/src/apis/definitions/DiscoveryApi.ts:30](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/apis/definitions/DiscoveryApi.ts#L30).
+[packages/core-api/src/apis/definitions/DiscoveryApi.ts:30](https://github.com/backstage/backstage/blob/ca535f2f66c3a4980c80f4b1a049dfd07569010e/packages/core-api/src/apis/definitions/DiscoveryApi.ts#L30).
The following Utility API implements this type:
[discoveryApiRef](./README.md#discovery)
diff --git a/docs/reference/utility-apis/ErrorApi.md b/docs/reference/utility-apis/ErrorApi.md
index 762d2016d5..93f4f9cd48 100644
--- a/docs/reference/utility-apis/ErrorApi.md
+++ b/docs/reference/utility-apis/ErrorApi.md
@@ -1,7 +1,7 @@
# ErrorApi
The ErrorApi type is defined at
-[packages/core-api/src/apis/definitions/ErrorApi.ts:53](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/apis/definitions/ErrorApi.ts#L53).
+[packages/core-api/src/apis/definitions/ErrorApi.ts:53](https://github.com/backstage/backstage/blob/ca535f2f66c3a4980c80f4b1a049dfd07569010e/packages/core-api/src/apis/definitions/ErrorApi.ts#L53).
The following Utility API implements this type: [errorApiRef](./README.md#error)
@@ -41,7 +41,7 @@ type Error = {
Defined at
-[packages/core-api/src/apis/definitions/ErrorApi.ts:24](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/apis/definitions/ErrorApi.ts#L24).
+[packages/core-api/src/apis/definitions/ErrorApi.ts:24](https://github.com/backstage/backstage/blob/ca535f2f66c3a4980c80f4b1a049dfd07569010e/packages/core-api/src/apis/definitions/ErrorApi.ts#L24).
Referenced by: [post](#post), [error\$](#error).
@@ -58,7 +58,7 @@ export type ErrorContext = {
Defined at
-[packages/core-api/src/apis/definitions/ErrorApi.ts:33](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/apis/definitions/ErrorApi.ts#L33).
+[packages/core-api/src/apis/definitions/ErrorApi.ts:33](https://github.com/backstage/backstage/blob/ca535f2f66c3a4980c80f4b1a049dfd07569010e/packages/core-api/src/apis/definitions/ErrorApi.ts#L33).
Referenced by: [post](#post), [error\$](#error).
@@ -87,13 +87,13 @@ export type Observable<T> = {
Defined at
-[packages/core-api/src/types.ts:53](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/types.ts#L53).
+[packages/core-api/src/types.ts:53](https://github.com/backstage/backstage/blob/ca535f2f66c3a4980c80f4b1a049dfd07569010e/packages/core-api/src/types.ts#L53).
Referenced by: [error\$](#error).
### Observer
-This file contains non-react related core types used through Backstage.
+This file contains non-react related core types used throughout Backstage.
Observer interface for consuming an Observer, see TC39.
@@ -106,7 +106,7 @@ export type Observer<T> = {
Defined at
-[packages/core-api/src/types.ts:24](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/types.ts#L24).
+[packages/core-api/src/types.ts:24](https://github.com/backstage/backstage/blob/ca535f2f66c3a4980c80f4b1a049dfd07569010e/packages/core-api/src/types.ts#L24).
Referenced by: [Observable](#observable).
@@ -129,6 +129,6 @@ export type Subscription = {
Defined at
-[packages/core-api/src/types.ts:33](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/types.ts#L33).
+[packages/core-api/src/types.ts:33](https://github.com/backstage/backstage/blob/ca535f2f66c3a4980c80f4b1a049dfd07569010e/packages/core-api/src/types.ts#L33).
Referenced by: [Observable](#observable).
diff --git a/docs/reference/utility-apis/FeatureFlagsApi.md b/docs/reference/utility-apis/FeatureFlagsApi.md
index 8fbcb794fb..529d2ac5dc 100644
--- a/docs/reference/utility-apis/FeatureFlagsApi.md
+++ b/docs/reference/utility-apis/FeatureFlagsApi.md
@@ -1,27 +1,20 @@
# FeatureFlagsApi
The FeatureFlagsApi type is defined at
-[packages/core-api/src/apis/definitions/FeatureFlagsApi.ts:41](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/apis/definitions/FeatureFlagsApi.ts#L41).
+[packages/core-api/src/apis/definitions/FeatureFlagsApi.ts:60](https://github.com/backstage/backstage/blob/ca535f2f66c3a4980c80f4b1a049dfd07569010e/packages/core-api/src/apis/definitions/FeatureFlagsApi.ts#L60).
The following Utility API implements this type:
[featureFlagsApiRef](./README.md#featureflags)
## Members
-### registeredFeatureFlags
+### registerFlag()
-Store a list of registered feature flags.
+Registers a new feature flag. Once a feature flag has been registered it can be
+toggled by users, and read back to enable or disable features.
+
+## Supporting types
+
+These types are part of the API declaration, but may not be unique to this API.
+
+### FeatureFlag
+
+The feature flags API is used to toggle functionality to users across plugins
+and Backstage.
+
+Plugins can use this API to register feature flags that they have available for
+users to enable/disable, and this API will centralize the current user's state
+of which feature flags they would like to enable.
+
+This is ideal for Backstage plugins, as well as your own App, to trial
+incomplete or unstable upcoming features. Although there will be a common
+interface for users to enable and disable feature flags, this API acts as
+another way to enable/disable.
+
+
+
+Defined at
+[packages/core-api/src/apis/definitions/FeatureFlagsApi.ts:36](https://github.com/backstage/backstage/blob/ca535f2f66c3a4980c80f4b1a049dfd07569010e/packages/core-api/src/apis/definitions/FeatureFlagsApi.ts#L36).
+
+Referenced by: [FeatureFlagsSaveOptions](#featureflagssaveoptions).
+
+### FeatureFlagsSaveOptions
+
+Options to use when saving feature flags.
+
+
+export type FeatureFlagsSaveOptions = {
+ /**
+ * The new feature flag states to save.
+ */
+ states: Record<string, FeatureFlagState>;
+
+ /**
+ * Whether the saves states should be merged into the existing ones, or replace them.
+ *
+ * Defaults to false.
+ */
+ merge?: boolean;
+}
+
+
+Defined at
+[packages/core-api/src/apis/definitions/FeatureFlagsApi.ts:44](https://github.com/backstage/backstage/blob/ca535f2f66c3a4980c80f4b1a049dfd07569010e/packages/core-api/src/apis/definitions/FeatureFlagsApi.ts#L44).
+
+Referenced by: [save](#save).
diff --git a/docs/reference/utility-apis/IdentityApi.md b/docs/reference/utility-apis/IdentityApi.md
index 5ee5c582b6..a88aaf0b8a 100644
--- a/docs/reference/utility-apis/IdentityApi.md
+++ b/docs/reference/utility-apis/IdentityApi.md
@@ -1,7 +1,7 @@
# IdentityApi
The IdentityApi type is defined at
-[packages/core-api/src/apis/definitions/IdentityApi.ts:22](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/apis/definitions/IdentityApi.ts#L22).
+[packages/core-api/src/apis/definitions/IdentityApi.ts:22](https://github.com/backstage/backstage/blob/ca535f2f66c3a4980c80f4b1a049dfd07569010e/packages/core-api/src/apis/definitions/IdentityApi.ts#L22).
The following Utility API implements this type:
[identityApiRef](./README.md#identity)
@@ -76,6 +76,6 @@ export type ProfileInfo = {
Defined at
-[packages/core-api/src/apis/definitions/auth.ts:162](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/apis/definitions/auth.ts#L162).
+[packages/core-api/src/apis/definitions/auth.ts:162](https://github.com/backstage/backstage/blob/ca535f2f66c3a4980c80f4b1a049dfd07569010e/packages/core-api/src/apis/definitions/auth.ts#L162).
Referenced by: [getProfile](#getprofile).
diff --git a/docs/reference/utility-apis/OAuthApi.md b/docs/reference/utility-apis/OAuthApi.md
index a489db76c5..79b55812ef 100644
--- a/docs/reference/utility-apis/OAuthApi.md
+++ b/docs/reference/utility-apis/OAuthApi.md
@@ -1,7 +1,7 @@
# OAuthApi
The OAuthApi type is defined at
-[packages/core-api/src/apis/definitions/auth.ts:67](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/apis/definitions/auth.ts#L67).
+[packages/core-api/src/apis/definitions/auth.ts:67](https://github.com/backstage/backstage/blob/ca535f2f66c3a4980c80f4b1a049dfd07569010e/packages/core-api/src/apis/definitions/auth.ts#L67).
The following Utility APIs implement this type:
@@ -82,7 +82,7 @@ export type AuthRequestOptions = {
Defined at
-[packages/core-api/src/apis/definitions/auth.ts:40](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/apis/definitions/auth.ts#L40).
+[packages/core-api/src/apis/definitions/auth.ts:40](https://github.com/backstage/backstage/blob/ca535f2f66c3a4980c80f4b1a049dfd07569010e/packages/core-api/src/apis/definitions/auth.ts#L40).
Referenced by: [getAccessToken](#getaccesstoken).
@@ -108,6 +108,6 @@ export type OAuthScope = string | string[]
Defined at
-[packages/core-api/src/apis/definitions/auth.ts:38](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/apis/definitions/auth.ts#L38).
+[packages/core-api/src/apis/definitions/auth.ts:38](https://github.com/backstage/backstage/blob/ca535f2f66c3a4980c80f4b1a049dfd07569010e/packages/core-api/src/apis/definitions/auth.ts#L38).
Referenced by: [getAccessToken](#getaccesstoken).
diff --git a/docs/reference/utility-apis/OAuthRequestApi.md b/docs/reference/utility-apis/OAuthRequestApi.md
index 1328aabeec..f1c2311ce9 100644
--- a/docs/reference/utility-apis/OAuthRequestApi.md
+++ b/docs/reference/utility-apis/OAuthRequestApi.md
@@ -1,7 +1,7 @@
# OAuthRequestApi
The OAuthRequestApi type is defined at
-[packages/core-api/src/apis/definitions/OAuthRequestApi.ts:99](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/apis/definitions/OAuthRequestApi.ts#L99).
+[packages/core-api/src/apis/definitions/OAuthRequestApi.ts:99](https://github.com/backstage/backstage/blob/ca535f2f66c3a4980c80f4b1a049dfd07569010e/packages/core-api/src/apis/definitions/OAuthRequestApi.ts#L99).
The following Utility API implements this type:
[oauthRequestApiRef](./README.md#oauthrequest)
@@ -73,7 +73,7 @@ export type AuthProvider = {
Defined at
-[packages/core-api/src/apis/definitions/OAuthRequestApi.ts:27](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/apis/definitions/OAuthRequestApi.ts#L27).
+[packages/core-api/src/apis/definitions/OAuthRequestApi.ts:27](https://github.com/backstage/backstage/blob/ca535f2f66c3a4980c80f4b1a049dfd07569010e/packages/core-api/src/apis/definitions/OAuthRequestApi.ts#L27).
Referenced by: [AuthRequesterOptions](#authrequesteroptions),
[PendingAuthRequest](#pendingauthrequest).
@@ -97,7 +97,7 @@ export type AuthRequester<AuthResponse> = (
Defined at
-[packages/core-api/src/apis/definitions/OAuthRequestApi.ts:66](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/apis/definitions/OAuthRequestApi.ts#L66).
+[packages/core-api/src/apis/definitions/OAuthRequestApi.ts:66](https://github.com/backstage/backstage/blob/ca535f2f66c3a4980c80f4b1a049dfd07569010e/packages/core-api/src/apis/definitions/OAuthRequestApi.ts#L66).
Referenced by: [createAuthRequester](#createauthrequester).
@@ -122,7 +122,7 @@ export type AuthRequesterOptions<AuthResponse> = {
Defined at
-[packages/core-api/src/apis/definitions/OAuthRequestApi.ts:43](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/apis/definitions/OAuthRequestApi.ts#L43).
+[packages/core-api/src/apis/definitions/OAuthRequestApi.ts:43](https://github.com/backstage/backstage/blob/ca535f2f66c3a4980c80f4b1a049dfd07569010e/packages/core-api/src/apis/definitions/OAuthRequestApi.ts#L43).
Referenced by: [createAuthRequester](#createauthrequester).
@@ -151,13 +151,13 @@ export type Observable<T> = {
Defined at
-[packages/core-api/src/types.ts:53](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/types.ts#L53).
+[packages/core-api/src/types.ts:53](https://github.com/backstage/backstage/blob/ca535f2f66c3a4980c80f4b1a049dfd07569010e/packages/core-api/src/types.ts#L53).
Referenced by: [authRequest\$](#authrequest).
### Observer
-This file contains non-react related core types used through Backstage.
+This file contains non-react related core types used throughout Backstage.
Observer interface for consuming an Observer, see TC39.
@@ -170,7 +170,7 @@ export type Observer<T> = {
Defined at
-[packages/core-api/src/types.ts:24](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/types.ts#L24).
+[packages/core-api/src/types.ts:24](https://github.com/backstage/backstage/blob/ca535f2f66c3a4980c80f4b1a049dfd07569010e/packages/core-api/src/types.ts#L24).
Referenced by: [Observable](#observable).
@@ -205,7 +205,7 @@ export type PendingAuthRequest = {
Defined at
-[packages/core-api/src/apis/definitions/OAuthRequestApi.ts:77](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/apis/definitions/OAuthRequestApi.ts#L77).
+[packages/core-api/src/apis/definitions/OAuthRequestApi.ts:77](https://github.com/backstage/backstage/blob/ca535f2f66c3a4980c80f4b1a049dfd07569010e/packages/core-api/src/apis/definitions/OAuthRequestApi.ts#L77).
Referenced by: [authRequest\$](#authrequest).
@@ -228,6 +228,6 @@ export type Subscription = {
Defined at
-[packages/core-api/src/types.ts:33](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/types.ts#L33).
+[packages/core-api/src/types.ts:33](https://github.com/backstage/backstage/blob/ca535f2f66c3a4980c80f4b1a049dfd07569010e/packages/core-api/src/types.ts#L33).
Referenced by: [Observable](#observable).
diff --git a/docs/reference/utility-apis/OpenIdConnectApi.md b/docs/reference/utility-apis/OpenIdConnectApi.md
index efd79593d6..eaea530708 100644
--- a/docs/reference/utility-apis/OpenIdConnectApi.md
+++ b/docs/reference/utility-apis/OpenIdConnectApi.md
@@ -1,7 +1,7 @@
# OpenIdConnectApi
The OpenIdConnectApi type is defined at
-[packages/core-api/src/apis/definitions/auth.ts:99](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/apis/definitions/auth.ts#L99).
+[packages/core-api/src/apis/definitions/auth.ts:99](https://github.com/backstage/backstage/blob/ca535f2f66c3a4980c80f4b1a049dfd07569010e/packages/core-api/src/apis/definitions/auth.ts#L99).
The following Utility APIs implement this type:
@@ -66,6 +66,6 @@ export type AuthRequestOptions = {
Defined at
-[packages/core-api/src/apis/definitions/auth.ts:40](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/apis/definitions/auth.ts#L40).
+[packages/core-api/src/apis/definitions/auth.ts:40](https://github.com/backstage/backstage/blob/ca535f2f66c3a4980c80f4b1a049dfd07569010e/packages/core-api/src/apis/definitions/auth.ts#L40).
Referenced by: [getIdToken](#getidtoken).
diff --git a/docs/reference/utility-apis/ProfileInfoApi.md b/docs/reference/utility-apis/ProfileInfoApi.md
index 402b5ba504..76d04045e8 100644
--- a/docs/reference/utility-apis/ProfileInfoApi.md
+++ b/docs/reference/utility-apis/ProfileInfoApi.md
@@ -1,7 +1,7 @@
# ProfileInfoApi
The ProfileInfoApi type is defined at
-[packages/core-api/src/apis/definitions/auth.ts:117](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/apis/definitions/auth.ts#L117).
+[packages/core-api/src/apis/definitions/auth.ts:117](https://github.com/backstage/backstage/blob/ca535f2f66c3a4980c80f4b1a049dfd07569010e/packages/core-api/src/apis/definitions/auth.ts#L117).
The following Utility APIs implement this type:
@@ -19,6 +19,8 @@ The following Utility APIs implement this type:
- [oktaAuthApiRef](./README.md#oktaauth)
+- [samlAuthApiRef](./README.md#samlauth)
+
## Members
### getProfile()
@@ -65,7 +67,7 @@ export type AuthRequestOptions = {
Defined at
-[packages/core-api/src/apis/definitions/auth.ts:40](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/apis/definitions/auth.ts#L40).
+[packages/core-api/src/apis/definitions/auth.ts:40](https://github.com/backstage/backstage/blob/ca535f2f66c3a4980c80f4b1a049dfd07569010e/packages/core-api/src/apis/definitions/auth.ts#L40).
Referenced by: [getProfile](#getprofile).
@@ -93,6 +95,6 @@ export type ProfileInfo = {
Defined at
-[packages/core-api/src/apis/definitions/auth.ts:162](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/apis/definitions/auth.ts#L162).
+[packages/core-api/src/apis/definitions/auth.ts:162](https://github.com/backstage/backstage/blob/ca535f2f66c3a4980c80f4b1a049dfd07569010e/packages/core-api/src/apis/definitions/auth.ts#L162).
Referenced by: [getProfile](#getprofile).
diff --git a/docs/reference/utility-apis/README.md b/docs/reference/utility-apis/README.md
index 71931a5d5a..1ef5b6197e 100644
--- a/docs/reference/utility-apis/README.md
+++ b/docs/reference/utility-apis/README.md
@@ -3,7 +3,7 @@
The following is a list of all Utility APIs defined by `@backstage/core`. They
are available to use by plugins and components, and can be accessed using the
`useApi` hook, also provided by `@backstage/core`. For more information, see
-https://github.com/spotify/backstage/blob/master/docs/api/utility-apis.md.
+https://github.com/backstage/backstage/blob/master/docs/api/utility-apis.md.
### alert
@@ -12,7 +12,7 @@ Used to report alerts and forward them to the app
Implemented type: [AlertApi](./AlertApi.md)
ApiRef:
-[alertApiRef](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/apis/definitions/AlertApi.ts#L41)
+[alertApiRef](https://github.com/backstage/backstage/blob/ca535f2f66c3a4980c80f4b1a049dfd07569010e/packages/core-api/src/apis/definitions/AlertApi.ts#L41)
### appTheme
@@ -21,7 +21,7 @@ API Used to configure the app theme, and enumerate options
Implemented type: [AppThemeApi](./AppThemeApi.md)
ApiRef:
-[appThemeApiRef](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/apis/definitions/AppThemeApi.ts#L74)
+[appThemeApiRef](https://github.com/backstage/backstage/blob/ca535f2f66c3a4980c80f4b1a049dfd07569010e/packages/core-api/src/apis/definitions/AppThemeApi.ts#L80)
### auth0Auth
@@ -32,7 +32,7 @@ Implemented types: [OpenIdConnectApi](./OpenIdConnectApi.md),
[BackstageIdentityApi](./BackstageIdentityApi.md), [SessionApi](./SessionApi.md)
ApiRef:
-[auth0AuthApiRef](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/apis/definitions/auth.ts#L275)
+[auth0AuthApiRef](https://github.com/backstage/backstage/blob/ca535f2f66c3a4980c80f4b1a049dfd07569010e/packages/core-api/src/apis/definitions/auth.ts#L275)
### config
@@ -41,7 +41,7 @@ Used to access runtime configuration
Implemented type: [Config](./Config.md)
ApiRef:
-[configApiRef](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/apis/definitions/ConfigApi.ts#L22)
+[configApiRef](https://github.com/backstage/backstage/blob/ca535f2f66c3a4980c80f4b1a049dfd07569010e/packages/core-api/src/apis/definitions/ConfigApi.ts#L22)
### discovery
@@ -50,7 +50,7 @@ Provides service discovery of backend plugins
Implemented type: [DiscoveryApi](./DiscoveryApi.md)
ApiRef:
-[discoveryApiRef](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/apis/definitions/DiscoveryApi.ts#L44)
+[discoveryApiRef](https://github.com/backstage/backstage/blob/ca535f2f66c3a4980c80f4b1a049dfd07569010e/packages/core-api/src/apis/definitions/DiscoveryApi.ts#L44)
### error
@@ -59,7 +59,7 @@ Used to report errors and forward them to the app
Implemented type: [ErrorApi](./ErrorApi.md)
ApiRef:
-[errorApiRef](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/apis/definitions/ErrorApi.ts#L65)
+[errorApiRef](https://github.com/backstage/backstage/blob/ca535f2f66c3a4980c80f4b1a049dfd07569010e/packages/core-api/src/apis/definitions/ErrorApi.ts#L65)
### featureFlags
@@ -68,7 +68,7 @@ Used to toggle functionality in features across Backstage
Implemented type: [FeatureFlagsApi](./FeatureFlagsApi.md)
ApiRef:
-[featureFlagsApiRef](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/apis/definitions/FeatureFlagsApi.ts#L58)
+[featureFlagsApiRef](https://github.com/backstage/backstage/blob/ca535f2f66c3a4980c80f4b1a049dfd07569010e/packages/core-api/src/apis/definitions/FeatureFlagsApi.ts#L83)
### githubAuth
@@ -79,7 +79,7 @@ Implemented types: [OAuthApi](./OAuthApi.md),
[BackstageIdentityApi](./BackstageIdentityApi.md), [SessionApi](./SessionApi.md)
ApiRef:
-[githubAuthApiRef](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/apis/definitions/auth.ts#L232)
+[githubAuthApiRef](https://github.com/backstage/backstage/blob/ca535f2f66c3a4980c80f4b1a049dfd07569010e/packages/core-api/src/apis/definitions/auth.ts#L232)
### gitlabAuth
@@ -90,7 +90,7 @@ Implemented types: [OAuthApi](./OAuthApi.md),
[BackstageIdentityApi](./BackstageIdentityApi.md), [SessionApi](./SessionApi.md)
ApiRef:
-[gitlabAuthApiRef](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/apis/definitions/auth.ts#L262)
+[gitlabAuthApiRef](https://github.com/backstage/backstage/blob/ca535f2f66c3a4980c80f4b1a049dfd07569010e/packages/core-api/src/apis/definitions/auth.ts#L262)
### googleAuth
@@ -102,7 +102,7 @@ Implemented types: [OAuthApi](./OAuthApi.md),
[BackstageIdentityApi](./BackstageIdentityApi.md), [SessionApi](./SessionApi.md)
ApiRef:
-[googleAuthApiRef](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/apis/definitions/auth.ts#L215)
+[googleAuthApiRef](https://github.com/backstage/backstage/blob/ca535f2f66c3a4980c80f4b1a049dfd07569010e/packages/core-api/src/apis/definitions/auth.ts#L215)
### identity
@@ -111,7 +111,7 @@ Provides access to the identity of the signed in user
Implemented type: [IdentityApi](./IdentityApi.md)
ApiRef:
-[identityApiRef](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/apis/definitions/IdentityApi.ts#L54)
+[identityApiRef](https://github.com/backstage/backstage/blob/ca535f2f66c3a4980c80f4b1a049dfd07569010e/packages/core-api/src/apis/definitions/IdentityApi.ts#L54)
### microsoftAuth
@@ -123,7 +123,7 @@ Implemented types: [OAuthApi](./OAuthApi.md),
[BackstageIdentityApi](./BackstageIdentityApi.md), [SessionApi](./SessionApi.md)
ApiRef:
-[microsoftAuthApiRef](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/apis/definitions/auth.ts#L289)
+[microsoftAuthApiRef](https://github.com/backstage/backstage/blob/ca535f2f66c3a4980c80f4b1a049dfd07569010e/packages/core-api/src/apis/definitions/auth.ts#L289)
### oauth2
@@ -135,7 +135,7 @@ Implemented types: [OAuthApi](./OAuthApi.md),
[BackstageIdentityApi](./BackstageIdentityApi.md), [SessionApi](./SessionApi.md)
ApiRef:
-[oauth2ApiRef](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/apis/definitions/auth.ts#L303)
+[oauth2ApiRef](https://github.com/backstage/backstage/blob/ca535f2f66c3a4980c80f4b1a049dfd07569010e/packages/core-api/src/apis/definitions/auth.ts#L303)
### oauthRequest
@@ -144,7 +144,7 @@ An API for implementing unified OAuth flows in Backstage
Implemented type: [OAuthRequestApi](./OAuthRequestApi.md)
ApiRef:
-[oauthRequestApiRef](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/apis/definitions/OAuthRequestApi.ts#L130)
+[oauthRequestApiRef](https://github.com/backstage/backstage/blob/ca535f2f66c3a4980c80f4b1a049dfd07569010e/packages/core-api/src/apis/definitions/OAuthRequestApi.ts#L130)
### oktaAuth
@@ -156,7 +156,17 @@ Implemented types: [OAuthApi](./OAuthApi.md),
[BackstageIdentityApi](./BackstageIdentityApi.md), [SessionApi](./SessionApi.md)
ApiRef:
-[oktaAuthApiRef](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/apis/definitions/auth.ts#L245)
+[oktaAuthApiRef](https://github.com/backstage/backstage/blob/ca535f2f66c3a4980c80f4b1a049dfd07569010e/packages/core-api/src/apis/definitions/auth.ts#L245)
+
+### samlAuth
+
+Example of how to use SAML custom provider
+
+Implemented types: [ProfileInfoApi](./ProfileInfoApi.md),
+[BackstageIdentityApi](./BackstageIdentityApi.md), [SessionApi](./SessionApi.md)
+
+ApiRef:
+[samlAuthApiRef](https://github.com/backstage/backstage/blob/ca535f2f66c3a4980c80f4b1a049dfd07569010e/packages/core-api/src/apis/definitions/auth.ts#L317)
### storage
@@ -165,4 +175,4 @@ Provides the ability to store data which is unique to the user
Implemented type: [StorageApi](./StorageApi.md)
ApiRef:
-[storageApiRef](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/apis/definitions/StorageApi.ts#L68)
+[storageApiRef](https://github.com/backstage/backstage/blob/ca535f2f66c3a4980c80f4b1a049dfd07569010e/packages/core-api/src/apis/definitions/StorageApi.ts#L68)
diff --git a/docs/reference/utility-apis/SessionApi.md b/docs/reference/utility-apis/SessionApi.md
index e7a9e58c59..7d271558d6 100644
--- a/docs/reference/utility-apis/SessionApi.md
+++ b/docs/reference/utility-apis/SessionApi.md
@@ -1,7 +1,7 @@
# SessionApi
The SessionApi type is defined at
-[packages/core-api/src/apis/definitions/auth.ts:190](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/apis/definitions/auth.ts#L190).
+[packages/core-api/src/apis/definitions/auth.ts:190](https://github.com/backstage/backstage/blob/ca535f2f66c3a4980c80f4b1a049dfd07569010e/packages/core-api/src/apis/definitions/auth.ts#L190).
The following Utility APIs implement this type:
@@ -19,6 +19,8 @@ The following Utility APIs implement this type:
- [oktaAuthApiRef](./README.md#oktaauth)
+- [samlAuthApiRef](./README.md#samlauth)
+
## Members
### signIn()
@@ -75,13 +77,13 @@ export type Observable<T> = {
Defined at
-[packages/core-api/src/types.ts:53](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/types.ts#L53).
+[packages/core-api/src/types.ts:53](https://github.com/backstage/backstage/blob/ca535f2f66c3a4980c80f4b1a049dfd07569010e/packages/core-api/src/types.ts#L53).
Referenced by: [sessionState\$](#sessionstate).
### Observer
-This file contains non-react related core types used through Backstage.
+This file contains non-react related core types used throughout Backstage.
Observer interface for consuming an Observer, see TC39.
@@ -94,7 +96,7 @@ export type Observer<T> = {
Defined at
-[packages/core-api/src/types.ts:24](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/types.ts#L24).
+[packages/core-api/src/types.ts:24](https://github.com/backstage/backstage/blob/ca535f2f66c3a4980c80f4b1a049dfd07569010e/packages/core-api/src/types.ts#L24).
Referenced by: [Observable](#observable).
@@ -110,7 +112,7 @@ export enum SessionState {
Defined at
-[packages/core-api/src/apis/definitions/auth.ts:182](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/apis/definitions/auth.ts#L182).
+[packages/core-api/src/apis/definitions/auth.ts:182](https://github.com/backstage/backstage/blob/ca535f2f66c3a4980c80f4b1a049dfd07569010e/packages/core-api/src/apis/definitions/auth.ts#L182).
Referenced by: [sessionState\$](#sessionstate).
@@ -133,6 +135,6 @@ export type Subscription = {
Defined at
-[packages/core-api/src/types.ts:33](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/types.ts#L33).
+[packages/core-api/src/types.ts:33](https://github.com/backstage/backstage/blob/ca535f2f66c3a4980c80f4b1a049dfd07569010e/packages/core-api/src/types.ts#L33).
Referenced by: [Observable](#observable).
diff --git a/docs/reference/utility-apis/SessionStateApi.md b/docs/reference/utility-apis/SessionStateApi.md
index 81f25aa349..a8a4c3bc3d 100644
--- a/docs/reference/utility-apis/SessionStateApi.md
+++ b/docs/reference/utility-apis/SessionStateApi.md
@@ -1,7 +1,7 @@
# SessionStateApi
The SessionStateApi type is defined at
-[packages/core-api/src/apis/definitions/auth.ts:201](https://github.com/spotify/backstage/blob/82d329555c16af46db9b4e5cd2f44a3cc006a52e/packages/core-api/src/apis/definitions/auth.ts#L201).
+[packages/core-api/src/apis/definitions/auth.ts:201](https://github.com/backstage/backstage/blob/82d329555c16af46db9b4e5cd2f44a3cc006a52e/packages/core-api/src/apis/definitions/auth.ts#L201).
The following Utility APIs implement this type:
@@ -56,7 +56,7 @@ export type Observable<T> = {
Defined at
-[packages/core-api/src/types.ts:53](https://github.com/spotify/backstage/blob/82d329555c16af46db9b4e5cd2f44a3cc006a52e/packages/core-api/src/types.ts#L53).
+[packages/core-api/src/types.ts:53](https://github.com/backstage/backstage/blob/82d329555c16af46db9b4e5cd2f44a3cc006a52e/packages/core-api/src/types.ts#L53).
Referenced by: [sessionState\$](#sessionstate).
@@ -75,7 +75,7 @@ export type Observer<T> = {
Defined at
-[packages/core-api/src/types.ts:24](https://github.com/spotify/backstage/blob/82d329555c16af46db9b4e5cd2f44a3cc006a52e/packages/core-api/src/types.ts#L24).
+[packages/core-api/src/types.ts:24](https://github.com/backstage/backstage/blob/82d329555c16af46db9b4e5cd2f44a3cc006a52e/packages/core-api/src/types.ts#L24).
Referenced by: [Observable](#observable).
@@ -91,7 +91,7 @@ export enum SessionState {
Defined at
-[packages/core-api/src/apis/definitions/auth.ts:192](https://github.com/spotify/backstage/blob/82d329555c16af46db9b4e5cd2f44a3cc006a52e/packages/core-api/src/apis/definitions/auth.ts#L192).
+[packages/core-api/src/apis/definitions/auth.ts:192](https://github.com/backstage/backstage/blob/82d329555c16af46db9b4e5cd2f44a3cc006a52e/packages/core-api/src/apis/definitions/auth.ts#L192).
Referenced by: [sessionState\$](#sessionstate).
@@ -114,6 +114,6 @@ export type Subscription = {
Defined at
-[packages/core-api/src/types.ts:33](https://github.com/spotify/backstage/blob/82d329555c16af46db9b4e5cd2f44a3cc006a52e/packages/core-api/src/types.ts#L33).
+[packages/core-api/src/types.ts:33](https://github.com/backstage/backstage/blob/82d329555c16af46db9b4e5cd2f44a3cc006a52e/packages/core-api/src/types.ts#L33).
Referenced by: [Observable](#observable).
diff --git a/docs/reference/utility-apis/StorageApi.md b/docs/reference/utility-apis/StorageApi.md
index e7d5131ff9..6c5595d3d8 100644
--- a/docs/reference/utility-apis/StorageApi.md
+++ b/docs/reference/utility-apis/StorageApi.md
@@ -1,7 +1,7 @@
# StorageApi
The StorageApi type is defined at
-[packages/core-api/src/apis/definitions/StorageApi.ts:31](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/apis/definitions/StorageApi.ts#L31).
+[packages/core-api/src/apis/definitions/StorageApi.ts:31](https://github.com/backstage/backstage/blob/ca535f2f66c3a4980c80f4b1a049dfd07569010e/packages/core-api/src/apis/definitions/StorageApi.ts#L31).
The following Utility API implements this type:
[storageApiRef](./README.md#storage)
@@ -79,13 +79,13 @@ export type Observable<T> = {
Defined at
-[packages/core-api/src/types.ts:53](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/types.ts#L53).
+[packages/core-api/src/types.ts:53](https://github.com/backstage/backstage/blob/ca535f2f66c3a4980c80f4b1a049dfd07569010e/packages/core-api/src/types.ts#L53).
Referenced by: [observe\$](#observe), [StorageApi](#storageapi).
### Observer
-This file contains non-react related core types used through Backstage.
+This file contains non-react related core types used throughout Backstage.
Observer interface for consuming an Observer, see TC39.
@@ -98,7 +98,7 @@ export type Observer<T> = {
Defined at
-[packages/core-api/src/types.ts:24](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/types.ts#L24).
+[packages/core-api/src/types.ts:24](https://github.com/backstage/backstage/blob/ca535f2f66c3a4980c80f4b1a049dfd07569010e/packages/core-api/src/types.ts#L24).
Referenced by: [Observable](#observable).
@@ -144,7 +144,7 @@ export interface StorageApi {
Defined at
-[packages/core-api/src/apis/definitions/StorageApi.ts:31](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/apis/definitions/StorageApi.ts#L31).
+[packages/core-api/src/apis/definitions/StorageApi.ts:31](https://github.com/backstage/backstage/blob/ca535f2f66c3a4980c80f4b1a049dfd07569010e/packages/core-api/src/apis/definitions/StorageApi.ts#L31).
Referenced by: [forBucket](#forbucket).
@@ -158,7 +158,7 @@ export type StorageValueChange<T = any> = {
Defined at
-[packages/core-api/src/apis/definitions/StorageApi.ts:21](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/apis/definitions/StorageApi.ts#L21).
+[packages/core-api/src/apis/definitions/StorageApi.ts:21](https://github.com/backstage/backstage/blob/ca535f2f66c3a4980c80f4b1a049dfd07569010e/packages/core-api/src/apis/definitions/StorageApi.ts#L21).
Referenced by: [observe\$](#observe), [StorageApi](#storageapi).
@@ -181,6 +181,6 @@ export type Subscription = {
Defined at
-[packages/core-api/src/types.ts:33](https://github.com/spotify/backstage/blob/0406ace29aba7332a98ff9ef9feedd65adc75223/packages/core-api/src/types.ts#L33).
+[packages/core-api/src/types.ts:33](https://github.com/backstage/backstage/blob/ca535f2f66c3a4980c80f4b1a049dfd07569010e/packages/core-api/src/types.ts#L33).
Referenced by: [Observable](#observable).
diff --git a/docs/support/project-structure.md b/docs/support/project-structure.md
index 9720c4db3e..a30288e85e 100644
--- a/docs/support/project-structure.md
+++ b/docs/support/project-structure.md
@@ -15,48 +15,48 @@ In the project root, there are a set of files and folders which are not part of
the project as such, and may or may not be familiar to someone looking through
the code.
-- [`.changeset/`](https://github.com/spotify/backstage/tree/master/.changeset) -
+- [`.changeset/`](https://github.com/backstage/backstage/tree/master/.changeset) -
This folder contains files outlining which changes occurred in the project
since the last release. These files are added manually, but managed by
[changesets](https://github.com/atlassian/changesets) and will be removed at
every new release. They are essentially building-blocks of a CHANGELOG.
-- [`.github/`](https://github.com/spotify/backstage/tree/master/.github) -
+- [`.github/`](https://github.com/backstage/backstage/tree/master/.github) -
Standard GitHub folder. It contains - amongst other things - our workflow
definitions and templates. Worth noting is the
- [styles](https://github.com/spotify/backstage/tree/master/.github/styles)
+ [styles](https://github.com/backstage/backstage/tree/master/.github/styles)
folder which is used for a markdown spellchecker.
-- [`.yarn/`](https://github.com/spotify/backstage/tree/master/.yarn) - Backstage
- ships with it's own `yarn` implementation. This allows us to have better
- control over our `yarn.lock` file and hopefully avoid problems due to yarn
- versioning differences.
+- [`.yarn/`](https://github.com/backstage/backstage/tree/master/.yarn) -
+ Backstage ships with it's own `yarn` implementation. This allows us to have
+ better control over our `yarn.lock` file and hopefully avoid problems due to
+ yarn versioning differences.
-- [`docker/`](https://github.com/spotify/backstage/tree/master/docker) - Files
+- [`docker/`](https://github.com/backstage/backstage/tree/master/docker) - Files
related to our root Dockerfile. We are planning to refactor this, so expect
this folder to be moved in the future.
-- [`contrib/`](https://github.com/spotify/backstage/tree/master/contrib) -
+- [`contrib/`](https://github.com/backstage/backstage/tree/master/contrib) -
Collection of examples or resources provided by the community. We really
appreciate contributions in here and encourage them being kept up to date.
-- [`docs/`](https://github.com/spotify/backstage/tree/master/docs) - This is
- where we keep all of our documentation Markdown files. These ends up on
- http://backstage.io/docs. Just keep in mind that changes to the
- [`sidebars.json`](https://github.com/spotify/backstage/blob/master/microsite/sidebars.json)
+- [`docs/`](https://github.com/backstage/backstage/tree/master/docs) - This is
+ where we keep all of our documentation Markdown files. These end up on
+ https://backstage.io/docs. Just keep in mind that changes to the
+ [`sidebars.json`](https://github.com/backstage/backstage/blob/master/microsite/sidebars.json)
file may be needed as sections are added/removed.
-- [`.editorconfig`](https://github.com/spotify/backstage/tree/master/.editorconfig) -
+- [`.editorconfig`](https://github.com/backstage/backstage/tree/master/.editorconfig) -
A configuration file used by most common code editors.
-- [`.imgbotconfig`](https://github.com/spotify/backstage/tree/master/.imgbotconfig) -
+- [`.imgbotconfig`](https://github.com/backstage/backstage/tree/master/.imgbotconfig) -
Configuration for a [bot](https://imgbot.net/)
## Monorepo packages
Every folder in both `packages/` and `plugins/` is within our monorepo setup, as
defined in
-[`package.json`](https://github.com/spotify/backstage/blob/master/package.json):
+[`package.json`](https://github.com/backstage/backstage/blob/master/package.json):
```json
"workspaces": {
@@ -74,30 +74,36 @@ Let's look at them individually.
These are all the packages that we use within the project. [Plugins](#plugins)
are separated out into their own folder, see further down.
-- [`app/`](https://github.com/spotify/backstage/tree/master/packages/app) - This
- is our take on how an App could look like, bringing together a set of packages
- and plugins into a working Backstage App. This is not a published package, and
- the main goals are to provide a demo of what an App could look like and to
- enable local development.
+- [`app/`](https://github.com/backstage/backstage/tree/master/packages/app) -
+ This is our take on how an App could look like, bringing together a set of
+ packages and plugins into a working Backstage App. This is not a published
+ package, and the main goals are to provide a demo of what an App could look
+ like and to enable local development.
-- [`backend/`](https://github.com/spotify/backstage/tree/master/packages/backend) -
+- [`backend/`](https://github.com/backstage/backstage/tree/master/packages/backend) -
Every standalone Backstage project will have both an `app` _and_ a `backend`
package. The `backend` uses plugins to construct a working backend that the
frontend (`app`) can use.
-- [`backend-common/`](https://github.com/spotify/backstage/tree/master/packages/backend-common) -
+- [`backend-common/`](https://github.com/backstage/backstage/tree/master/packages/backend-common) -
There are no "core" packages in the backend. Instead we have `backend-common`
which contains helper middleware and other utils.
-- [`catalog-model/`](https://github.com/spotify/backstage/tree/master/packages/catalog-model) -
+- [`catalog-client`](https://github.com/backstage/backstage/tree/master/packages/catalog-client) -
+ An isomorphic client to interact with the Software Catalog. Backend plugins
+ can use the package directly. Frontend plugins can use the client by using
+ `@backstage/plugin-catalog` in combination with `useApi` and the
+ `catalogApiRef`.
+
+- [`catalog-model/`](https://github.com/backstage/backstage/tree/master/packages/catalog-model) -
You can consider this to be a library for working with the catalog of sorts.
It contains the definition of an
[Entity](https://backstage.io/docs/features/software-catalog/references#docsNav),
as well as validation and other logic related to it. This package can be used
in both the frontend and the backend.
-- [`cli/`](https://github.com/spotify/backstage/tree/master/packages/cli) - One
- of the biggest packages in our project, the `cli` is used to build, serve,
+- [`cli/`](https://github.com/backstage/backstage/tree/master/packages/cli) -
+ One of the biggest packages in our project, the `cli` is used to build, serve,
diff, create-plugins and more. In the early days of this project, we started
out with calling tools directly - such as `eslint` - through `package.json`.
But as it was tricky to have a good development experience around that when we
@@ -105,86 +111,89 @@ are separated out into their own folder, see further down.
everything looks the same in `package.json`. Much like
[react-scripts](https://github.com/facebook/create-react-app/tree/master/packages/react-scripts).
-- [`cli-common/`](https://github.com/spotify/backstage/tree/master/packages/cli-common) -
+- [`cli-common/`](https://github.com/backstage/backstage/tree/master/packages/cli-common) -
This package mainly handles path resolving. It is a separate package to reduce
- bugs in [cli](https://github.com/spotify/backstage/tree/master/packages/cli).
- We also want as few dependencies as possible to reduce download time when
- running the cli which is another reason this is a separate package.
+ bugs in
+ [cli](https://github.com/backstage/backstage/tree/master/packages/cli). We
+ also want as few dependencies as possible to reduce download time when running
+ the cli which is another reason this is a separate package.
-- [`config/`](https://github.com/spotify/backstage/tree/master/packages/config) -
+- [`config/`](https://github.com/backstage/backstage/tree/master/packages/config) -
The way we read configuration data. This package can take a bunch of config
objects and merge them together.
- [app-config.yaml](https://github.com/spotify/backstage/blob/master/app-config.yaml)
+ [app-config.yaml](https://github.com/backstage/backstage/blob/master/app-config.yaml)
is an example of an config object.
-- [`config-loader/`](https://github.com/spotify/backstage/tree/master/packages/config-loader) -
+- [`config-loader/`](https://github.com/backstage/backstage/tree/master/packages/config-loader) -
This package is used to read config objects. It does not know how to merge,
but only reads files and passes them on to the config. As this part is only
used by the backend, we chose to separate `config` and `config-loader` into
two different packages.
-- [`core/`](https://github.com/spotify/backstage/tree/master/packages/core) -
+- [`core/`](https://github.com/backstage/backstage/tree/master/packages/core) -
This package contains our visual React components, some of which you can find
in
[plugin examples](https://backstage.io/storybook/?path=/story/plugins-examples--plugin-with-data).
Apart from that it re-exports everything from [`core-api`] so that users only
need to rely on one package.
-- [`core-api/`](https://github.com/spotify/backstage/tree/master/packages/core-api) -
+- [`core-api/`](https://github.com/backstage/backstage/tree/master/packages/core-api) -
This package contains APIs and definitions of such. It is it's own package
because we needed to split our `test-utils` package. It's an implementation
detail that we try to hide from our users, and no one should have to depend on
it directly.
-- [`test-utils/`](https://github.com/spotify/backstage/tree/master/packages/test-utils) -
+- [`test-utils/`](https://github.com/backstage/backstage/tree/master/packages/test-utils) -
This package contains specific testing facilities used when testing
`core-api`.
-- [`test-utils-core/`](https://github.com/spotify/backstage/tree/master/packages/test-utils-core) -
+- [`test-utils-core/`](https://github.com/backstage/backstage/tree/master/packages/test-utils-core) -
This package contains more general purpose testing facilities for testing a
Backstage App.
-- [`create-app/`](https://github.com/spotify/backstage/tree/master/packages/create-app) -
+- [`create-app/`](https://github.com/backstage/backstage/tree/master/packages/create-app) -
An CLI to specifically scaffold a new Backstage App. It does so by using a
- [template](https://github.com/spotify/backstage/tree/master/packages/create-app/templates/default-app).
+ [template](https://github.com/backstage/backstage/tree/master/packages/create-app/templates/default-app).
-- [`dev-utils/`](https://github.com/spotify/backstage/tree/master/packages/dev-utils) -
+- [`dev-utils/`](https://github.com/backstage/backstage/tree/master/packages/dev-utils) -
Helps you setup a plugin for isolated development so that it can be served
separately.
-- [`docgen/`](https://github.com/spotify/backstage/tree/master/packages/docgen) -
+- [`docgen/`](https://github.com/backstage/backstage/tree/master/packages/docgen) -
Uses the
- [Typescript Compiler API](https://github.com/Microsoft/TypeScript/wiki/Using-the-Compiler-API)
+ [TypeScript Compiler API](https://github.com/microsoft/TypeScript/wiki/Using-the-Compiler-API)
to read out definitions and generate documentation for it.
-- [`e2e-test/`](https://github.com/spotify/backstage/tree/master/packages/e2e-test) -
+- [`e2e-test/`](https://github.com/backstage/backstage/tree/master/packages/e2e-test) -
Another CLI that can be run to try out what would happen if you built all the
packages, publish them, created a new app, and the run it. CI uses this for
e2e-tests.
-- [`storybook/`](https://github.com/spotify/backstage/tree/master/packages/storybook) -
+- [`integration/`](https://github.com/backstage/backstage/tree/master/packages/integration) -
+ Common functionalities of integrations like GitHub, GitLab, etc.
+
+- [`storybook/`](https://github.com/backstage/backstage/tree/master/packages/storybook) -
This folder contains only the storybook config. Stories are within the core
package. The Backstage Storybook is found
[here](https://backstage.io/storybook)
-- [`techdocs-cli/`](https://github.com/spotify/backstage/tree/master/packages/techdocs-cli) -
- Used for verifying TechDocs locally.
+- [`techdocs-common/`](https://github.com/backstage/backstage/tree/master/packages/techdocs-common) -
+ Common functionalities for TechDocs, to be shared between
+ [techdocs-backend](https://github.com/backstage/backstage/tree/master/plugins/techdocs-backend)
+ plugin and [techdocs-cli](https://github.com/backstage/techdocs-cli).
-- [`techdocs-container/`](https://github.com/spotify/backstage/tree/master/packages/techdocs-container) -
- Used by the `techdocs-cli`
+- [`test-utils-core/`](https://github.com/backstage/backstage/tree/master/packages/test-utils-core)
-- [`test-utils-core/`](https://github.com/spotify/backstage/tree/master/packages/test-utils-core)
+- [`test-utils/`](https://github.com/backstage/backstage/tree/master/packages/test-utils)
-- [`test-utils/`](https://github.com/spotify/backstage/tree/master/packages/test-utils)
-
-- [`theme/`](https://github.com/spotify/backstage/tree/master/packages/theme) -
+- [`theme/`](https://github.com/backstage/backstage/tree/master/packages/theme) -
Holds the Backstage Theme.
### `plugins/`
Most of the functionality of a Backstage App comes from plugins. Even core
features can be plugins, take the
-[catalog](https://github.com/spotify/backstage/tree/master/plugins/catalog) as
+[catalog](https://github.com/backstage/backstage/tree/master/plugins/catalog) as
an example.
We can categorize plugins into three different types; **Frontend**, **Backend**
@@ -196,18 +205,18 @@ reason is for clear separation of concerns.
Take a look at our [Plugin Gallery](https://backstage.io/plugins) or browse
through the
-[`plugins/`](https://github.com/spotify/backstage/tree/master/plugins) folder.
+[`plugins/`](https://github.com/backstage/backstage/tree/master/plugins) folder.
## Packages outside of the monorepo
For convenience we include packages in our project that are not part of our
monorepo setup.
-- [`microsite/`](https://github.com/spotify/backstage/blob/master/microsite) -
+- [`microsite/`](https://github.com/backstage/backstage/blob/master/microsite) -
This folder contains the source code for backstage.io. It is built with
[Docusaurus](https://docusaurus.io/). This folder is not part of the monorepo
due to dependency reasons. Look at the
- [README](https://github.com/spotify/backstage/blob/master/microsite/README.md)
+ [README](https://github.com/backstage/backstage/blob/master/microsite/README.md)
for instructions on how to run it locally.
## Root files specifically used by the `app`
@@ -216,22 +225,22 @@ These files are kept in the root of the project mostly by historical reasons.
Some of these files may be subject to be moved out of the root sometime in the
future.
-- [`.npmrc`](https://github.com/spotify/backstage/tree/master/.npmrc) - It's
+- [`.npmrc`](https://github.com/backstage/backstage/tree/master/.npmrc) - It's
common for companies to have their own npm registry, this files makes sure
that this folder use the public registry.
-- [`.vale.ini`](https://github.com/spotify/backstage/tree/master/.vale.ini) -
+- [`.vale.ini`](https://github.com/backstage/backstage/tree/master/.vale.ini) -
[Spell checker](https://github.com/errata-ai/vale) for Markdown files.
-- [`.yarnrc`](https://github.com/spotify/backstage/tree/master/.yarnrc) -
+- [`.yarnrc`](https://github.com/backstage/backstage/tree/master/.yarnrc) -
Enforces "our" version of Yarn.
-- [`app-config.yaml`](https://github.com/spotify/backstage/tree/master/app-config.yaml) -
+- [`app-config.yaml`](https://github.com/backstage/backstage/tree/master/app-config.yaml) -
Configuration for the app, both frontend and backend.
-- [`catalog-info.yaml`](https://github.com/spotify/backstage/tree/master/catalog-info.yaml) -
+- [`catalog-info.yaml`](https://github.com/backstage/backstage/tree/master/catalog-info.yaml) -
Description of Backstage in the Backstage Entity format.
-- [`lerna.json`](https://github.com/spotify/backstage/tree/master/lerna.json) -
+- [`lerna.json`](https://github.com/backstage/backstage/tree/master/lerna.json) -
[Lerna](https://github.com/lerna/lerna) monorepo config. We are using
`yarn workspaces`, so this will only be used for executing scripts.
diff --git a/docs/support/support.md b/docs/support/support.md
index 12bc7cfaf9..49075366af 100644
--- a/docs/support/support.md
+++ b/docs/support/support.md
@@ -5,15 +5,16 @@ description: Support and Community Details and Links
---
- [Discord chatroom](https://discord.gg/MUpMjP2) - Get support or discuss the
- project
-- [Good First Issues](https://github.com/spotify/backstage/contribute) - Start
- here if you want to contribute
-- [RFCs](https://github.com/spotify/backstage/labels/rfc) - Help shape the
- technical direction
-- [FAQ](../FAQ.md) - Frequently Asked Questions
-- [Code of Conduct](../../CODE_OF_CONDUCT.md) - This is how we roll
-- [Blog](https://backstage.io/blog/) - Announcements and updates
+ project.
+- [Good First Issues](https://github.com/backstage/backstage/contribute) - Start
+ here if you want to contribute.
+- [RFCs](https://github.com/backstage/backstage/labels/rfc) - Help shape the
+ technical direction by reviewing _Request for Comments_ issues.
+- [FAQ](../FAQ.md) - Frequently Asked Questions.
+- [Code of Conduct](https://github.com/backstage/backstage/blob/master/CODE_OF_CONDUCT.md) -
+ This is how we roll.
+- [Blog](https://backstage.io/blog/) - Announcements and updates.
- [Newsletter](https://mailchi.mp/spotify/backstage-community) - Subscribe to
- our email newsletter
+ our email newsletter.
- Give us a star ⭐️ - If you are using Backstage or think it is an interesting
- project, we would love a star ❤️
+ project, we would love a star! ❤️
diff --git a/docs/tutorials/journey.md b/docs/tutorials/journey.md
index 7627920a75..adefdfa73f 100644
--- a/docs/tutorials/journey.md
+++ b/docs/tutorials/journey.md
@@ -22,7 +22,7 @@ music and wants to have a theme tune for every service in Backstage.
Sam built a Spotify plugin for Backstage that allows service owners to define a
theme tune for their service. The theme tune plays whenever a user visits the
-service page in Backstage. The plugin is published to NPM and available for any
+service page in Backstage. The plugin is published to npm and available for any
organization to easily install and add to their Backstage installation.
# 1. A New Plugin
@@ -264,14 +264,9 @@ release of Sam's plugin specifies a dependency on Backstage with a minimum
version set to the same release as the one were the annotation was added to the
core schema.
-
-
-
# 9. Revenge of the Sam
Sam, now in full control of all theme tunes in Backstage, releases v2.0.1, which
switches all tracks to 4uLU6hMCjMI75M1A2tKUQC. Sam wanted to do something more
nefarious, but since Backstage sandboxes sensitive actions and is mostly
read-only with strict CSP, Sam's hands were tied.
-
-
diff --git a/docs/tutorials/quickstart-app-plugin.md b/docs/tutorials/quickstart-app-plugin.md
index daf76aa1cd..0f8d9bb84b 100644
--- a/docs/tutorials/quickstart-app-plugin.md
+++ b/docs/tutorials/quickstart-app-plugin.md
@@ -81,13 +81,13 @@ import { useApi } from '@backstage/core-api';
_from inline:_
```tsx
-const ExampleComponent: FC<{}> = () => ( ... )
+const ExampleComponent = () => ( ... )
```
_to block:_
```tsx
-const ExampleComponent: FC<{}> = () => {
+const ExampleComponent = () => {
return (
...
@@ -120,10 +120,10 @@ If everything is saved, you should see your name, id, and email on the
github-playground page. Our data accessed is synchronous. So we just grab and
go.
-https://github.com/spotify/backstage/tree/master/contrib
+https://github.com/backstage/backstage/tree/master/contrib
6. Here is the entire file for reference
- [ExampleComponent.tsx](https://github.com/spotify/backstage/tree/master/contrib/docs/tutorials/quickstart-app-plugin/ExampleComponent.md)
+ [ExampleComponent.tsx](https://github.com/backstage/backstage/tree/master/contrib/docs/tutorials/quickstart-app-plugin/ExampleComponent.md)
# The Wipe
@@ -135,7 +135,7 @@ changes, let's start by wiping this component clean.
1. Replace everything in the file with the following:
```tsx
-import React, { FC } from 'react';
+import React from 'react';
import { useAsync } from 'react-use';
import Alert from '@material-ui/lab/Alert';
import {
@@ -147,7 +147,7 @@ import {
import { useApi } from '@backstage/core-api';
import { graphql } from '@octokit/graphql';
-const ExampleFetchComponent: FC<{}> = () => {
+const ExampleFetchComponent = () => {
return
Nothing to see yet
;
};
@@ -223,7 +223,7 @@ type DenseTableProps = {
viewer: Viewer;
};
-export const DenseTable: FC = ({ viewer }) => {
+export const DenseTable = ({ viewer }: DenseTableProps) => {
const columns: TableColumn[] = [
{ title: 'Name', field: 'name' },
{ title: 'Created', field: 'createdAt' },
@@ -302,7 +302,7 @@ return (
8. After saving that, and given we don't have any errors, you should see a table
with basic information on your repositories.
9. Here is the entire file for reference
- [ExampleFetchComponent.tsx](https://github.com/spotify/backstage/tree/master/contrib/docs/tutorials/quickstart-app-plugin/ExampleFetchComponent.md)
+ [ExampleFetchComponent.tsx](https://github.com/backstage/backstage/tree/master/contrib/docs/tutorials/quickstart-app-plugin/ExampleFetchComponent.md)
10. We finished! You should see your own GitHub repository's information
displayed in a basic table. If you run into issues, you can compare the repo
that backs this document,
diff --git a/docs/verify-links.js b/docs/verify-links.js
deleted file mode 100755
index 9bf8a67ad8..0000000000
--- a/docs/verify-links.js
+++ /dev/null
@@ -1,131 +0,0 @@
-#!/usr/bin/env node
-/*
- * Copyright 2020 Spotify AB
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-const { resolve: resolvePath, dirname } = require('path');
-const fs = require('fs-extra');
-const recursive = require('recursive-readdir');
-
-const projectRoot = resolvePath(__dirname, '..');
-
-async function verifyUrl(basePath, url) {
- // Avoid having absolute URL links within docs/, so that links work on the site
- if (
- url.match(
- /https:\/\/github.com\/spotify\/backstage\/(tree|blob)\/master\/docs\//,
- ) &&
- basePath.match(/^(?:docs|microsite)\//)
- ) {
- return { url, basePath, problem: 'absolute' };
- }
-
- url = url.replace(/#.*$/, '');
- url = url.replace(
- /https:\/\/github.com\/spotify\/backstage\/(tree|blob)\/master/,
- '',
- );
- if (!url) {
- return;
- }
-
- // Only verify existence of local files for now, so skip anything with a schema
- if (url.match(/[a-z]+:/)) {
- return;
- }
-
- let path = '';
-
- if (url.startsWith('/')) {
- if (url.startsWith('/docs/') && basePath.match(/^(?:docs|microsite)\//)) {
- return { url, basePath, problem: 'not-relative' };
- }
-
- const staticPath = resolvePath(projectRoot, 'microsite/static', `.${url}`);
- if (await fs.pathExists(staticPath)) {
- return;
- }
-
- path = resolvePath(projectRoot, `.${url}`);
- } else {
- path = resolvePath(dirname(resolvePath(projectRoot, basePath)), url);
- }
-
- const exists = await fs.pathExists(path);
- if (!exists) {
- return { url, basePath, problem: 'missing' };
- }
-
- return;
-}
-
-async function verifyFile(filePath) {
- const content = await fs.readFile(filePath, 'utf8');
- const mdLinks = content.match(/\[.+?\]\(.+?\)/g) || [];
- const badUrls = [];
-
- for (const mdLink of mdLinks) {
- const url = mdLink.match(/\[.+\]\((.+)\)/)[1].trim();
- const badUrl = await verifyUrl(filePath, url);
- if (badUrl) {
- badUrls.push(badUrl);
- }
- }
-
- return badUrls;
-}
-
-async function main() {
- process.chdir(projectRoot);
-
- const files = await recursive('.', [
- 'node_modules',
- 'dist',
- 'bin',
- 'microsite',
- ]);
- const mdFiles = files.filter(f => f.endsWith('.md'));
- const badUrls = [];
-
- for (const mdFile of mdFiles) {
- const badFileUrls = await verifyFile(mdFile);
- badUrls.push(...badFileUrls);
- }
-
- if (badUrls.length) {
- console.log(`Found ${badUrls.length} bad links within repo`);
- for (const { url, basePath, problem } of badUrls) {
- if (problem === 'missing') {
- console.error(
- `Unable to reach ${url} from root or microsite/static/, linked from ${basePath}`,
- );
- } else if (problem === 'not-relative') {
- console.error('Links to /docs/ must be relative');
- console.error(` From: ${basePath}`);
- console.error(` To: ${url}`);
- } else if (problem === 'absolute') {
- console.error(`Link to docs/ should be replaced by a relative URL`);
- console.error(` From: ${basePath}`);
- console.error(` To: ${url}`);
- }
- }
- process.exit(1);
- }
-}
-
-main().catch(error => {
- console.error(error.stack);
- process.exit(1);
-});
diff --git a/lerna.json b/lerna.json
index 5871423f78..dd2dd884eb 100644
--- a/lerna.json
+++ b/lerna.json
@@ -2,5 +2,5 @@
"packages": ["packages/*", "plugins/*"],
"npmClient": "yarn",
"useWorkspaces": true,
- "version": "0.1.1-alpha.26"
+ "version": "0.1.1"
}
diff --git a/microsite/README.md b/microsite/README.md
index d244caa22a..9589def3e3 100644
--- a/microsite/README.md
+++ b/microsite/README.md
@@ -204,3 +204,8 @@ For more information about custom pages, click [here](https://docusaurus.io/docs
# Full Documentation
Full documentation can be found on the [website](https://docusaurus.io/).
+
+## Additional notes
+
+- If you want to make images zoomable on click, add the `data-zoomable` attribute to your `img` element.
+ - In a docs or blog `.md` file, convert `` syntax to ``
diff --git a/microsite/blog/2020-03-16-announcing-backstage.md b/microsite/blog/2020-03-16-announcing-backstage.md
index 3911debf08..5094de7b37 100644
--- a/microsite/blog/2020-03-16-announcing-backstage.md
+++ b/microsite/blog/2020-03-16-announcing-backstage.md
@@ -1,6 +1,6 @@
---
title: Announcing Backstage
-author: Stefan Ålund
+author: Stefan Ålund, Spotify
authorURL: http://twitter.com/stalund
authorImageURL: https://pbs.twimg.com/profile_images/121166861/6919c047c0d0edaace78c3009b28e917-user-full-200-130.generated_400x400.jpg
---
@@ -41,4 +41,4 @@ We are envisioning three phases of the project and we have already begun work on
- **Phase 3:** Ecosystem (later) - Everyone's infrastructure stack is different. By fostering a vibrant community of contributors we hope to provide an ecosystem of Open Source plugins/integrations that allows you to pick the tools that match your stack.
-Our vision for Backstage is for it to become the trusted standard toolbox (read: UI layer) for the open source infrastructure landscape. Think of it like Kubernetes for developer experience. We realize this is an ambitious goal. We can’t do it alone. If this sounds interesting or you'd like to help us shape our product vision, we'd love to talk. You can email me directly: [alund@spotify.com](mailto:alund@spotify.com).
+Our vision for Backstage is for it to become the trusted standard toolbox (read: UI layer) for the open source infrastructure landscape. Think of it like Kubernetes for developer experience. We realize this is an ambitious goal. We can’t do it alone. If this sounds interesting or you'd like to help us shape our product vision, we'd love to talk. You can email us directly: [backstage-interest@spotify.com](mailto:backstage-interest@spotify.com).
diff --git a/microsite/blog/2020-03-18-what-is-backstage.md b/microsite/blog/2020-03-18-what-is-backstage.md
index 8b0a0fcbe6..2c2b81d64d 100644
--- a/microsite/blog/2020-03-18-what-is-backstage.md
+++ b/microsite/blog/2020-03-18-what-is-backstage.md
@@ -1,6 +1,6 @@
---
title: What the heck is Backstage anyway?
-author: Stefan Ålund
+author: Stefan Ålund, Spotify
authorURL: http://twitter.com/stalund
authorImageURL: https://pbs.twimg.com/profile_images/121166861/6919c047c0d0edaace78c3009b28e917-user-full-200-130.generated_400x400.jpg
---
@@ -81,8 +81,8 @@ Similar to how Backstage ties together all of Spotify’s infrastructure, our am
## What’s next?
-We are envisioning [three phases](https://github.com/spotify/backstage/milestones) of the project (so far), and we have already begun work on various aspects of these phases. The best way to track the work and see where you can jump in and help out is:
+We are envisioning [three phases](https://github.com/backstage/backstage/milestones) of the project (so far), and we have already begun work on various aspects of these phases. The best way to track the work and see where you can jump in and help out is:
-https://github.com/spotify/backstage/milestones
+https://github.com/backstage/backstage/milestones
-Want to discuss the project or need support? Join us on [Discord](https://discord.gg/MUpMjP2) or reach out on [alund@spotify.com](mailto:alund@spotify.com).
+Want to discuss the project or need support? Join us on [Discord](https://discord.gg/MUpMjP2) or reach out on [backstage-interest@spotify.com](mailto:backstage-interest@spotify.com).
diff --git a/microsite/blog/2020-04-06-lighthouse-plugin.md b/microsite/blog/2020-04-06-lighthouse-plugin.md
index 2d5c7b96b7..dcdb4b78e5 100644
--- a/microsite/blog/2020-04-06-lighthouse-plugin.md
+++ b/microsite/blog/2020-04-06-lighthouse-plugin.md
@@ -1,6 +1,6 @@
---
title: Introducing Lighthouse for Backstage
-author: Paul Marbach
+author: Paul Marbach, Spotify
authorURL: http://twitter.com/fastfrwrd
authorImageURL: https://pbs.twimg.com/profile_images/1224058798958088192/JPxS8uzR_400x400.jpg
---
@@ -33,7 +33,7 @@ Trigger an audit directly from Backstage, or trigger audits programmatically wit
## Using Lighthouse in Backstage
-To learn how you can enable Lighthouse auditing within Backstage, head over to the [README](https://github.com/spotify/backstage/tree/master/plugins/lighthouse) for the plugin to get started.
+To learn how you can enable Lighthouse auditing within Backstage, head over to the [README](https://github.com/backstage/backstage/tree/master/plugins/lighthouse) for the plugin to get started.
## A personal note
diff --git a/microsite/blog/2020-04-30-how-to-quickly-set-up-backstage.md b/microsite/blog/2020-04-30-how-to-quickly-set-up-backstage.md
index dff567eaf3..65102c919f 100644
--- a/microsite/blog/2020-04-30-how-to-quickly-set-up-backstage.md
+++ b/microsite/blog/2020-04-30-how-to-quickly-set-up-backstage.md
@@ -1,6 +1,6 @@
---
title: How to quickly set up Backstage
-author: Marcus Eide
+author: Marcus Eide, Spotify
authorURL: https://github.com/marcuseide
authorImageURL: https://secure.gravatar.com/avatar/20223f1e03673c7c1e6282fbebaf6942
---
@@ -132,4 +132,4 @@ If you are developing a plugin that might be useful for others, consider releasi
## Ready to get started?
-Head over to GitHub and check out the [project](https://github.com/spotify/backstage) or download our [CLI](https://www.npmjs.com/package/@backstage/cli). If you have more questions, join us on [Discord](https://discord.gg/MUpMjP2) or [create an issue](https://github.com/spotify/backstage/issues/new/choose).
+Head over to GitHub and check out the [project](https://github.com/backstage/backstage) or download our [CLI](https://www.npmjs.com/package/@backstage/cli). If you have more questions, join us on [Discord](https://discord.gg/MUpMjP2) or [create an issue](https://github.com/backstage/backstage/issues/new/choose).
diff --git a/microsite/blog/2020-05-14-tech-radar-plugin.md b/microsite/blog/2020-05-14-tech-radar-plugin.md
index d78d5d67fa..b78cf9004f 100644
--- a/microsite/blog/2020-05-14-tech-radar-plugin.md
+++ b/microsite/blog/2020-05-14-tech-radar-plugin.md
@@ -1,6 +1,6 @@
---
title: Introducing Tech Radar for Backstage
-author: Bilawal Hameed
+author: Bilawal Hameed, Spotify
authorURL: http://twitter.com/bilawalhameed
authorImageURL: https://avatars0.githubusercontent.com/bih
---
@@ -34,11 +34,11 @@ To learn about how you can bring the Tech Radar to your Backstage installation,
I want to thank both the Backstage team and Spotify. Firstly, I’ve been working with our internal version of Backstage for over a year, and the developer experience since open sourcing has been even more of a joy to work with. Secondly, the 10% hack time that Spotify generously provides to all engineers enabled me to open source the Tech Radar plugin.
-Since open sourcing it, the community has shown great interest in yet another powerful use case of Backstage. There was also an enthusiastic open source contributor who volunteered to migrate the plugin to TypeScript and React Hooks [in just 29 minutes](https://github.com/spotify/backstage/issues/661) of opening the issue!
+Since open sourcing it, the community has shown great interest in yet another powerful use case of Backstage. There was also an enthusiastic open source contributor who volunteered to migrate the plugin to TypeScript and React Hooks [in just 29 minutes](https://github.com/backstage/backstage/issues/661) of opening the issue!
I can’t wait to see how others benefit from the Tech Radar in their organizations!
[lighthouse website audits]: https://backstage.io/blog/2020/04/06/lighthouse-plugin
-[tech radar plugin]: https://github.com/spotify/backstage/tree/master/plugins/tech-radar
+[tech radar plugin]: https://github.com/backstage/backstage/tree/master/plugins/tech-radar
[thoughtworks]: https://www.thoughtworks.com/radar
[zalando]: https://opensource.zalando.com/tech-radar/
diff --git a/microsite/blog/2020-05-14-weaveworks-covid-19-app-uses-backstage-ui.md b/microsite/blog/2020-05-14-weaveworks-covid-19-app-uses-backstage-ui.md
index 68e3f903c7..3e3d8a537a 100644
--- a/microsite/blog/2020-05-14-weaveworks-covid-19-app-uses-backstage-ui.md
+++ b/microsite/blog/2020-05-14-weaveworks-covid-19-app-uses-backstage-ui.md
@@ -1,6 +1,6 @@
---
title: Weaveworks’ COVID-19 app uses Backstage UI
-author: Jeff Feng
+author: Jeff Feng, Spotify
authorURL: https://github.com/fengypants
authorImageURL: https://avatars2.githubusercontent.com/u/46946747
---
diff --git a/microsite/blog/2020-05-22-phase-2-service-catalog.md b/microsite/blog/2020-05-22-phase-2-service-catalog.md
index 682965d2dd..520a2a5f10 100644
--- a/microsite/blog/2020-05-22-phase-2-service-catalog.md
+++ b/microsite/blog/2020-05-22-phase-2-service-catalog.md
@@ -1,13 +1,13 @@
---
title: Starting Phase 2: The Service Catalog
-author: Stefan Ålund
+author: Stefan Ålund, Spotify
authorURL: http://twitter.com/stalund
authorImageURL: https://pbs.twimg.com/profile_images/121166861/6919c047c0d0edaace78c3009b28e917-user-full-200-130.generated_400x400.jpg
---
**TL;DR** Thanks to the help from the Backstage community, we’ve made excellent progress and are now moving into Phase 2 of Backstage — building out a Service Catalog and the surrounding systems that will help unify the tools you use to manage your software.
-We released the open source version of Backstage a little less than two months ago, and have been thrilled to see so many people jumping in and contributing to the project in its early stages. We’re excited to see what the community can build together as we progress through [each phase of Backstage](https://github.com/spotify/backstage#project-roadmap).
+We released the open source version of Backstage a little less than two months ago, and have been thrilled to see so many people jumping in and contributing to the project in its early stages. We’re excited to see what the community can build together as we progress through [each phase of Backstage](https://github.com/backstage/backstage#project-roadmap).

@@ -15,7 +15,7 @@ We released the open source version of Backstage a little less than two months a
## Progress so far
-Phase 1 was all about building an extensible frontend platform, enabling teams to start creating a single, consistent UI layer for your internal infrastructure and tools in the form of [plugins](https://github.com/spotify/backstage/labels/plugin). In fact, thanks to our amazing (30+) [contributors](https://github.com/spotify/backstage/graphs/contributors), we were able to complete most of Phase 1 earlier than expected. 🎉
+Phase 1 was all about building an extensible frontend platform, enabling teams to start creating a single, consistent UI layer for your internal infrastructure and tools in the form of [plugins](https://github.com/backstage/backstage/labels/plugin). In fact, thanks to our amazing (30+) [contributors](https://github.com/backstage/backstage/graphs/contributors), we were able to complete most of Phase 1 earlier than expected. 🎉
Today, we are happy to announce that we are shifting our focus to Phase 2!
@@ -27,7 +27,7 @@ Quote from [Platform Nuts & Bolts: Extendable Data Models](https://www.kislayver
Entities, or what we refer to as “components” in Backstage, represent all software, including services, websites, libraries, data pipelines, and so forth. The focus of Phase 2 will be on adding an entity model in Backstage that makes it easy for engineers to create and manage the software components they own.
-With the ability to create a plethora of components in Backstage, how does one keep track of all the software in the ecosystem? Therein lies the highlight feature of Phase 2: the [Service Catalog](https://github.com/spotify/backstage/milestone/4). The service catalog — or software catalog — is a centralized system that keeps track of ownership and metadata about all software in your ecosystem. The catalog is built around the concept of [metadata yaml files](/docs/architecture-decisions/adr002-default-catalog-file-format.md) stored together with the code, which are then harvested and visualized in Backstage.
+With the ability to create a plethora of components in Backstage, how does one keep track of all the software in the ecosystem? Therein lies the highlight feature of Phase 2: the [Service Catalog](https://github.com/backstage/backstage/milestone/4). The service catalog — or software catalog — is a centralized system that keeps track of ownership and metadata about all software in your ecosystem. The catalog is built around the concept of [metadata yaml files](/docs/architecture-decisions/adrs-adr002) stored together with the code, which are then harvested and visualized in Backstage.

@@ -39,13 +39,13 @@ On top of that, we have found that the service catalog is a great way to organis

-More concretely, having this structure in place will allow plugins such as [CircleCI](https://github.com/spotify/backstage/tree/master/plugins/circleci) to show only the builds for the specific service you are viewing, or a [Spinnaker](https://github.com/spotify/backstage/issues/631) plugin to show running deployments, or an Open API plugin to [show documentation](https://github.com/spotify/backstage/issues/627) for endpoints exposed by the service, or the [Lighthouse](https://github.com/spotify/backstage/tree/master/plugins/lighthouse) plugin to show audit reports for your website. You get the point.
+More concretely, having this structure in place will allow plugins such as [CircleCI](https://github.com/backstage/backstage/tree/master/plugins/circleci) to show only the builds for the specific service you are viewing, or a [Spinnaker](https://github.com/backstage/backstage/issues/631) plugin to show running deployments, or an Open API plugin to [show documentation](https://github.com/backstage/backstage/issues/627) for endpoints exposed by the service, or the [Lighthouse](https://github.com/backstage/backstage/tree/master/plugins/lighthouse) plugin to show audit reports for your website. You get the point.
## Timeline
Our estimated timeline has us delivering these pieces in increments leading up to June 22. But with the support of the community we wouldn’t be surprised if things land earlier than that. 🙏
-If you are interested in joining us, check out our [Milestones](https://github.com/spotify/backstage/milestones) and connected Issues.
+If you are interested in joining us, check out our [Milestones](https://github.com/backstage/backstage/milestones) and connected Issues.
## Long-term vision
diff --git a/microsite/blog/2020-06-22-backstage-service-catalog-alpha.md b/microsite/blog/2020-06-22-backstage-service-catalog-alpha.md
index 0928b8769b..4519f16d96 100644
--- a/microsite/blog/2020-06-22-backstage-service-catalog-alpha.md
+++ b/microsite/blog/2020-06-22-backstage-service-catalog-alpha.md
@@ -1,6 +1,6 @@
---
title: Backstage Service Catalog released in alpha
-author: Stefan Ålund
+author: Stefan Ålund, Spotify
authorURL: http://twitter.com/stalund
image: https://backstage.io/blog/assets/6/header.png
---
@@ -24,7 +24,7 @@ With these insights we decided to re-focus our efforts towards the most requeste
## What is the service catalog?
-The Backstage Service Catalog — actually, a software catalog, since it includes more than just services — is a centralized system that keeps track of ownership and metadata for all the software in your ecosystem (services, websites, libraries, data pipelines, etc). The catalog is built around the concept of [metadata yaml files](/docs/architecture-decisions/adr002-default-catalog-file-format.md#format) stored together with the code, which are then harvested and visualized in Backstage.
+The Backstage Service Catalog — actually, a software catalog, since it includes more than just services — is a centralized system that keeps track of ownership and metadata for all the software in your ecosystem (services, websites, libraries, data pipelines, etc). The catalog is built around the concept of [metadata yaml files](/docs/architecture-decisions/adrs-adr002) stored together with the code, which are then harvested and visualized in Backstage.
This was our pitch for the virtues of a service catalog when we first [announced](https://backstage.io/blog/2020/05/22/phase-2-service-catalog) it as part of Phase 2:
@@ -40,7 +40,7 @@ You’ll be able to see many of these virtues in action with this alpha release
Alpha is our shorthand for "we don’t yet think Backstage is ready for production, but we’d love for you to test it and provide us with feedback". However, you should be able to try out the functionality of the service catalog:
-1. Register software components ([examples](https://github.com/spotify/backstage/tree/master/packages/catalog-model/examples))
+1. Register software components ([examples](https://github.com/backstage/backstage/tree/master/packages/catalog-model/examples))
2. See all components represented in the catalog
3. Search across all components
4. Get an overview of the metadata of the components
@@ -49,6 +49,6 @@ Alpha is our shorthand for "we don’t yet think Backstage is ready for producti
As with most alpha releases, you should expect things to change quite a lot until we reach the beta stage (we’re targeting the end of summer). There are obviously many things missing as well, but we wanted to start collecting feedback early and make it easier to see the end-to-end flow.
-If you have feedback or questions, please open a [GitHub issue](https://github.com/spotify/backstage/issues), ping us on [Discord chat](https://discord.gg/EBHEGzX) or send me an email at [alund@spotify.com](mailto:alund@spotify.com) 🙏
+If you have feedback or questions, please open a [GitHub issue](https://github.com/backstage/backstage/issues), ping us on [Discord chat](https://discord.gg/EBHEGzX) or send us an email at [backstage-interest@spotify.com](mailto:backstage-interest@spotify.com) 🙏
To get regular product updates and news about the Backstage community, sign up for the [Backstage newsletter](https://mailchi.mp/spotify/backstage-community).
diff --git a/microsite/blog/2020-07-01-how-to-enable-authentication-in-backstage-using-passport.md b/microsite/blog/2020-07-01-how-to-enable-authentication-in-backstage-using-passport.md
index ccdd8b34c6..ce778c9dc2 100644
--- a/microsite/blog/2020-07-01-how-to-enable-authentication-in-backstage-using-passport.md
+++ b/microsite/blog/2020-07-01-how-to-enable-authentication-in-backstage-using-passport.md
@@ -1,6 +1,6 @@
---
title: How to enable authentication in Backstage using Passport
-author: Lee Mills
+author: Lee Mills, Spotify
authorURL: https://github.com/leemills83
authorImageURL: https://avatars1.githubusercontent.com/u/1236238?s=460&v=4
---
@@ -21,7 +21,7 @@ Passport has allowed us to leverage an existing open-source authentication frame

-First, check out the provided Google and GitHub implementations! [Spin up a local copy of Backstage](https://backstage.io/blog/2020/04/30/how-to-quickly-set-up-backstage) along with our example-backend. You can find more documentation on setting up the example backend [here](https://github.com/spotify/backstage/tree/master/packages/backend), but be sure to include the relevant client IDs and secrets when running `yarn start`:
+First, check out the provided Google and GitHub implementations! [Spin up a local copy of Backstage](https://backstage.io/blog/2020/04/30/how-to-quickly-set-up-backstage) along with our example-backend. You can find more documentation on setting up the example backend [here](https://github.com/backstage/backstage/tree/master/packages/backend), but be sure to include the relevant client IDs and secrets when running `yarn start`:
```
AUTH_GOOGLE_CLIENT_ID=x AUTH_GOOGLE_CLIENT_SECRET=x AUTH_GITHUB_CLIENT_ID=x AUTH_GITHUB_CLIENT_SECRET=x SENTRY_TOKEN=x LOG_LEVEL=debug yarn start
@@ -39,8 +39,8 @@ Getting started is really straightforward, and can be broadly broken down into f
4. Add the provider to the backend.
5. Add a frontend Auth Utility API.
-For full details, take a look at our [“Adding authentication providers” documentation](/docs/auth/add-auth-provider.md) and at the [excellent documentation](http://www.passportjs.org/docs/) provided by Passport.
+For full details, take a look at our [“Adding authentication providers” documentation](/docs/auth/add-auth-provider) and at the [excellent documentation](http://www.passportjs.org/docs/) provided by Passport.
## Interested in contributing to the next steps for authentication?
-We’ve already seen both GitLab and Okta contributions from the community — and we’re thinking about a few more providers we’d like to add to Backstage, too. You can find those, and other authentication-related issues, in our repository by filtering with the [auth label](https://github.com/spotify/backstage/issues?q=is%3Aissue+is%3Aopen+label%3Aauth).
+We’ve already seen both GitLab and Okta contributions from the community — and we’re thinking about a few more providers we’d like to add to Backstage, too. You can find those, and other authentication-related issues, in our repository by filtering with the [auth label](https://github.com/backstage/backstage/issues?q=is%3Aissue+is%3Aopen+label%3Aauth).
diff --git a/microsite/blog/2020-08-05-announcing-backstage-software-templates.md b/microsite/blog/2020-08-05-announcing-backstage-software-templates.md
index 81d495e1c3..afda20e499 100644
--- a/microsite/blog/2020-08-05-announcing-backstage-software-templates.md
+++ b/microsite/blog/2020-08-05-announcing-backstage-software-templates.md
@@ -1,6 +1,6 @@
---
title: Announcing Backstage Software Templates
-author: Stefan Ålund
+author: Stefan Ålund, Spotify
authorURL: https://twitter.com/stalund
---
@@ -73,6 +73,6 @@ Backstage ships with four example templates, but since these are likely not the
We have learned that one of the keys to getting these standards adopted is to keep an open process. Templates are code. By making it clear to your engineers that you are open to pull requests, and that teams with different needs can add their own templates, you are on the path of striking a good balance between autonomy and standardization.
-If you have feedback or questions, please open a [GitHub issue](https://github.com/spotify/backstage/issues), ping us on [Discord chat](https://discord.gg/EBHEGzX) or send me an email at [alund@spotify.com](mailto:alund@spotify.com) 🙏
+If you have feedback or questions, please open a [GitHub issue](https://github.com/backstage/backstage/issues), ping us on [Discord chat](https://discord.gg/EBHEGzX) or send us an email at [backstage-interest@spotify.com](mailto:backstage-interest@spotify.com) 🙏
To get regular product updates and news about the Backstage community, sign up for the [Backstage newsletter](https://mailchi.mp/spotify/backstage-community).
diff --git a/microsite/blog/2020-09-08-announcing-tech-docs.md b/microsite/blog/2020-09-08-announcing-tech-docs.md
index 48b6eeb7cc..f09c73fd83 100644
--- a/microsite/blog/2020-09-08-announcing-tech-docs.md
+++ b/microsite/blog/2020-09-08-announcing-tech-docs.md
@@ -1,6 +1,6 @@
---
title: Announcing TechDocs: Spotify’s docs-like-code plugin for Backstage
-author: Gary Niemen
+author: Gary Niemen, Spotify
authorURL: https://github.com/garyniemen
---
@@ -21,11 +21,11 @@ But this is just one way to do it. Today we’re most excited for what the open
## Okay, let’s start collaborating
-If you go to [GitHub](https://github.com/spotify/backstage/tree/master/plugins) now, you’ll find everything you need to start collaborating with us to build out the docs-like-code Backstage plugin — we’ll call it TechDocs in the open as well.
+If you go to [GitHub](https://github.com/backstage/backstage/tree/master/plugins) now, you’ll find everything you need to start collaborating with us to build out the docs-like-code Backstage plugin — we’ll call it TechDocs in the open as well.
-You’ll find the code in [techdocs](https://github.com/spotify/backstage/tree/master/plugins/techdocs) (frontend) and [techdocs-backend](https://github.com/spotify/backstage/tree/master/plugins/techdocs-backend). (There are also two separate packages [techdocs-cli](https://github.com/spotify/backstage/tree/master/packages/techdocs-cli) and [techdocs-container](https://github.com/spotify/backstage/tree/master/packages/techdocs-container).)
+You’ll find the code in [techdocs](https://github.com/backstage/backstage/tree/master/plugins/techdocs) (frontend) and [techdocs-backend](https://github.com/backstage/backstage/tree/master/plugins/techdocs-backend). (There are also two separate packages [techdocs-cli](https://github.com/backstage/techdocs-cli) and [techdocs-container](https://github.com/backstage/techdocs-container).)
-You’ll find issues to work on in the [issues queue](https://github.com/spotify/backstage/issues?q=is%3Aissue+is%3Aopen+label%3A%22docs-like-code%22+label%3A%22help+wanted%22), typically starting with TechDocs: and labeled with docs-like-code, some labeled good first issue. Feel free to add your own issues, of course.
+You’ll find issues to work on in the [issues queue](https://github.com/backstage/backstage/issues?q=is%3Aissue+is%3Aopen+label%3A%22docs-like-code%22+label%3A%22help+wanted%22), typically starting with TechDocs: and labeled with docs-like-code, some labeled good first issue. Feel free to add your own issues, of course.

diff --git a/microsite/blog/2020-09-23-backstage-cncf-sandbox.md b/microsite/blog/2020-09-23-backstage-cncf-sandbox.md
index bcfd7c6245..48a67e878c 100644
--- a/microsite/blog/2020-09-23-backstage-cncf-sandbox.md
+++ b/microsite/blog/2020-09-23-backstage-cncf-sandbox.md
@@ -1,6 +1,6 @@
---
title: Backstage has been accepted into the CNCF Sandbox
-author: Stefan Ålund
+author: Stefan Ålund, Spotify
authorURL: https://twitter.com/stalund
---
@@ -14,8 +14,8 @@ Backstage garnered quite a bit of interest from developers and organizations whe
Backstage’s ability to simplify tooling and standardize engineering practices has attracted interest from other major tech companies, as well as airlines, auto manufacturers, investment firms, and global retailers. We know that Backstage solves a problem — infrastructure complexity — that’s common to a lot of large and growing companies today. But different companies work differently, use particular toolsets, and have unique use cases. By making Backstage open source, we can build it with people working inside a variety of engineering organizations all over the world. It makes for a better product that serves a wider group of users (beyond that of Spotify’s) and their needs.
-The Backstage community is healthy and growing quickly. Over [130 people](https://github.com/spotify/backstage/graphs/contributors) have contributed to the project, and roughly 40% of pull requests are now coming from external, non-Spotify, contributors. With companies now deciding to [adopt Backstage](https://github.com/spotify/backstage/blob/master/ADOPTERS.md) we are also seeing a shift in the kinds of contributions we are getting from the community. It is truly amazing to see contributions to core parts of the platform as well as significant functionality additions through working [plugins](https://backstage.io/plugins).
+The Backstage community is healthy and growing quickly. Over [130 people](https://github.com/backstage/backstage/graphs/contributors) have contributed to the project, and roughly 40% of pull requests are now coming from external, non-Spotify, contributors. With companies now deciding to [adopt Backstage](https://github.com/backstage/backstage/blob/master/ADOPTERS.md) we are also seeing a shift in the kinds of contributions we are getting from the community. It is truly amazing to see contributions to core parts of the platform as well as significant functionality additions through working [plugins](https://backstage.io/plugins).
We’re excited to embark on this journey with the CNCF community. There’s so much great tech being built here, and it’s about time we share it to build even greater products, together. Entering into the CNCF Sandbox is just the first step. We are committed to working with the community to bring Backstage through the Incubation step, and finally all the way to becoming a Graduated, top-level project.
-Thanks to everyone for your support so far. We hope you [join us](https://mailchi.mp/spotify/backstage-community) in this next chapter of Backstage's journey. If you have questions or feedback, feel free to [email](mailto:alund@spotify.com) me directly.
+Thanks to everyone for your support so far. We hope you [join us](https://mailchi.mp/spotify/backstage-community) in this next chapter of Backstage's journey. If you have questions or feedback, feel free to [email](mailto:backstage-interest@spotify.com) me directly.
diff --git a/microsite/blog/2020-09-30-backstage-design-system.md b/microsite/blog/2020-09-30-backstage-design-system.md
index 4faea98782..fc227ea5d3 100644
--- a/microsite/blog/2020-09-30-backstage-design-system.md
+++ b/microsite/blog/2020-09-30-backstage-design-system.md
@@ -1,6 +1,6 @@
---
title: How to design for Backstage (even if you’re not a designer)
-author: Kat Zhou
+author: Kat Zhou, Spotify
authorURL: http://twitter.com/katherinemzhou
---
@@ -68,9 +68,9 @@ To keep up with our latest design guidelines, go to [Designing for Backstage](ht

-### [GitHub](https://github.com/spotify/backstage)
+### [GitHub](https://github.com/backstage/backstage)
-Join in on the action [at spotify/backstage on GitHub](https://github.com/spotify/backstage) by submitting issues and opening pull requests for all things related to components and patterns in Backstage.
+Join in on the action [at backstage/backstage on GitHub](https://github.com/backstage/backstage) by submitting issues and opening pull requests for all things related to components and patterns in Backstage.

diff --git a/microsite/blog/2020-09-30-plugin-marketplace.md b/microsite/blog/2020-09-30-plugin-marketplace.md
index 0b96abbc60..f4e9b749e2 100644
--- a/microsite/blog/2020-09-30-plugin-marketplace.md
+++ b/microsite/blog/2020-09-30-plugin-marketplace.md
@@ -1,6 +1,6 @@
---
title: The Plugin Marketplace is open
-author: Stefan Ålund
+author: Stefan Ålund, Spotify
authorURL: https://twitter.com/stalund
---
@@ -34,10 +34,10 @@ This grand vision is actually not that far off. Already today there is a growing
Not all plugins you need will be open source. Every company has their own homegrown tooling. Building internal plugins lets you tailor your version of Backstage to be a perfect fit for your infrastructure and software development needs. If you end up [building plugins](https://backstage.io/docs/plugins/create-a-plugin) that could be useful for other companies, please consider releasing them as open source and [add them to the Marketplace](https://backstage.io/docs/plugins/add-to-marketplace).
-If you start developing a plugin that you aim to release as open source, we suggest that you create a [new plugin Issue](https://github.com/spotify/backstage/issues/new?labels=plugin&template=plugin_template.md&title=%5BPlugin%5D+THE+PLUGIN+NAME). This helps the community know what plugins are in development and opens up opportunities for collaboration. You can also use this process if you have an idea for a good plugin, but you need help building it.
+If you start developing a plugin that you aim to release as open source, we suggest that you create a [new plugin Issue](https://github.com/backstage/backstage/issues/new?labels=plugin&template=plugin_template.md&title=%5BPlugin%5D+THE+PLUGIN+NAME). This helps the community know what plugins are in development and opens up opportunities for collaboration. You can also use this process if you have an idea for a good plugin, but you need help building it.
We are really excited to see all the amazing plugins that have already been built, and look forward to seeing even more ideas and collaboration as the Backstage community continues to grow.
-What plugins would you like to see in the Plugin Marketplace? [Tell us](https://github.com/spotify/backstage/issues/new?labels=plugin&template=plugin_template.md&title=%5BPlugin%5D+THE+PLUGIN+NAME)!
+What plugins would you like to see in the Plugin Marketplace? [Tell us](https://github.com/backstage/backstage/issues/new?labels=plugin&template=plugin_template.md&title=%5BPlugin%5D+THE+PLUGIN+NAME)!
_Special shout-out to community member [Iain Billett](https://github.com/iain-b) from [Roadie](https://roadie.io) for helping build and contribute the [Plugin Marketplace page](https://backstage.io/plugins) (as his first PR no less!)._
diff --git a/microsite/blog/2020-10-22-cost-insights-plugin.md b/microsite/blog/2020-10-22-cost-insights-plugin.md
index 421ebacdd2..c7ae9c492d 100644
--- a/microsite/blog/2020-10-22-cost-insights-plugin.md
+++ b/microsite/blog/2020-10-22-cost-insights-plugin.md
@@ -1,10 +1,10 @@
---
title: New Cost Insights plugin: The engineer’s solution to taming cloud costs
-author: Janisa Anandamohan
+author: Janisa Anandamohan, Spotify
authorURL: https://twitter.com/janisa_a
---
-How did Spotify save millions on cloud costs within a matter of months?? We made cost optimization just another part of the daily development process. Our newly open sourced [Cost Insights plugin](https://github.com/spotify/backstage/tree/master/plugins/cost-insights) makes a team’s cloud costs visible — and actionable — right inside Backstage. So engineers can see the impact of their cloud usage (down to a product and resource level) and make optimizations wherever and whenever it makes sense. By managing cloud costs from the ground up, you can make smarter decisions that let you continue to build and scale quickly, without wasting resources.
+How did Spotify save millions on cloud costs within a matter of months?? We made cost optimization just another part of the daily development process. Our newly open sourced [Cost Insights plugin](https://github.com/backstage/backstage/tree/master/plugins/cost-insights) makes a team’s cloud costs visible — and actionable — right inside Backstage. So engineers can see the impact of their cloud usage (down to a product and resource level) and make optimizations wherever and whenever it makes sense. By managing cloud costs from the ground up, you can make smarter decisions that let you continue to build and scale quickly, without wasting resources.
@@ -59,7 +59,7 @@ Engineers can then determine for themselves if the time invested in an optimizat
## Getting started
-You can begin working with the Cost Insights plugin today on [GitHub](https://github.com/spotify/backstage/tree/master/plugins/cost-insights). We include an example client with static data in the expected format. The `CostInsightsApi` should talk with a cloud billing backend that aggregates billing data from your cloud provider.
+You can begin working with the Cost Insights plugin today on [GitHub](https://github.com/backstage/backstage/tree/master/plugins/cost-insights). We include an example client with static data in the expected format. The `CostInsightsApi` should talk with a cloud billing backend that aggregates billing data from your cloud provider.
The current release of Cost Insights includes:
@@ -72,8 +72,8 @@ The current release of Cost Insights includes:
Our hope is to help other companies translate their cloud cost in a relatable way for their engineers to better understand their impact and accurately identify their opportunities for optimizations.
-And if you’re interested in contributing to our outstanding issues, you can find them in the issues queue, filtered under the [‘cost-insights’ label](https://github.com/spotify/backstage/labels/cost-insights).
+And if you’re interested in contributing to our outstanding issues, you can find them in the issues queue, filtered under the [‘cost-insights’ label](https://github.com/backstage/backstage/labels/cost-insights).
## Ready for DevSecCostOpsPlus (and whatever’s next)
-There’s DevOps, there’s DevSecOps, and then there’s Backstage: one frontend for all your infrastructure. From building, testing, and deploying to monitoring and security — Backstage helps you manage your entire tech organization and provides a seamless developer experience for engineers, from end to end to end. And now that also extends to cost management for your cloud infrastructure and tooling. Happy building and [happy optimizing](https://github.com/spotify/backstage/tree/master/plugins/cost-insights).
+There’s DevOps, there’s DevSecOps, and then there’s Backstage: one frontend for all your infrastructure. From building, testing, and deploying to monitoring and security — Backstage helps you manage your entire tech organization and provides a seamless developer experience for engineers, from end to end to end. And now that also extends to cost management for your cloud infrastructure and tooling. Happy building and [happy optimizing](https://github.com/backstage/backstage/tree/master/plugins/cost-insights).
diff --git a/microsite/blog/2020-12-22-stability-index.md b/microsite/blog/2020-12-22-stability-index.md
new file mode 100644
index 0000000000..95074a13a2
--- /dev/null
+++ b/microsite/blog/2020-12-22-stability-index.md
@@ -0,0 +1,42 @@
+---
+title: Announcing the Backstage Stability Index
+author: Patrik Oldsberg, Spotify
+authorURL: https://github.com/Rugvip
+---
+
+**TL;DR** Backstage is heading out of alpha and moving onto the path to stable releases and an eventual version 1.0. As the community and ecosystem continue to grow at an increasing rate, we want to provide a solid foundation for everyone building things in, with, and around Backstage. So, today we’re introducing the [Stability Index](https://backstage.io/docs/overview/stability-index) — a simple way to find out how likely (or unlikely) a specific package or plugin inside Backstage might be updated with major changes. By indicating the reliability of key features and APIs, this quick reference will help contributors and adopters better plan and coordinate their development efforts going forward.
+
+
+
+
+
+Backstage has a great and growing community of users and contributors. With so much valuable feedback, this inevitably means that sometimes we will go back and revise design decisions that introduce breaking changes. Furthermore, as we continue to ship new features and systems, we’ll continue this cycle of iterating, gathering feedback, and iterating again before reaching a stable API.
+
+This rapid evolution can create uncertainty around which parts of the project are considered stable and which are not. Regardless of whether you're contributing to the project directly, setting up your own Backstage, or building plugins, you will be using various parts of the project that vary in stability. While many API surfaces of Backstage are reasonably solid and are unlikely to see any big breaking changes, others are more unstable or experimental.
+
+## The Stability Index
+
+In order to tackle the problem of uncertainty, and help align contributors, we have recently introduced a Stability Index. Inspired by a [similar concept with the same name in Node.js](https://nodejs.org/docs/latest-v4.x/api/documentation.html#documentation_stability_index), it’s a score assigned to subsets of the project, indicating the level of maturity of the API and the commitment to backwards compatibility. However, because of the current phase of the project, we have used a slightly different implementation. Rather than the score indicating a perceived stability, a higher score is instead a commitment to providing a smoother upgrade path for users, both through better documentation and backwards compatibility. Importantly, the Stability Index does not supersede [semantic versioning](https://semver.org/) (or semver), meaning we will still adhere to semver and only do breaking changes in minor releases as long as we are on 0.x.
+
+You can find more details about the scores on the [Stability Index](https://backstage.io/docs/overview/stability-index) page, but the following is a TL;DR of the 0–3 scores:
+
+- **0** — There's a changelog entry.
+- **1** — There's a migration guide.
+- **2** — Two weeks of deprecation.
+- **3** — Three months of deprecation.
+
+The Stability Index has been tailored for the phase that the project is currently in, and we do not intend to keep it in place in its current form forever. It is, for example, likely that we in the future will increase the deprecation time limits.
+
+## Staying up to date
+
+In addition to the Stability Index, we have also recently adopted a weekly release cadence where we cut new releases every Thursday. Along with the two-week deprecation period of many of the API surfaces in Backstage, there is an excellent opportunity to form a routine to update your own Backstage projects either weekly or biweekly.
+
+In order to make the update process easier, we’ve added a new command to the Backstage CLI that allows you to easily update your project to use the latest Backstage release. The command is called `version:bump` and is executed in the root of your project using the CLI. You can see what it looks like in action below.
+
+
+
+## Impact
+
+The Stability Index has already been active for a couple of weeks, and we have immediately seen an impact on the consideration and care taken when working in parts of the project that we have committed to keeping more stable. Both members of the core maintainer team and contributors from the community have taken care to roll out updates responsibly, with examples such as [PR #3524](https://github.com/backstage/backstage/pull/3524) and [PR #3465](https://github.com/backstage/backstage/pull/3465).
+
+The core team is working hard to bring more stability to broader parts of Backstage, and engineering it in a way that allows for long-term evolution. There are more learnings to be discovered as we continue evolving Backstage, but we are confident that the Stability Index will allow for a clearer path and a smoother ride for everyone involved!
diff --git a/microsite/blog/assets/2020-12-22/stability-index-hero.gif b/microsite/blog/assets/2020-12-22/stability-index-hero.gif
new file mode 100644
index 0000000000..6459d241e2
Binary files /dev/null and b/microsite/blog/assets/2020-12-22/stability-index-hero.gif differ
diff --git a/microsite/blog/assets/2020-12-22/versions-bump.png b/microsite/blog/assets/2020-12-22/versions-bump.png
new file mode 100644
index 0000000000..2a8d624687
Binary files /dev/null and b/microsite/blog/assets/2020-12-22/versions-bump.png differ
diff --git a/microsite/core/Footer.js b/microsite/core/Footer.js
index 1bebf2f399..1471d7b4d1 100644
--- a/microsite/core/Footer.js
+++ b/microsite/core/Footer.js
@@ -17,19 +17,6 @@
const React = require('react');
class Footer extends React.Component {
- docUrl(doc, language) {
- const baseUrl = this.props.config.baseUrl;
- const docsUrl = this.props.config.docsUrl;
- const docsPart = `${docsUrl ? `${docsUrl}/` : ''}`;
- const langPart = `${language ? `${language}/` : ''}`;
- return `${baseUrl}${docsPart}${langPart}${doc}`;
- }
-
- pageUrl(doc, language) {
- const baseUrl = this.props.config.baseUrl;
- return baseUrl + (language ? `${language}/` : '') + doc;
- }
-
render() {
return (