diff --git a/.changeset/angry-flowers-yawn.md b/.changeset/angry-flowers-yawn.md
new file mode 100644
index 0000000000..8f478b1eab
--- /dev/null
+++ b/.changeset/angry-flowers-yawn.md
@@ -0,0 +1,29 @@
+---
+'@backstage/catalog-model': patch
+'@backstage/plugin-catalog-backend': patch
+---
+
+Adds a `backstage.io/managed-by-origin-location` annotation to all entities. It links to the
+location that was registered to the catalog and which emitted this entity. It has a different
+semantic than the existing `backstage.io/managed-by-location` annotation, which tells the direct
+parent location that created this entity.
+
+Consider this example: The Backstage operator adds a location of type `github-org` in the
+`app-config.yaml`. This setting will be added to a `bootstrap:boostrap` location. The processor
+discovers the entities in the following branch
+`Location bootstrap:bootstrap -> Location github-org:… -> User xyz`. The user `xyz` will be:
+
+```yaml
+apiVersion: backstage.io/v1alpha1
+kind: User
+metadata:
+ name: xyz
+ annotations:
+ # This entity was added by the 'github-org:…' location
+ backstage.io/managed-by-location: github-org:…
+ # The entity was added because the 'bootstrap:boostrap' was added to the catalog
+ backstage.io/managed-by-origin-location: bootstrap:bootstrap
+ # ...
+spec:
+ # ...
+```
diff --git a/.changeset/bright-radios-eat.md b/.changeset/bright-radios-eat.md
new file mode 100644
index 0000000000..73d2b32e23
--- /dev/null
+++ b/.changeset/bright-radios-eat.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-github-actions': minor
+---
+
+Support GHE
diff --git a/.changeset/calm-turtles-smoke.md b/.changeset/calm-turtles-smoke.md
new file mode 100644
index 0000000000..f2d473fe9f
--- /dev/null
+++ b/.changeset/calm-turtles-smoke.md
@@ -0,0 +1,7 @@
+---
+'@backstage/core': minor
+---
+
+Removed `InfoCard` variant `height100`, originally deprecated in [#2826](https://github.com/backstage/backstage/pull/2826).
+
+If your component still relies on this variant, simply replace it with `gridItem`.
diff --git a/.changeset/cool-horses-applaud.md b/.changeset/cool-horses-applaud.md
new file mode 100644
index 0000000000..83667d2b54
--- /dev/null
+++ b/.changeset/cool-horses-applaud.md
@@ -0,0 +1,6 @@
+---
+'@backstage/plugin-catalog': patch
+---
+
+Derive the list of to-delete entities in the `UnregisterEntityDialog` from the `backstage.io/managed-by-origin-location` annotation.
+The dialog also rejects deleting entities that are created by the `bootstrap:bootstrap` location.
diff --git a/.changeset/green-coins-confess.md b/.changeset/green-coins-confess.md
new file mode 100644
index 0000000000..7fc52b8a43
--- /dev/null
+++ b/.changeset/green-coins-confess.md
@@ -0,0 +1,40 @@
+---
+'@backstage/create-app': patch
+---
+
+Migrate to using `FlatRoutes` from `@backstage/core` for the root app routes.
+
+This is the first step in migrating applications as mentioned here: https://backstage.io/docs/plugins/composability#porting-existing-apps.
+
+To apply this change to an existing app, switch out the `Routes` component from `react-router` to `FlatRoutes` from `@backstage/core`.
+This also allows you to remove any `/*` suffixes on the route paths. For example:
+
+```diff
+import {
+ OAuthRequestDialog,
+ SidebarPage,
+ createRouteRef,
++ FlatRoutes,
+ } from '@backstage/core';
+ import { AppSidebar } from './sidebar';
+-import { Route, Routes, Navigate } from 'react-router';
++import { Route, Navigate } from 'react-router';
+ import { Router as CatalogRouter } from '@backstage/plugin-catalog';
+...
+
+-
++
+...
+ }
+ />
+- } />
++ } />
+...
+ } />
+-
++
+
+```
diff --git a/.changeset/khaki-icons-trade.md b/.changeset/khaki-icons-trade.md
new file mode 100644
index 0000000000..4d30c3977e
--- /dev/null
+++ b/.changeset/khaki-icons-trade.md
@@ -0,0 +1,26 @@
+---
+'@backstage/backend-common': patch
+---
+
+1. URL Reader's `readTree` method now returns an `etag` in the response along with the blob. The etag is an identifier of the blob and will only change if the blob is modified on the target. Usually it is set to the latest commit SHA on the target.
+
+`readTree` also takes an optional `etag` in its options and throws a `NotModifiedError` if the etag matches with the etag of the resource.
+
+So, the `etag` can be used in building a cache when working with URL Reader.
+
+An example -
+
+```ts
+const response = await reader.readTree(
+ 'https://github.com/backstage/backstage',
+);
+
+const etag = response.etag;
+
+// Will throw a new NotModifiedError (exported from @backstage/backstage-common)
+await reader.readTree('https://github.com/backstage/backstage', {
+ etag,
+});
+```
+
+2. URL Reader's readTree method can now detect the default branch. So, `url:https://github.com/org/repo/tree/master` can be replaced with `url:https://github.com/org/repo` in places like `backstage.io/techdocs-ref`.
diff --git a/.changeset/nervous-mails-repair.md b/.changeset/nervous-mails-repair.md
new file mode 100644
index 0000000000..f72e2b5e66
--- /dev/null
+++ b/.changeset/nervous-mails-repair.md
@@ -0,0 +1,5 @@
+---
+'@backstage/integration': patch
+---
+
+Fix GitLab API base URL and add it by default to the gitlab.com host
diff --git a/.changeset/proud-news-impress.md b/.changeset/proud-news-impress.md
new file mode 100644
index 0000000000..d10c37819f
--- /dev/null
+++ b/.changeset/proud-news-impress.md
@@ -0,0 +1,55 @@
+---
+'@backstage/core': minor
+---
+
+Removed deprecated `router.registerRoute` method in `createPlugin`.
+
+Deprecated `router.addRoute` method in `createPlugin`.
+
+Replace usage of the above two components with a routable extension.
+
+For example, given the following:
+
+```ts
+import { createPlugin } from '@backstage/core';
+import { MyPage } from './components/MyPage';
+import { rootRoute } from './routes';
+
+export const plugin = createPlugin({
+ id: 'my-plugin',
+ register({ router }) {
+ router.addRoute(rootRoute, MyPage);
+ },
+});
+```
+
+Migrate to
+
+```ts
+import { createPlugin, createRoutableExtension } from '@backstage/core';
+import { rootRoute } from './routes';
+
+export const plugin = createPlugin({
+ id: 'my-plugin',
+ routes: {
+ root: rootRoute,
+ },
+});
+
+export const MyPage = plugin.provide(
+ createRoutableExtension({
+ component: () => import('./components/MyPage').then(m => m.MyPage),
+ mountPoint: rootRoute,
+ }),
+);
+```
+
+And then use `MyPage` like this in the app:
+
+```tsx
+
+...
+ }>
+...
+
+```
diff --git a/.changeset/rich-turtles-roll.md b/.changeset/rich-turtles-roll.md
new file mode 100644
index 0000000000..9015161369
--- /dev/null
+++ b/.changeset/rich-turtles-roll.md
@@ -0,0 +1,19 @@
+---
+'@backstage/backend-common': minor
+---
+
+Remove fallback option from `UrlReaders.create` and `UrlReaders.default`, as well as the default fallback reader.
+
+To be able to read data from endpoints outside of the configured integrations, you now need to explicitly allow it by
+adding an entry in the `backend.reading.allow` list. For example:
+
+```yml
+backend:
+ baseUrl: ...
+ reading:
+ allow:
+ - host: example.com
+ - host: '*.examples.org'
+```
+
+Apart from adding the above configuration, most projects should not need to take any action to migrate existing code. If you do happen to have your own fallback reader configured, this needs to be replaced with a reader factory that selects a specific set of URLs to work with. If you where wrapping the existing fallback reader, the new one that handles the allow list is created using `FetchUrlReader.factory`.
diff --git a/.changeset/strong-ligers-lay.md b/.changeset/strong-ligers-lay.md
new file mode 100644
index 0000000000..56f4a91a9d
--- /dev/null
+++ b/.changeset/strong-ligers-lay.md
@@ -0,0 +1,6 @@
+---
+'@backstage/plugin-catalog': patch
+---
+
+Display systems in catalog table and make both owner and system link to the entity pages.
+The owner field is now taken from the relations of the entity instead of its spec.
diff --git a/.changeset/techdocs-glasses-wonder.md b/.changeset/techdocs-glasses-wonder.md
new file mode 100644
index 0000000000..7610be2665
--- /dev/null
+++ b/.changeset/techdocs-glasses-wonder.md
@@ -0,0 +1,5 @@
+---
+'@backstage/techdocs-common': patch
+---
+
+TechDocs backend now streams files through from Google Cloud Storage to the browser, improving memory usage.
diff --git a/.changeset/twelve-ants-sort.md b/.changeset/twelve-ants-sort.md
new file mode 100644
index 0000000000..978047ab8e
--- /dev/null
+++ b/.changeset/twelve-ants-sort.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-auth-backend': patch
+---
+
+Add AWS ALB OIDC reverse proxy authentication provider
diff --git a/.changeset/warm-months-bake.md b/.changeset/warm-months-bake.md
new file mode 100644
index 0000000000..c8f3723eb1
--- /dev/null
+++ b/.changeset/warm-months-bake.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-lighthouse': patch
+---
+
+Fix display of floating point precision errors in card category scores
diff --git a/.changeset/wise-mice-invite.md b/.changeset/wise-mice-invite.md
new file mode 100644
index 0000000000..9021336c07
--- /dev/null
+++ b/.changeset/wise-mice-invite.md
@@ -0,0 +1,5 @@
+---
+'@backstage/backend-common': minor
+---
+
+Remove support for HTTPS certificate generation parameters. Use `backend.https = true` instead.
diff --git a/.changeset/yellow-ties-switch.md b/.changeset/yellow-ties-switch.md
new file mode 100644
index 0000000000..784d2a18ae
--- /dev/null
+++ b/.changeset/yellow-ties-switch.md
@@ -0,0 +1,5 @@
+---
+'@backstage/catalog-model': minor
+---
+
+The catalog no longer attempts to merge old and new annotations, when updating an entity from a remote location. This was a behavior that was copied from kubernetes, and catered to use cases where you wanted to use HTTP POST to update an entity in-place, outside of what the refresh loop does. This has proved to be a mistake, because as a side effect, the refresh loop effectively is unable to ever delete annotations when they are removed from source YAML. This is obviously a breaking change, but we believe that this is not a behavior that is relied upon in the wild, and it has never been an actually supported use flow of the catalog. We therefore choose to break the behavior outright, and instead just store updated annotations verbatim - just like we already do for example for labels
diff --git a/.github/styles/vocab.txt b/.github/styles/vocab.txt
index c3c67ab66e..03f84f4417 100644
--- a/.github/styles/vocab.txt
+++ b/.github/styles/vocab.txt
@@ -67,6 +67,7 @@ Dominik
dtuite
dzolotusky
Ek
+etag
env
Env
eslint
@@ -115,6 +116,7 @@ Kumar
learnings
lerna
Lerna
+Luxon
magiclink
mailto
maintainership
diff --git a/README.md b/README.md
index d2e01195d4..7c04672998 100644
--- a/README.md
+++ b/README.md
@@ -39,7 +39,7 @@ Check out [the documentation](https://backstage.io/docs/getting-started) on how
- [Main documentation](https://backstage.io/docs)
- [Service Catalog](https://backstage.io/docs/features/software-catalog/software-catalog-overview)
-- [Architecture](https://backstage.io/docs/overview/architecture-terminology) ([Decisions](https://backstage.io/docs/architecture-decisions/adrs-overview))
+- [Architecture](https://backstage.io/docs/overview/architecture-overview) ([Decisions](https://backstage.io/docs/architecture-decisions/adrs-overview))
- [Designing for Backstage](https://backstage.io/docs/dls/design)
- [Storybook - UI components](https://backstage.io/storybook)
@@ -57,6 +57,6 @@ Check out [the documentation](https://backstage.io/docs/getting-started) on how
## License
-Copyright 2020 © Backstage Project Authors. All rights reserved. The Linux Foundation has registered trademarks and uses trademarks. For a list of trademarks of The Linux Foundation, please see our Trademark Usage page: https://www.linuxfoundation.org/trademark-usage
+Copyright 2020-2021 © Backstage Project Authors. All rights reserved. The Linux Foundation has registered trademarks and uses trademarks. For a list of trademarks of The Linux Foundation, please see our Trademark Usage page: https://www.linuxfoundation.org/trademark-usage
Licensed under the Apache License, Version 2.0: http://www.apache.org/licenses/LICENSE-2.0
diff --git a/app-config.yaml b/app-config.yaml
index 5866354a87..741991877e 100644
--- a/app-config.yaml
+++ b/app-config.yaml
@@ -16,6 +16,10 @@ backend:
credentials: true
csp:
connect-src: ["'self'", 'http:', 'https:']
+ reading:
+ allow:
+ - host: example.com
+ - host: '*.mozilla.org'
# 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
diff --git a/catalog-info.yaml b/catalog-info.yaml
index 2144d1709c..7e60af5755 100644
--- a/catalog-info.yaml
+++ b/catalog-info.yaml
@@ -6,7 +6,7 @@ metadata:
Backstage is an open-source developer portal that puts the developer experience first.
annotations:
github.com/project-slug: backstage/backstage
- backstage.io/techdocs-ref: url:https://github.com/backstage/backstage/tree/master
+ backstage.io/techdocs-ref: url:https://github.com/backstage/backstage
lighthouse.com/website-url: https://backstage.io
spec:
type: library
diff --git a/docs/architecture-decisions/adr000-template.md b/docs/architecture-decisions/adr000-template.md
index 783db8e4bc..538afccf87 100644
--- a/docs/architecture-decisions/adr000-template.md
+++ b/docs/architecture-decisions/adr000-template.md
@@ -4,18 +4,10 @@ title: ADR000: [TITLE]
description: Architecture Decision Record (ADR) for [TITLE] [DESCRIPTION]
---
-| Created | Status |
-| ---------- | ------ |
-| YYYY-MM-DD | Open |
-
# ADR000: [title]
-## Status
-
-
-
## Context