diff --git a/packages/create-app/templates/default-app/examples/README.md b/packages/create-app/templates/default-app/examples/README.md
new file mode 100644
index 0000000000..77e1084899
--- /dev/null
+++ b/packages/create-app/templates/default-app/examples/README.md
@@ -0,0 +1,4 @@
+# Example Entities
+
+This is a set of example entities that you can make use of to demonstrate basic
+Backstage features.
diff --git a/packages/create-app/templates/default-app/examples/acme-corp.yaml b/packages/create-app/templates/default-app/examples/acme-corp.yaml
new file mode 100644
index 0000000000..6449d548e0
--- /dev/null
+++ b/packages/create-app/templates/default-app/examples/acme-corp.yaml
@@ -0,0 +1,8 @@
+apiVersion: backstage.io/v1alpha1
+kind: Location
+metadata:
+ name: acme-corp
+ description: A collection of all Backstage example Groups
+spec:
+ targets:
+ - ./acme/org.yaml
diff --git a/packages/create-app/templates/default-app/examples/acme/backstage-group.yaml b/packages/create-app/templates/default-app/examples/acme/backstage-group.yaml
new file mode 100644
index 0000000000..f83587532c
--- /dev/null
+++ b/packages/create-app/templates/default-app/examples/acme/backstage-group.yaml
@@ -0,0 +1,13 @@
+apiVersion: backstage.io/v1alpha1
+kind: Group
+metadata:
+ name: backstage
+ description: The backstage sub-department
+spec:
+ type: sub-department
+ profile:
+ displayName: Backstage
+ email: backstage@example.com
+ picture: https://avatars.dicebear.com/api/identicon/backstage@example.com.svg?background=%23fff&margin=25
+ parent: infrastructure
+ children: [team-a, team-b]
diff --git a/packages/create-app/templates/default-app/examples/acme/boxoffice-group.yaml b/packages/create-app/templates/default-app/examples/acme/boxoffice-group.yaml
new file mode 100644
index 0000000000..fbd454c56e
--- /dev/null
+++ b/packages/create-app/templates/default-app/examples/acme/boxoffice-group.yaml
@@ -0,0 +1,13 @@
+apiVersion: backstage.io/v1alpha1
+kind: Group
+metadata:
+ name: boxoffice
+ description: The boxoffice sub-department
+spec:
+ type: sub-department
+ profile:
+ displayName: Box Office
+ email: boxoffice@example.com
+ # Intentional no picture for testing
+ parent: infrastructure
+ children: [team-c, team-d]
diff --git a/packages/create-app/templates/default-app/examples/acme/infrastructure-group.yaml b/packages/create-app/templates/default-app/examples/acme/infrastructure-group.yaml
new file mode 100644
index 0000000000..584578e6ce
--- /dev/null
+++ b/packages/create-app/templates/default-app/examples/acme/infrastructure-group.yaml
@@ -0,0 +1,10 @@
+apiVersion: backstage.io/v1alpha1
+kind: Group
+metadata:
+ name: infrastructure
+ description: The infra department
+spec:
+ type: department
+ # Intentional no profile for testing
+ parent: acme-corp
+ children: [backstage, boxoffice]
diff --git a/packages/create-app/templates/default-app/examples/acme/org.yaml b/packages/create-app/templates/default-app/examples/acme/org.yaml
new file mode 100644
index 0000000000..9a0d690b57
--- /dev/null
+++ b/packages/create-app/templates/default-app/examples/acme/org.yaml
@@ -0,0 +1,32 @@
+apiVersion: backstage.io/v1alpha1
+kind: Group
+metadata:
+ name: acme-corp
+ description: The acme-corp organization
+ links:
+ - url: http://www.acme.com/
+ title: Website
+ - url: https://meta.wikimedia.org/wiki/
+ title: Intranet
+spec:
+ type: organization
+ profile:
+ displayName: ACME Corp
+ email: info@example.com
+ picture: https://avatars.dicebear.com/api/identicon/info@example.com.svg?background=%23fff&margin=25
+ children: [infrastructure]
+---
+apiVersion: backstage.io/v1alpha1
+kind: Location
+metadata:
+ name: example-groups
+ description: A collection of all Backstage example Groups
+spec:
+ targets:
+ - ./infrastructure-group.yaml
+ - ./boxoffice-group.yaml
+ - ./backstage-group.yaml
+ - ./team-a-group.yaml
+ - ./team-b-group.yaml
+ - ./team-c-group.yaml
+ - ./team-d-group.yaml
diff --git a/packages/create-app/templates/default-app/examples/acme/team-a-group.yaml b/packages/create-app/templates/default-app/examples/acme/team-a-group.yaml
new file mode 100644
index 0000000000..e343209d5f
--- /dev/null
+++ b/packages/create-app/templates/default-app/examples/acme/team-a-group.yaml
@@ -0,0 +1,60 @@
+apiVersion: backstage.io/v1alpha1
+kind: Group
+metadata:
+ name: team-a
+ description: Team A
+spec:
+ type: team
+ profile:
+ # Intentional no displayName for testing
+ email: team-a@example.com
+ picture: https://avatars.dicebear.com/api/identicon/team-a@example.com.svg?background=%23fff&margin=25
+ parent: backstage
+ children: []
+---
+apiVersion: backstage.io/v1alpha1
+kind: User
+metadata:
+ name: breanna.davison
+spec:
+ profile:
+ # Intentional no displayName for testing
+ email: breanna-davison@example.com
+ picture: https://avatars.dicebear.com/api/avataaars/breanna-davison@example.com.svg?background=%23fff
+ memberOf: [team-a]
+---
+apiVersion: backstage.io/v1alpha1
+kind: User
+metadata:
+ name: janelle.dawe
+spec:
+ profile:
+ displayName: Janelle Dawe
+ email: janelle-dawe@example.com
+ picture: https://avatars.dicebear.com/api/avataaars/janelle-dawe@example.com.svg?background=%23fff
+ memberOf: [team-a]
+---
+apiVersion: backstage.io/v1alpha1
+kind: User
+metadata:
+ name: nigel.manning
+spec:
+ profile:
+ displayName: Nigel Manning
+ email: nigel-manning@example.com
+ picture: https://avatars.dicebear.com/api/avataaars/nigel-manning@example.com.svg?background=%23fff
+ memberOf: [team-a]
+---
+# This user is added as an example, to make it more easy for the "Guest"
+# sign-in option to demonstrate some entities being owned. In a regular org,
+# a guest user would probably not be registered like this.
+apiVersion: backstage.io/v1alpha1
+kind: User
+metadata:
+ name: guest
+spec:
+ profile:
+ displayName: Guest User
+ email: guest@example.com
+ picture: https://avatars.dicebear.com/api/avataaars/guest@example.com.svg?background=%23fff
+ memberOf: [team-a]
diff --git a/packages/create-app/templates/default-app/examples/acme/team-b-group.yaml b/packages/create-app/templates/default-app/examples/acme/team-b-group.yaml
new file mode 100644
index 0000000000..20ab8721ea
--- /dev/null
+++ b/packages/create-app/templates/default-app/examples/acme/team-b-group.yaml
@@ -0,0 +1,68 @@
+apiVersion: backstage.io/v1alpha1
+kind: Group
+metadata:
+ name: team-b
+ description: Team B
+spec:
+ type: team
+ profile:
+ displayName: Team B
+ email: team-b@example.com
+ picture: https://avatars.dicebear.com/api/identicon/team-b@example.com.svg?background=%23fff&margin=25
+ parent: backstage
+ children: []
+---
+apiVersion: backstage.io/v1alpha1
+kind: User
+metadata:
+ name: amelia.park
+spec:
+ profile:
+ displayName: Amelia Park
+ email: amelia-park@example.com
+ picture: https://avatars.dicebear.com/api/avataaars/amelia-park@example.com.svg?background=%23fff
+ memberOf: [team-b]
+---
+apiVersion: backstage.io/v1alpha1
+kind: User
+metadata:
+ name: colette.brock
+spec:
+ profile:
+ displayName: Colette Brock
+ email: colette-brock@example.com
+ picture: https://avatars.dicebear.com/api/avataaars/colette-brock@example.com.svg?background=%23fff
+ memberOf: [team-b]
+---
+apiVersion: backstage.io/v1alpha1
+kind: User
+metadata:
+ name: jenny.doe
+spec:
+ profile:
+ displayName: Jenny Doe
+ email: jenny-doe@example.com
+ picture: https://avatars.dicebear.com/api/avataaars/jenny-doe@example.com.svg?background=%23fff
+ memberOf: [team-b]
+---
+apiVersion: backstage.io/v1alpha1
+kind: User
+metadata:
+ name: jonathon.page
+spec:
+ profile:
+ displayName: Jonathon Page
+ email: jonathon-page@example.com
+ picture: https://avatars.dicebear.com/api/avataaars/jonathon-page@example.com.svg?background=%23fff
+ memberOf: [team-b]
+---
+apiVersion: backstage.io/v1alpha1
+kind: User
+metadata:
+ name: justine.barrow
+spec:
+ profile:
+ displayName: Justine Barrow
+ email: justine-barrow@example.com
+ picture: https://avatars.dicebear.com/api/avataaars/justine-barrow@example.com.svg?background=%23fff
+ memberOf: [team-b]
diff --git a/packages/create-app/templates/default-app/examples/acme/team-c-group.yaml b/packages/create-app/templates/default-app/examples/acme/team-c-group.yaml
new file mode 100644
index 0000000000..639b591d61
--- /dev/null
+++ b/packages/create-app/templates/default-app/examples/acme/team-c-group.yaml
@@ -0,0 +1,68 @@
+apiVersion: backstage.io/v1alpha1
+kind: Group
+metadata:
+ name: team-c
+ description: Team C
+spec:
+ type: team
+ profile:
+ displayName: Team C
+ email: team-c@example.com
+ picture: https://avatars.dicebear.com/api/identicon/team-c@example.com.svg?background=%23fff&margin=25
+ parent: boxoffice
+ children: []
+---
+apiVersion: backstage.io/v1alpha1
+kind: User
+metadata:
+ name: calum.leavy
+spec:
+ profile:
+ displayName: Calum Leavy
+ email: calum-leavy@example.com
+ picture: https://avatars.dicebear.com/api/avataaars/calum-leavy@example.com.svg?background=%23fff
+ memberOf: [team-c]
+---
+apiVersion: backstage.io/v1alpha1
+kind: User
+metadata:
+ name: frank.tiernan
+spec:
+ profile:
+ displayName: Frank Tiernan
+ email: frank-tiernan@example.com
+ picture: https://avatars.dicebear.com/api/avataaars/frank-tiernan@example.com.svg?background=%23fff
+ memberOf: [team-c]
+---
+apiVersion: backstage.io/v1alpha1
+kind: User
+metadata:
+ name: peadar.macmahon
+spec:
+ profile:
+ displayName: Peadar MacMahon
+ email: peadar-macmahon@example.com
+ picture: https://avatars.dicebear.com/api/avataaars/peadar-macmahon@example.com.svg?background=%23fff
+ memberOf: [team-c]
+---
+apiVersion: backstage.io/v1alpha1
+kind: User
+metadata:
+ name: sarah.gilroy
+spec:
+ profile:
+ displayName: Sarah Gilroy
+ email: sarah-gilroy@example.com
+ picture: https://avatars.dicebear.com/api/avataaars/sarah-gilroy@example.com.svg?background=%23fff
+ memberOf: [team-c]
+---
+apiVersion: backstage.io/v1alpha1
+kind: User
+metadata:
+ name: tara.macgovern
+spec:
+ profile:
+ displayName: Tara MacGovern
+ email: tara-macgovern@example.com
+ picture: https://avatars.dicebear.com/api/avataaars/tara-macgovern@example.com.svg?background=%23fff
+ memberOf: [team-c]
diff --git a/packages/create-app/templates/default-app/examples/acme/team-d-group.yaml b/packages/create-app/templates/default-app/examples/acme/team-d-group.yaml
new file mode 100644
index 0000000000..898ed8be6c
--- /dev/null
+++ b/packages/create-app/templates/default-app/examples/acme/team-d-group.yaml
@@ -0,0 +1,35 @@
+apiVersion: backstage.io/v1alpha1
+kind: Group
+metadata:
+ name: team-d
+ description: Team D
+spec:
+ type: team
+ profile:
+ displayName: Team D
+ email: team-d@example.com
+ picture: https://avatars.dicebear.com/api/identicon/team-d@example.com.svg?background=%23fff&margin=25
+ parent: boxoffice
+ children: []
+---
+apiVersion: backstage.io/v1alpha1
+kind: User
+metadata:
+ name: eva.macdowell
+spec:
+ profile:
+ displayName: Eva MacDowell
+ email: eva-macdowell@example.com
+ picture: https://avatars.dicebear.com/api/avataaars/eva-macdowell@example.com.svg?background=%23fff
+ memberOf: [team-d]
+---
+apiVersion: backstage.io/v1alpha1
+kind: User
+metadata:
+ name: lucy.sheehan
+spec:
+ profile:
+ displayName: Lucy Sheehan
+ email: lucy-sheehan@example.com
+ picture: https://avatars.dicebear.com/api/avataaars/lucy-sheehan@example.com.svg?background=%23fff
+ memberOf: [team-d]
diff --git a/packages/create-app/templates/default-app/examples/all-apis.yaml b/packages/create-app/templates/default-app/examples/all-apis.yaml
new file mode 100644
index 0000000000..e23f1b3656
--- /dev/null
+++ b/packages/create-app/templates/default-app/examples/all-apis.yaml
@@ -0,0 +1,14 @@
+apiVersion: backstage.io/v1alpha1
+kind: Location
+metadata:
+ name: example-apis
+ description: A collection of all Backstage example APIs
+spec:
+ targets:
+ - ./apis/hello-world-api.yaml
+ - ./apis/petstore-api.yaml
+ - ./apis/spotify-api.yaml
+ - ./apis/streetlights-api.yaml
+ - ./apis/swapi-graphql.yaml
+ - ./apis/wayback-archive-api.yaml
+ - ./apis/wayback-search-api.yaml
diff --git a/packages/create-app/templates/default-app/examples/all-components.yaml b/packages/create-app/templates/default-app/examples/all-components.yaml
new file mode 100644
index 0000000000..9471b810a1
--- /dev/null
+++ b/packages/create-app/templates/default-app/examples/all-components.yaml
@@ -0,0 +1,20 @@
+apiVersion: backstage.io/v1alpha1
+kind: Location
+metadata:
+ name: example-components
+ description: A collection of all Backstage example components
+spec:
+ targets:
+ - ./components/artist-lookup-component.yaml
+ - ./components/petstore-component.yaml
+ - ./components/playback-order-component.yaml
+ - ./components/podcast-api-component.yaml
+ - ./components/queue-proxy-component.yaml
+ - ./components/searcher-component.yaml
+ - ./components/playback-lib-component.yaml
+ - ./components/www-artist-component.yaml
+ - ./components/shuffle-api-component.yaml
+ - ./components/wayback-archive-component.yaml
+ - ./components/wayback-archive-ingestion-component.yaml
+ - ./components/wayback-archive-storage-component.yaml
+ - ./components/wayback-search-component.yaml
diff --git a/packages/create-app/templates/default-app/examples/all-domains.yaml b/packages/create-app/templates/default-app/examples/all-domains.yaml
new file mode 100644
index 0000000000..91a8a5b76d
--- /dev/null
+++ b/packages/create-app/templates/default-app/examples/all-domains.yaml
@@ -0,0 +1,9 @@
+apiVersion: backstage.io/v1alpha1
+kind: Location
+metadata:
+ name: example-domains
+ description: A collection of all Backstage example domains
+spec:
+ targets:
+ - ./domains/artists-domain.yaml
+ - ./domains/playback-domain.yaml
diff --git a/packages/create-app/templates/default-app/examples/all-resources.yaml b/packages/create-app/templates/default-app/examples/all-resources.yaml
new file mode 100644
index 0000000000..d0986e3fe2
--- /dev/null
+++ b/packages/create-app/templates/default-app/examples/all-resources.yaml
@@ -0,0 +1,8 @@
+apiVersion: backstage.io/v1alpha1
+kind: Location
+metadata:
+ name: example-resources
+ description: A collection of all Backstage example resources
+spec:
+ targets:
+ - ./resources/artists-db-resource.yaml
diff --git a/packages/create-app/templates/default-app/examples/all-systems.yaml b/packages/create-app/templates/default-app/examples/all-systems.yaml
new file mode 100644
index 0000000000..165bee54e5
--- /dev/null
+++ b/packages/create-app/templates/default-app/examples/all-systems.yaml
@@ -0,0 +1,10 @@
+apiVersion: backstage.io/v1alpha1
+kind: Location
+metadata:
+ name: example-systems
+ description: A collection of all Backstage example systems
+spec:
+ targets:
+ - ./systems/artist-engagement-portal-system.yaml
+ - ./systems/audio-playback-system.yaml
+ - ./systems/podcast-system.yaml
diff --git a/packages/create-app/templates/default-app/examples/all-templates.yaml b/packages/create-app/templates/default-app/examples/all-templates.yaml
new file mode 100644
index 0000000000..108097f4e3
--- /dev/null
+++ b/packages/create-app/templates/default-app/examples/all-templates.yaml
@@ -0,0 +1,8 @@
+apiVersion: backstage.io/v1alpha1
+kind: Location
+metadata:
+ name: example-templates
+ description: A collection of all Backstage example templates
+spec:
+ targets:
+ - ./templates/create-react-app/template.yaml
diff --git a/packages/create-app/templates/default-app/examples/apis/hello-world-api.yaml b/packages/create-app/templates/default-app/examples/apis/hello-world-api.yaml
new file mode 100644
index 0000000000..0f9786329f
--- /dev/null
+++ b/packages/create-app/templates/default-app/examples/apis/hello-world-api.yaml
@@ -0,0 +1,48 @@
+apiVersion: backstage.io/v1alpha1
+kind: API
+metadata:
+ name: hello-world
+ description: Hello World example for gRPC
+spec:
+ type: grpc
+ lifecycle: deprecated
+ owner: team-c
+ definition: |
+ // Copyright 2015 gRPC authors.
+ //
+ // 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.
+
+ syntax = "proto3";
+
+ option java_multiple_files = true;
+ option java_package = "io.grpc.examples.helloworld";
+ option java_outer_classname = "HelloWorldProto";
+ option objc_class_prefix = "HLW";
+
+ package helloworld;
+
+ // The greeting service definition.
+ service Greeter {
+ // Sends a greeting
+ rpc SayHello (HelloRequest) returns (HelloReply) {}
+ }
+
+ // The request message containing the user's name.
+ message HelloRequest {
+ string name = 1;
+ }
+
+ // The response message containing the greetings
+ message HelloReply {
+ string message = 1;
+ }
diff --git a/packages/create-app/templates/default-app/examples/apis/petstore-api.yaml b/packages/create-app/templates/default-app/examples/apis/petstore-api.yaml
new file mode 100644
index 0000000000..5b6878f7d3
--- /dev/null
+++ b/packages/create-app/templates/default-app/examples/apis/petstore-api.yaml
@@ -0,0 +1,131 @@
+apiVersion: backstage.io/v1alpha1
+kind: API
+metadata:
+ name: petstore
+ description: The petstore API
+ tags:
+ - store
+ - rest
+ links:
+ - url: https://github.com/swagger-api/swagger-petstore
+ title: GitHub Repo
+ icon: github
+ - url: https://github.com/OAI/OpenAPI-Specification/blob/master/examples/v3.0/petstore.yaml
+ title: API Spec
+ icon: code
+spec:
+ type: openapi
+ lifecycle: experimental
+ owner: team-c
+ definition: |
+ openapi: "3.0.0"
+ info:
+ version: 1.0.0
+ title: Swagger Petstore
+ license:
+ name: MIT
+ servers:
+ - url: http://petstore.swagger.io/v1
+ paths:
+ /pets:
+ get:
+ summary: List all pets
+ operationId: listPets
+ tags:
+ - pets
+ parameters:
+ - name: limit
+ in: query
+ description: How many items to return at one time (max 100)
+ required: false
+ schema:
+ type: integer
+ format: int32
+ responses:
+ '200':
+ description: A paged array of pets
+ headers:
+ x-next:
+ description: A link to the next page of responses
+ schema:
+ type: string
+ content:
+ application/json:
+ schema:
+ $ref: "#/components/schemas/Pets"
+ default:
+ description: unexpected error
+ content:
+ application/json:
+ schema:
+ $ref: "#/components/schemas/Error"
+ post:
+ summary: Create a pet
+ operationId: createPets
+ tags:
+ - pets
+ responses:
+ '201':
+ description: Null response
+ default:
+ description: unexpected error
+ content:
+ application/json:
+ schema:
+ $ref: "#/components/schemas/Error"
+ /pets/{petId}:
+ get:
+ summary: Info for a specific pet
+ operationId: showPetById
+ tags:
+ - pets
+ parameters:
+ - name: petId
+ in: path
+ required: true
+ description: The id of the pet to retrieve
+ schema:
+ type: string
+ responses:
+ '200':
+ description: Expected response to a valid request
+ content:
+ application/json:
+ schema:
+ $ref: "#/components/schemas/Pet"
+ default:
+ description: unexpected error
+ content:
+ application/json:
+ schema:
+ $ref: "#/components/schemas/Error"
+ components:
+ schemas:
+ Pet:
+ type: object
+ required:
+ - id
+ - name
+ properties:
+ id:
+ type: integer
+ format: int64
+ name:
+ type: string
+ tag:
+ type: string
+ Pets:
+ type: array
+ items:
+ $ref: "#/components/schemas/Pet"
+ Error:
+ type: object
+ required:
+ - code
+ - message
+ properties:
+ code:
+ type: integer
+ format: int32
+ message:
+ type: string
diff --git a/packages/create-app/templates/default-app/examples/apis/spotify-api.yaml b/packages/create-app/templates/default-app/examples/apis/spotify-api.yaml
new file mode 100644
index 0000000000..1110627473
--- /dev/null
+++ b/packages/create-app/templates/default-app/examples/apis/spotify-api.yaml
@@ -0,0 +1,17 @@
+apiVersion: backstage.io/v1alpha1
+kind: API
+metadata:
+ name: spotify
+ description: The Spotify web API
+ tags:
+ - spotify
+ - rest
+ annotations:
+ # The annotation is deprecated, we use placeholders (see below) instead, remove it later.
+ 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: team-a
+ definition:
+ $text: https://github.com/APIs-guru/openapi-directory/blob/dab6854d4d599aafb0eb36e6c7ae1fe0c37509b7/APIs/spotify.com/2021.4.2/openapi.yaml
diff --git a/packages/create-app/templates/default-app/examples/apis/streetlights-api.yaml b/packages/create-app/templates/default-app/examples/apis/streetlights-api.yaml
new file mode 100644
index 0000000000..4e0dbb1396
--- /dev/null
+++ b/packages/create-app/templates/default-app/examples/apis/streetlights-api.yaml
@@ -0,0 +1,225 @@
+apiVersion: backstage.io/v1alpha1
+kind: API
+metadata:
+ name: streetlights
+ description: The Smartylighting Streetlights API allows you to remotely manage the city lights.
+ tags:
+ - mqtt
+ links:
+ - url: https://github.com/asyncapi/asyncapi/blob/master/examples/1.2.0/streetlights.yml
+ title: Source Code
+ icon: code
+spec:
+ type: asyncapi
+ lifecycle: production
+ owner: team-c
+ definition: |
+ asyncapi: 2.0.0
+ info:
+ title: Streetlights API
+ version: '1.0.0'
+ description: |
+ The Smartylighting Streetlights API allows you to remotely manage the city lights.
+
+ ### Check out its awesome features:
+
+ * Turn a specific streetlight on/off 🌃
+ * Dim a specific streetlight 😎
+ * Receive real-time information about environmental lighting conditions 📈
+ license:
+ name: Apache 2.0
+ url: https://www.apache.org/licenses/LICENSE-2.0
+
+ servers:
+ production:
+ url: api.streetlights.smartylighting.com:{port}
+ protocol: mqtt
+ description: Test broker
+ variables:
+ port:
+ description: Secure connection (TLS) is available through port 8883.
+ default: '1883'
+ enum:
+ - '1883'
+ - '8883'
+ security:
+ - apiKey: []
+ - supportedOauthFlows:
+ - streetlights:on
+ - streetlights:off
+ - streetlights:dim
+ - openIdConnectWellKnown: []
+
+ defaultContentType: application/json
+
+ channels:
+ smartylighting/streetlights/1/0/event/{streetlightId}/lighting/measured:
+ description: The topic on which measured values may be produced and consumed.
+ parameters:
+ streetlightId:
+ $ref: '#/components/parameters/streetlightId'
+ subscribe:
+ summary: Receive information about environmental lighting conditions of a particular streetlight.
+ operationId: receiveLightMeasurement
+ traits:
+ - $ref: '#/components/operationTraits/kafka'
+ message:
+ $ref: '#/components/messages/lightMeasured'
+
+ smartylighting/streetlights/1/0/action/{streetlightId}/turn/on:
+ parameters:
+ streetlightId:
+ $ref: '#/components/parameters/streetlightId'
+ publish:
+ operationId: turnOn
+ traits:
+ - $ref: '#/components/operationTraits/kafka'
+ message:
+ $ref: '#/components/messages/turnOnOff'
+
+ smartylighting/streetlights/1/0/action/{streetlightId}/turn/off:
+ parameters:
+ streetlightId:
+ $ref: '#/components/parameters/streetlightId'
+ publish:
+ operationId: turnOff
+ traits:
+ - $ref: '#/components/operationTraits/kafka'
+ message:
+ $ref: '#/components/messages/turnOnOff'
+
+ smartylighting/streetlights/1/0/action/{streetlightId}/dim:
+ parameters:
+ streetlightId:
+ $ref: '#/components/parameters/streetlightId'
+ publish:
+ operationId: dimLight
+ traits:
+ - $ref: '#/components/operationTraits/kafka'
+ message:
+ $ref: '#/components/messages/dimLight'
+
+ components:
+ messages:
+ lightMeasured:
+ name: lightMeasured
+ title: Light measured
+ summary: Inform about environmental lighting conditions for a particular streetlight.
+ contentType: application/json
+ traits:
+ - $ref: '#/components/messageTraits/commonHeaders'
+ payload:
+ $ref: "#/components/schemas/lightMeasuredPayload"
+ turnOnOff:
+ name: turnOnOff
+ title: Turn on/off
+ summary: Command a particular streetlight to turn the lights on or off.
+ traits:
+ - $ref: '#/components/messageTraits/commonHeaders'
+ payload:
+ $ref: "#/components/schemas/turnOnOffPayload"
+ dimLight:
+ name: dimLight
+ title: Dim light
+ summary: Command a particular streetlight to dim the lights.
+ traits:
+ - $ref: '#/components/messageTraits/commonHeaders'
+ payload:
+ $ref: "#/components/schemas/dimLightPayload"
+
+ schemas:
+ lightMeasuredPayload:
+ type: object
+ properties:
+ lumens:
+ type: integer
+ minimum: 0
+ description: Light intensity measured in lumens.
+ sentAt:
+ $ref: "#/components/schemas/sentAt"
+ turnOnOffPayload:
+ type: object
+ properties:
+ command:
+ type: string
+ enum:
+ - on
+ - off
+ description: Whether to turn on or off the light.
+ sentAt:
+ $ref: "#/components/schemas/sentAt"
+ dimLightPayload:
+ type: object
+ properties:
+ percentage:
+ type: integer
+ description: Percentage to which the light should be dimmed to.
+ minimum: 0
+ maximum: 100
+ sentAt:
+ $ref: "#/components/schemas/sentAt"
+ sentAt:
+ type: string
+ format: date-time
+ description: Date and time when the message was sent.
+
+ securitySchemes:
+ apiKey:
+ type: apiKey
+ in: user
+ description: Provide your API key as the user and leave the password empty.
+ supportedOauthFlows:
+ type: oauth2
+ description: Flows to support OAuth 2.0
+ flows:
+ implicit:
+ authorizationUrl: 'https://authserver.example/auth'
+ scopes:
+ 'streetlights:on': Ability to switch lights on
+ 'streetlights:off': Ability to switch lights off
+ 'streetlights:dim': Ability to dim the lights
+ password:
+ tokenUrl: 'https://authserver.example/token'
+ scopes:
+ 'streetlights:on': Ability to switch lights on
+ 'streetlights:off': Ability to switch lights off
+ 'streetlights:dim': Ability to dim the lights
+ clientCredentials:
+ tokenUrl: 'https://authserver.example/token'
+ scopes:
+ 'streetlights:on': Ability to switch lights on
+ 'streetlights:off': Ability to switch lights off
+ 'streetlights:dim': Ability to dim the lights
+ authorizationCode:
+ authorizationUrl: 'https://authserver.example/auth'
+ tokenUrl: 'https://authserver.example/token'
+ refreshUrl: 'https://authserver.example/refresh'
+ scopes:
+ 'streetlights:on': Ability to switch lights on
+ 'streetlights:off': Ability to switch lights off
+ 'streetlights:dim': Ability to dim the lights
+ openIdConnectWellKnown:
+ type: openIdConnect
+ openIdConnectUrl: 'https://authserver.example/.well-known'
+
+ parameters:
+ streetlightId:
+ description: The ID of the streetlight.
+ schema:
+ type: string
+
+ messageTraits:
+ commonHeaders:
+ headers:
+ type: object
+ properties:
+ my-app-header:
+ type: integer
+ minimum: 0
+ maximum: 100
+
+ operationTraits:
+ kafka:
+ bindings:
+ kafka:
+ clientId: my-app-id
diff --git a/packages/create-app/templates/default-app/examples/apis/swapi-graphql.yaml b/packages/create-app/templates/default-app/examples/apis/swapi-graphql.yaml
new file mode 100644
index 0000000000..ccddc537e7
--- /dev/null
+++ b/packages/create-app/templates/default-app/examples/apis/swapi-graphql.yaml
@@ -0,0 +1,1180 @@
+apiVersion: backstage.io/v1alpha1
+kind: API
+metadata:
+ name: starwars-graphql
+ description: SWAPI GraphQL Schema
+ links:
+ - url: https://github.com/graphql/swapi-graphql
+ title: GitHub Repo
+ icon: github
+spec:
+ type: graphql
+ lifecycle: production
+ owner: team-b
+ definition: |
+ schema {
+ query: Root
+ }
+
+ """A single film."""
+ type Film implements Node {
+ """The title of this film."""
+ title: String
+
+ """The episode number of this film."""
+ episodeID: Int
+
+ """The opening paragraphs at the beginning of this film."""
+ openingCrawl: String
+
+ """The name of the director of this film."""
+ director: String
+
+ """The name(s) of the producer(s) of this film."""
+ producers: [String]
+
+ """The ISO 8601 date format of film release at original creator country."""
+ releaseDate: String
+ speciesConnection(after: String, first: Int, before: String, last: Int): FilmSpeciesConnection
+ starshipConnection(after: String, first: Int, before: String, last: Int): FilmStarshipsConnection
+ vehicleConnection(after: String, first: Int, before: String, last: Int): FilmVehiclesConnection
+ characterConnection(after: String, first: Int, before: String, last: Int): FilmCharactersConnection
+ planetConnection(after: String, first: Int, before: String, last: Int): FilmPlanetsConnection
+
+ """The ISO 8601 date format of the time that this resource was created."""
+ created: String
+
+ """The ISO 8601 date format of the time that this resource was edited."""
+ edited: String
+
+ """The ID of an object"""
+ id: ID!
+ }
+
+ """A connection to a list of items."""
+ type FilmCharactersConnection {
+ """Information to aid in pagination."""
+ pageInfo: PageInfo!
+
+ """A list of edges."""
+ edges: [FilmCharactersEdge]
+
+ """
+ A count of the total number of objects in this connection, ignoring pagination.
+ This allows a client to fetch the first five objects by passing "5" as the
+ argument to "first", then fetch the total count so it could display "5 of 83",
+ for example.
+ """
+ totalCount: Int
+
+ """
+ A list of all of the objects returned in the connection. This is a convenience
+ field provided for quickly exploring the API; rather than querying for
+ "{ edges { node } }" when no edge data is needed, this field can be be used
+ instead. Note that when clients like Relay need to fetch the "cursor" field on
+ the edge to enable efficient pagination, this shortcut cannot be used, and the
+ full "{ edges { node } }" version should be used instead.
+ """
+ characters: [Person]
+ }
+
+ """An edge in a connection."""
+ type FilmCharactersEdge {
+ """The item at the end of the edge"""
+ node: Person
+
+ """A cursor for use in pagination"""
+ cursor: String!
+ }
+
+ """A connection to a list of items."""
+ type FilmPlanetsConnection {
+ """Information to aid in pagination."""
+ pageInfo: PageInfo!
+
+ """A list of edges."""
+ edges: [FilmPlanetsEdge]
+
+ """
+ A count of the total number of objects in this connection, ignoring pagination.
+ This allows a client to fetch the first five objects by passing "5" as the
+ argument to "first", then fetch the total count so it could display "5 of 83",
+ for example.
+ """
+ totalCount: Int
+
+ """
+ A list of all of the objects returned in the connection. This is a convenience
+ field provided for quickly exploring the API; rather than querying for
+ "{ edges { node } }" when no edge data is needed, this field can be be used
+ instead. Note that when clients like Relay need to fetch the "cursor" field on
+ the edge to enable efficient pagination, this shortcut cannot be used, and the
+ full "{ edges { node } }" version should be used instead.
+ """
+ planets: [Planet]
+ }
+
+ """An edge in a connection."""
+ type FilmPlanetsEdge {
+ """The item at the end of the edge"""
+ node: Planet
+
+ """A cursor for use in pagination"""
+ cursor: String!
+ }
+
+ """A connection to a list of items."""
+ type FilmsConnection {
+ """Information to aid in pagination."""
+ pageInfo: PageInfo!
+
+ """A list of edges."""
+ edges: [FilmsEdge]
+
+ """
+ A count of the total number of objects in this connection, ignoring pagination.
+ This allows a client to fetch the first five objects by passing "5" as the
+ argument to "first", then fetch the total count so it could display "5 of 83",
+ for example.
+ """
+ totalCount: Int
+
+ """
+ A list of all of the objects returned in the connection. This is a convenience
+ field provided for quickly exploring the API; rather than querying for
+ "{ edges { node } }" when no edge data is needed, this field can be be used
+ instead. Note that when clients like Relay need to fetch the "cursor" field on
+ the edge to enable efficient pagination, this shortcut cannot be used, and the
+ full "{ edges { node } }" version should be used instead.
+ """
+ films: [Film]
+ }
+
+ """An edge in a connection."""
+ type FilmsEdge {
+ """The item at the end of the edge"""
+ node: Film
+
+ """A cursor for use in pagination"""
+ cursor: String!
+ }
+
+ """A connection to a list of items."""
+ type FilmSpeciesConnection {
+ """Information to aid in pagination."""
+ pageInfo: PageInfo!
+
+ """A list of edges."""
+ edges: [FilmSpeciesEdge]
+
+ """
+ A count of the total number of objects in this connection, ignoring pagination.
+ This allows a client to fetch the first five objects by passing "5" as the
+ argument to "first", then fetch the total count so it could display "5 of 83",
+ for example.
+ """
+ totalCount: Int
+
+ """
+ A list of all of the objects returned in the connection. This is a convenience
+ field provided for quickly exploring the API; rather than querying for
+ "{ edges { node } }" when no edge data is needed, this field can be be used
+ instead. Note that when clients like Relay need to fetch the "cursor" field on
+ the edge to enable efficient pagination, this shortcut cannot be used, and the
+ full "{ edges { node } }" version should be used instead.
+ """
+ species: [Species]
+ }
+
+ """An edge in a connection."""
+ type FilmSpeciesEdge {
+ """The item at the end of the edge"""
+ node: Species
+
+ """A cursor for use in pagination"""
+ cursor: String!
+ }
+
+ """A connection to a list of items."""
+ type FilmStarshipsConnection {
+ """Information to aid in pagination."""
+ pageInfo: PageInfo!
+
+ """A list of edges."""
+ edges: [FilmStarshipsEdge]
+
+ """
+ A count of the total number of objects in this connection, ignoring pagination.
+ This allows a client to fetch the first five objects by passing "5" as the
+ argument to "first", then fetch the total count so it could display "5 of 83",
+ for example.
+ """
+ totalCount: Int
+
+ """
+ A list of all of the objects returned in the connection. This is a convenience
+ field provided for quickly exploring the API; rather than querying for
+ "{ edges { node } }" when no edge data is needed, this field can be be used
+ instead. Note that when clients like Relay need to fetch the "cursor" field on
+ the edge to enable efficient pagination, this shortcut cannot be used, and the
+ full "{ edges { node } }" version should be used instead.
+ """
+ starships: [Starship]
+ }
+
+ """An edge in a connection."""
+ type FilmStarshipsEdge {
+ """The item at the end of the edge"""
+ node: Starship
+
+ """A cursor for use in pagination"""
+ cursor: String!
+ }
+
+ """A connection to a list of items."""
+ type FilmVehiclesConnection {
+ """Information to aid in pagination."""
+ pageInfo: PageInfo!
+
+ """A list of edges."""
+ edges: [FilmVehiclesEdge]
+
+ """
+ A count of the total number of objects in this connection, ignoring pagination.
+ This allows a client to fetch the first five objects by passing "5" as the
+ argument to "first", then fetch the total count so it could display "5 of 83",
+ for example.
+ """
+ totalCount: Int
+
+ """
+ A list of all of the objects returned in the connection. This is a convenience
+ field provided for quickly exploring the API; rather than querying for
+ "{ edges { node } }" when no edge data is needed, this field can be be used
+ instead. Note that when clients like Relay need to fetch the "cursor" field on
+ the edge to enable efficient pagination, this shortcut cannot be used, and the
+ full "{ edges { node } }" version should be used instead.
+ """
+ vehicles: [Vehicle]
+ }
+
+ """An edge in a connection."""
+ type FilmVehiclesEdge {
+ """The item at the end of the edge"""
+ node: Vehicle
+
+ """A cursor for use in pagination"""
+ cursor: String!
+ }
+
+ """An object with an ID"""
+ interface Node {
+ """The id of the object."""
+ id: ID!
+ }
+
+ """Information about pagination in a connection."""
+ type PageInfo {
+ """When paginating forwards, are there more items?"""
+ hasNextPage: Boolean!
+
+ """When paginating backwards, are there more items?"""
+ hasPreviousPage: Boolean!
+
+ """When paginating backwards, the cursor to continue."""
+ startCursor: String
+
+ """When paginating forwards, the cursor to continue."""
+ endCursor: String
+ }
+
+ """A connection to a list of items."""
+ type PeopleConnection {
+ """Information to aid in pagination."""
+ pageInfo: PageInfo!
+
+ """A list of edges."""
+ edges: [PeopleEdge]
+
+ """
+ A count of the total number of objects in this connection, ignoring pagination.
+ This allows a client to fetch the first five objects by passing "5" as the
+ argument to "first", then fetch the total count so it could display "5 of 83",
+ for example.
+ """
+ totalCount: Int
+
+ """
+ A list of all of the objects returned in the connection. This is a convenience
+ field provided for quickly exploring the API; rather than querying for
+ "{ edges { node } }" when no edge data is needed, this field can be be used
+ instead. Note that when clients like Relay need to fetch the "cursor" field on
+ the edge to enable efficient pagination, this shortcut cannot be used, and the
+ full "{ edges { node } }" version should be used instead.
+ """
+ people: [Person]
+ }
+
+ """An edge in a connection."""
+ type PeopleEdge {
+ """The item at the end of the edge"""
+ node: Person
+
+ """A cursor for use in pagination"""
+ cursor: String!
+ }
+
+ """An individual person or character within the Star Wars universe."""
+ type Person implements Node {
+ """The name of this person."""
+ name: String
+
+ """
+ The birth year of the person, using the in-universe standard of BBY or ABY -
+ Before the Battle of Yavin or After the Battle of Yavin. The Battle of Yavin is
+ a battle that occurs at the end of Star Wars episode IV: A New Hope.
+ """
+ birthYear: String
+
+ """
+ The eye color of this person. Will be "unknown" if not known or "n/a" if the
+ person does not have an eye.
+ """
+ eyeColor: String
+
+ """
+ The gender of this person. Either "Male", "Female" or "unknown",
+ "n/a" if the person does not have a gender.
+ """
+ gender: String
+
+ """
+ The hair color of this person. Will be "unknown" if not known or "n/a" if the
+ person does not have hair.
+ """
+ hairColor: String
+
+ """The height of the person in centimeters."""
+ height: Int
+
+ """The mass of the person in kilograms."""
+ mass: Float
+
+ """The skin color of this person."""
+ skinColor: String
+
+ """A planet that this person was born on or inhabits."""
+ homeworld: Planet
+ filmConnection(after: String, first: Int, before: String, last: Int): PersonFilmsConnection
+
+ """The species that this person belongs to, or null if unknown."""
+ species: Species
+ starshipConnection(after: String, first: Int, before: String, last: Int): PersonStarshipsConnection
+ vehicleConnection(after: String, first: Int, before: String, last: Int): PersonVehiclesConnection
+
+ """The ISO 8601 date format of the time that this resource was created."""
+ created: String
+
+ """The ISO 8601 date format of the time that this resource was edited."""
+ edited: String
+
+ """The ID of an object"""
+ id: ID!
+ }
+
+ """A connection to a list of items."""
+ type PersonFilmsConnection {
+ """Information to aid in pagination."""
+ pageInfo: PageInfo!
+
+ """A list of edges."""
+ edges: [PersonFilmsEdge]
+
+ """
+ A count of the total number of objects in this connection, ignoring pagination.
+ This allows a client to fetch the first five objects by passing "5" as the
+ argument to "first", then fetch the total count so it could display "5 of 83",
+ for example.
+ """
+ totalCount: Int
+
+ """
+ A list of all of the objects returned in the connection. This is a convenience
+ field provided for quickly exploring the API; rather than querying for
+ "{ edges { node } }" when no edge data is needed, this field can be be used
+ instead. Note that when clients like Relay need to fetch the "cursor" field on
+ the edge to enable efficient pagination, this shortcut cannot be used, and the
+ full "{ edges { node } }" version should be used instead.
+ """
+ films: [Film]
+ }
+
+ """An edge in a connection."""
+ type PersonFilmsEdge {
+ """The item at the end of the edge"""
+ node: Film
+
+ """A cursor for use in pagination"""
+ cursor: String!
+ }
+
+ """A connection to a list of items."""
+ type PersonStarshipsConnection {
+ """Information to aid in pagination."""
+ pageInfo: PageInfo!
+
+ """A list of edges."""
+ edges: [PersonStarshipsEdge]
+
+ """
+ A count of the total number of objects in this connection, ignoring pagination.
+ This allows a client to fetch the first five objects by passing "5" as the
+ argument to "first", then fetch the total count so it could display "5 of 83",
+ for example.
+ """
+ totalCount: Int
+
+ """
+ A list of all of the objects returned in the connection. This is a convenience
+ field provided for quickly exploring the API; rather than querying for
+ "{ edges { node } }" when no edge data is needed, this field can be be used
+ instead. Note that when clients like Relay need to fetch the "cursor" field on
+ the edge to enable efficient pagination, this shortcut cannot be used, and the
+ full "{ edges { node } }" version should be used instead.
+ """
+ starships: [Starship]
+ }
+
+ """An edge in a connection."""
+ type PersonStarshipsEdge {
+ """The item at the end of the edge"""
+ node: Starship
+
+ """A cursor for use in pagination"""
+ cursor: String!
+ }
+
+ """A connection to a list of items."""
+ type PersonVehiclesConnection {
+ """Information to aid in pagination."""
+ pageInfo: PageInfo!
+
+ """A list of edges."""
+ edges: [PersonVehiclesEdge]
+
+ """
+ A count of the total number of objects in this connection, ignoring pagination.
+ This allows a client to fetch the first five objects by passing "5" as the
+ argument to "first", then fetch the total count so it could display "5 of 83",
+ for example.
+ """
+ totalCount: Int
+
+ """
+ A list of all of the objects returned in the connection. This is a convenience
+ field provided for quickly exploring the API; rather than querying for
+ "{ edges { node } }" when no edge data is needed, this field can be be used
+ instead. Note that when clients like Relay need to fetch the "cursor" field on
+ the edge to enable efficient pagination, this shortcut cannot be used, and the
+ full "{ edges { node } }" version should be used instead.
+ """
+ vehicles: [Vehicle]
+ }
+
+ """An edge in a connection."""
+ type PersonVehiclesEdge {
+ """The item at the end of the edge"""
+ node: Vehicle
+
+ """A cursor for use in pagination"""
+ cursor: String!
+ }
+
+ """
+ A large mass, planet or planetoid in the Star Wars Universe, at the time of
+ 0 ABY.
+ """
+ type Planet implements Node {
+ """The name of this planet."""
+ name: String
+
+ """The diameter of this planet in kilometers."""
+ diameter: Int
+
+ """
+ The number of standard hours it takes for this planet to complete a single
+ rotation on its axis.
+ """
+ rotationPeriod: Int
+
+ """
+ The number of standard days it takes for this planet to complete a single orbit
+ of its local star.
+ """
+ orbitalPeriod: Int
+
+ """
+ A number denoting the gravity of this planet, where "1" is normal or 1 standard
+ G. "2" is twice or 2 standard Gs. "0.5" is half or 0.5 standard Gs.
+ """
+ gravity: String
+
+ """The average population of sentient beings inhabiting this planet."""
+ population: Float
+
+ """The climates of this planet."""
+ climates: [String]
+
+ """The terrains of this planet."""
+ terrains: [String]
+
+ """
+ The percentage of the planet surface that is naturally occurring water or bodies
+ of water.
+ """
+ surfaceWater: Float
+ residentConnection(after: String, first: Int, before: String, last: Int): PlanetResidentsConnection
+ filmConnection(after: String, first: Int, before: String, last: Int): PlanetFilmsConnection
+
+ """The ISO 8601 date format of the time that this resource was created."""
+ created: String
+
+ """The ISO 8601 date format of the time that this resource was edited."""
+ edited: String
+
+ """The ID of an object"""
+ id: ID!
+ }
+
+ """A connection to a list of items."""
+ type PlanetFilmsConnection {
+ """Information to aid in pagination."""
+ pageInfo: PageInfo!
+
+ """A list of edges."""
+ edges: [PlanetFilmsEdge]
+
+ """
+ A count of the total number of objects in this connection, ignoring pagination.
+ This allows a client to fetch the first five objects by passing "5" as the
+ argument to "first", then fetch the total count so it could display "5 of 83",
+ for example.
+ """
+ totalCount: Int
+
+ """
+ A list of all of the objects returned in the connection. This is a convenience
+ field provided for quickly exploring the API; rather than querying for
+ "{ edges { node } }" when no edge data is needed, this field can be be used
+ instead. Note that when clients like Relay need to fetch the "cursor" field on
+ the edge to enable efficient pagination, this shortcut cannot be used, and the
+ full "{ edges { node } }" version should be used instead.
+ """
+ films: [Film]
+ }
+
+ """An edge in a connection."""
+ type PlanetFilmsEdge {
+ """The item at the end of the edge"""
+ node: Film
+
+ """A cursor for use in pagination"""
+ cursor: String!
+ }
+
+ """A connection to a list of items."""
+ type PlanetResidentsConnection {
+ """Information to aid in pagination."""
+ pageInfo: PageInfo!
+
+ """A list of edges."""
+ edges: [PlanetResidentsEdge]
+
+ """
+ A count of the total number of objects in this connection, ignoring pagination.
+ This allows a client to fetch the first five objects by passing "5" as the
+ argument to "first", then fetch the total count so it could display "5 of 83",
+ for example.
+ """
+ totalCount: Int
+
+ """
+ A list of all of the objects returned in the connection. This is a convenience
+ field provided for quickly exploring the API; rather than querying for
+ "{ edges { node } }" when no edge data is needed, this field can be be used
+ instead. Note that when clients like Relay need to fetch the "cursor" field on
+ the edge to enable efficient pagination, this shortcut cannot be used, and the
+ full "{ edges { node } }" version should be used instead.
+ """
+ residents: [Person]
+ }
+
+ """An edge in a connection."""
+ type PlanetResidentsEdge {
+ """The item at the end of the edge"""
+ node: Person
+
+ """A cursor for use in pagination"""
+ cursor: String!
+ }
+
+ """A connection to a list of items."""
+ type PlanetsConnection {
+ """Information to aid in pagination."""
+ pageInfo: PageInfo!
+
+ """A list of edges."""
+ edges: [PlanetsEdge]
+
+ """
+ A count of the total number of objects in this connection, ignoring pagination.
+ This allows a client to fetch the first five objects by passing "5" as the
+ argument to "first", then fetch the total count so it could display "5 of 83",
+ for example.
+ """
+ totalCount: Int
+
+ """
+ A list of all of the objects returned in the connection. This is a convenience
+ field provided for quickly exploring the API; rather than querying for
+ "{ edges { node } }" when no edge data is needed, this field can be be used
+ instead. Note that when clients like Relay need to fetch the "cursor" field on
+ the edge to enable efficient pagination, this shortcut cannot be used, and the
+ full "{ edges { node } }" version should be used instead.
+ """
+ planets: [Planet]
+ }
+
+ """An edge in a connection."""
+ type PlanetsEdge {
+ """The item at the end of the edge"""
+ node: Planet
+
+ """A cursor for use in pagination"""
+ cursor: String!
+ }
+
+ type Root {
+ allFilms(after: String, first: Int, before: String, last: Int): FilmsConnection
+ film(id: ID, filmID: ID): Film
+ allPeople(after: String, first: Int, before: String, last: Int): PeopleConnection
+ person(id: ID, personID: ID): Person
+ allPlanets(after: String, first: Int, before: String, last: Int): PlanetsConnection
+ planet(id: ID, planetID: ID): Planet
+ allSpecies(after: String, first: Int, before: String, last: Int): SpeciesConnection
+ species(id: ID, speciesID: ID): Species
+ allStarships(after: String, first: Int, before: String, last: Int): StarshipsConnection
+ starship(id: ID, starshipID: ID): Starship
+ allVehicles(after: String, first: Int, before: String, last: Int): VehiclesConnection
+ vehicle(id: ID, vehicleID: ID): Vehicle
+
+ """Fetches an object given its ID"""
+ node(
+ """The ID of an object"""
+ id: ID!
+ ): Node
+ }
+
+ """A type of person or character within the Star Wars Universe."""
+ type Species implements Node {
+ """The name of this species."""
+ name: String
+
+ """The classification of this species, such as "mammal" or "reptile"."""
+ classification: String
+
+ """The designation of this species, such as "sentient"."""
+ designation: String
+
+ """The average height of this species in centimeters."""
+ averageHeight: Float
+
+ """The average lifespan of this species in years, null if unknown."""
+ averageLifespan: Int
+
+ """
+ Common eye colors for this species, null if this species does not typically
+ have eyes.
+ """
+ eyeColors: [String]
+
+ """
+ Common hair colors for this species, null if this species does not typically
+ have hair.
+ """
+ hairColors: [String]
+
+ """
+ Common skin colors for this species, null if this species does not typically
+ have skin.
+ """
+ skinColors: [String]
+
+ """The language commonly spoken by this species."""
+ language: String
+
+ """A planet that this species originates from."""
+ homeworld: Planet
+ personConnection(after: String, first: Int, before: String, last: Int): SpeciesPeopleConnection
+ filmConnection(after: String, first: Int, before: String, last: Int): SpeciesFilmsConnection
+
+ """The ISO 8601 date format of the time that this resource was created."""
+ created: String
+
+ """The ISO 8601 date format of the time that this resource was edited."""
+ edited: String
+
+ """The ID of an object"""
+ id: ID!
+ }
+
+ """A connection to a list of items."""
+ type SpeciesConnection {
+ """Information to aid in pagination."""
+ pageInfo: PageInfo!
+
+ """A list of edges."""
+ edges: [SpeciesEdge]
+
+ """
+ A count of the total number of objects in this connection, ignoring pagination.
+ This allows a client to fetch the first five objects by passing "5" as the
+ argument to "first", then fetch the total count so it could display "5 of 83",
+ for example.
+ """
+ totalCount: Int
+
+ """
+ A list of all of the objects returned in the connection. This is a convenience
+ field provided for quickly exploring the API; rather than querying for
+ "{ edges { node } }" when no edge data is needed, this field can be be used
+ instead. Note that when clients like Relay need to fetch the "cursor" field on
+ the edge to enable efficient pagination, this shortcut cannot be used, and the
+ full "{ edges { node } }" version should be used instead.
+ """
+ species: [Species]
+ }
+
+ """An edge in a connection."""
+ type SpeciesEdge {
+ """The item at the end of the edge"""
+ node: Species
+
+ """A cursor for use in pagination"""
+ cursor: String!
+ }
+
+ """A connection to a list of items."""
+ type SpeciesFilmsConnection {
+ """Information to aid in pagination."""
+ pageInfo: PageInfo!
+
+ """A list of edges."""
+ edges: [SpeciesFilmsEdge]
+
+ """
+ A count of the total number of objects in this connection, ignoring pagination.
+ This allows a client to fetch the first five objects by passing "5" as the
+ argument to "first", then fetch the total count so it could display "5 of 83",
+ for example.
+ """
+ totalCount: Int
+
+ """
+ A list of all of the objects returned in the connection. This is a convenience
+ field provided for quickly exploring the API; rather than querying for
+ "{ edges { node } }" when no edge data is needed, this field can be be used
+ instead. Note that when clients like Relay need to fetch the "cursor" field on
+ the edge to enable efficient pagination, this shortcut cannot be used, and the
+ full "{ edges { node } }" version should be used instead.
+ """
+ films: [Film]
+ }
+
+ """An edge in a connection."""
+ type SpeciesFilmsEdge {
+ """The item at the end of the edge"""
+ node: Film
+
+ """A cursor for use in pagination"""
+ cursor: String!
+ }
+
+ """A connection to a list of items."""
+ type SpeciesPeopleConnection {
+ """Information to aid in pagination."""
+ pageInfo: PageInfo!
+
+ """A list of edges."""
+ edges: [SpeciesPeopleEdge]
+
+ """
+ A count of the total number of objects in this connection, ignoring pagination.
+ This allows a client to fetch the first five objects by passing "5" as the
+ argument to "first", then fetch the total count so it could display "5 of 83",
+ for example.
+ """
+ totalCount: Int
+
+ """
+ A list of all of the objects returned in the connection. This is a convenience
+ field provided for quickly exploring the API; rather than querying for
+ "{ edges { node } }" when no edge data is needed, this field can be be used
+ instead. Note that when clients like Relay need to fetch the "cursor" field on
+ the edge to enable efficient pagination, this shortcut cannot be used, and the
+ full "{ edges { node } }" version should be used instead.
+ """
+ people: [Person]
+ }
+
+ """An edge in a connection."""
+ type SpeciesPeopleEdge {
+ """The item at the end of the edge"""
+ node: Person
+
+ """A cursor for use in pagination"""
+ cursor: String!
+ }
+
+ """A single transport craft that has hyperdrive capability."""
+ type Starship implements Node {
+ """The name of this starship. The common name, such as "Death Star"."""
+ name: String
+
+ """
+ The model or official name of this starship. Such as "T-65 X-wing" or "DS-1
+ Orbital Battle Station".
+ """
+ model: String
+
+ """
+ The class of this starship, such as "Starfighter" or "Deep Space Mobile
+ Battlestation"
+ """
+ starshipClass: String
+
+ """The manufacturers of this starship."""
+ manufacturers: [String]
+
+ """The cost of this starship new, in galactic credits."""
+ costInCredits: Float
+
+ """The length of this starship in meters."""
+ length: Float
+
+ """The number of personnel needed to run or pilot this starship."""
+ crew: String
+
+ """The number of non-essential people this starship can transport."""
+ passengers: String
+
+ """
+ The maximum speed of this starship in atmosphere. null if this starship is
+ incapable of atmosphering flight.
+ """
+ maxAtmospheringSpeed: Int
+
+ """The class of this starships hyperdrive."""
+ hyperdriveRating: Float
+
+ """
+ The Maximum number of Megalights this starship can travel in a standard hour.
+ A "Megalight" is a standard unit of distance and has never been defined before
+ within the Star Wars universe. This figure is only really useful for measuring
+ the difference in speed of starships. We can assume it is similar to AU, the
+ distance between our Sun (Sol) and Earth.
+ """
+ MGLT: Int
+
+ """The maximum number of kilograms that this starship can transport."""
+ cargoCapacity: Float
+
+ """
+ The maximum length of time that this starship can provide consumables for its
+ entire crew without having to resupply.
+ """
+ consumables: String
+ pilotConnection(after: String, first: Int, before: String, last: Int): StarshipPilotsConnection
+ filmConnection(after: String, first: Int, before: String, last: Int): StarshipFilmsConnection
+
+ """The ISO 8601 date format of the time that this resource was created."""
+ created: String
+
+ """The ISO 8601 date format of the time that this resource was edited."""
+ edited: String
+
+ """The ID of an object"""
+ id: ID!
+ }
+
+ """A connection to a list of items."""
+ type StarshipFilmsConnection {
+ """Information to aid in pagination."""
+ pageInfo: PageInfo!
+
+ """A list of edges."""
+ edges: [StarshipFilmsEdge]
+
+ """
+ A count of the total number of objects in this connection, ignoring pagination.
+ This allows a client to fetch the first five objects by passing "5" as the
+ argument to "first", then fetch the total count so it could display "5 of 83",
+ for example.
+ """
+ totalCount: Int
+
+ """
+ A list of all of the objects returned in the connection. This is a convenience
+ field provided for quickly exploring the API; rather than querying for
+ "{ edges { node } }" when no edge data is needed, this field can be be used
+ instead. Note that when clients like Relay need to fetch the "cursor" field on
+ the edge to enable efficient pagination, this shortcut cannot be used, and the
+ full "{ edges { node } }" version should be used instead.
+ """
+ films: [Film]
+ }
+
+ """An edge in a connection."""
+ type StarshipFilmsEdge {
+ """The item at the end of the edge"""
+ node: Film
+
+ """A cursor for use in pagination"""
+ cursor: String!
+ }
+
+ """A connection to a list of items."""
+ type StarshipPilotsConnection {
+ """Information to aid in pagination."""
+ pageInfo: PageInfo!
+
+ """A list of edges."""
+ edges: [StarshipPilotsEdge]
+
+ """
+ A count of the total number of objects in this connection, ignoring pagination.
+ This allows a client to fetch the first five objects by passing "5" as the
+ argument to "first", then fetch the total count so it could display "5 of 83",
+ for example.
+ """
+ totalCount: Int
+
+ """
+ A list of all of the objects returned in the connection. This is a convenience
+ field provided for quickly exploring the API; rather than querying for
+ "{ edges { node } }" when no edge data is needed, this field can be be used
+ instead. Note that when clients like Relay need to fetch the "cursor" field on
+ the edge to enable efficient pagination, this shortcut cannot be used, and the
+ full "{ edges { node } }" version should be used instead.
+ """
+ pilots: [Person]
+ }
+
+ """An edge in a connection."""
+ type StarshipPilotsEdge {
+ """The item at the end of the edge"""
+ node: Person
+
+ """A cursor for use in pagination"""
+ cursor: String!
+ }
+
+ """A connection to a list of items."""
+ type StarshipsConnection {
+ """Information to aid in pagination."""
+ pageInfo: PageInfo!
+
+ """A list of edges."""
+ edges: [StarshipsEdge]
+
+ """
+ A count of the total number of objects in this connection, ignoring pagination.
+ This allows a client to fetch the first five objects by passing "5" as the
+ argument to "first", then fetch the total count so it could display "5 of 83",
+ for example.
+ """
+ totalCount: Int
+
+ """
+ A list of all of the objects returned in the connection. This is a convenience
+ field provided for quickly exploring the API; rather than querying for
+ "{ edges { node } }" when no edge data is needed, this field can be be used
+ instead. Note that when clients like Relay need to fetch the "cursor" field on
+ the edge to enable efficient pagination, this shortcut cannot be used, and the
+ full "{ edges { node } }" version should be used instead.
+ """
+ starships: [Starship]
+ }
+
+ """An edge in a connection."""
+ type StarshipsEdge {
+ """The item at the end of the edge"""
+ node: Starship
+
+ """A cursor for use in pagination"""
+ cursor: String!
+ }
+
+ """A single transport craft that does not have hyperdrive capability"""
+ type Vehicle implements Node {
+ """
+ The name of this vehicle. The common name, such as "Sand Crawler" or "Speeder
+ bike".
+ """
+ name: String
+
+ """
+ The model or official name of this vehicle. Such as "All-Terrain Attack
+ Transport".
+ """
+ model: String
+
+ """The class of this vehicle, such as "Wheeled" or "Repulsorcraft"."""
+ vehicleClass: String
+
+ """The manufacturers of this vehicle."""
+ manufacturers: [String]
+
+ """The cost of this vehicle new, in Galactic Credits."""
+ costInCredits: Float
+
+ """The length of this vehicle in meters."""
+ length: Float
+
+ """The number of personnel needed to run or pilot this vehicle."""
+ crew: String
+
+ """The number of non-essential people this vehicle can transport."""
+ passengers: String
+
+ """The maximum speed of this vehicle in atmosphere."""
+ maxAtmospheringSpeed: Int
+
+ """The maximum number of kilograms that this vehicle can transport."""
+ cargoCapacity: Float
+
+ """
+ The maximum length of time that this vehicle can provide consumables for its
+ entire crew without having to resupply.
+ """
+ consumables: String
+ pilotConnection(after: String, first: Int, before: String, last: Int): VehiclePilotsConnection
+ filmConnection(after: String, first: Int, before: String, last: Int): VehicleFilmsConnection
+
+ """The ISO 8601 date format of the time that this resource was created."""
+ created: String
+
+ """The ISO 8601 date format of the time that this resource was edited."""
+ edited: String
+
+ """The ID of an object"""
+ id: ID!
+ }
+
+ """A connection to a list of items."""
+ type VehicleFilmsConnection {
+ """Information to aid in pagination."""
+ pageInfo: PageInfo!
+
+ """A list of edges."""
+ edges: [VehicleFilmsEdge]
+
+ """
+ A count of the total number of objects in this connection, ignoring pagination.
+ This allows a client to fetch the first five objects by passing "5" as the
+ argument to "first", then fetch the total count so it could display "5 of 83",
+ for example.
+ """
+ totalCount: Int
+
+ """
+ A list of all of the objects returned in the connection. This is a convenience
+ field provided for quickly exploring the API; rather than querying for
+ "{ edges { node } }" when no edge data is needed, this field can be be used
+ instead. Note that when clients like Relay need to fetch the "cursor" field on
+ the edge to enable efficient pagination, this shortcut cannot be used, and the
+ full "{ edges { node } }" version should be used instead.
+ """
+ films: [Film]
+ }
+
+ """An edge in a connection."""
+ type VehicleFilmsEdge {
+ """The item at the end of the edge"""
+ node: Film
+
+ """A cursor for use in pagination"""
+ cursor: String!
+ }
+
+ """A connection to a list of items."""
+ type VehiclePilotsConnection {
+ """Information to aid in pagination."""
+ pageInfo: PageInfo!
+
+ """A list of edges."""
+ edges: [VehiclePilotsEdge]
+
+ """
+ A count of the total number of objects in this connection, ignoring pagination.
+ This allows a client to fetch the first five objects by passing "5" as the
+ argument to "first", then fetch the total count so it could display "5 of 83",
+ for example.
+ """
+ totalCount: Int
+
+ """
+ A list of all of the objects returned in the connection. This is a convenience
+ field provided for quickly exploring the API; rather than querying for
+ "{ edges { node } }" when no edge data is needed, this field can be be used
+ instead. Note that when clients like Relay need to fetch the "cursor" field on
+ the edge to enable efficient pagination, this shortcut cannot be used, and the
+ full "{ edges { node } }" version should be used instead.
+ """
+ pilots: [Person]
+ }
+
+ """An edge in a connection."""
+ type VehiclePilotsEdge {
+ """The item at the end of the edge"""
+ node: Person
+
+ """A cursor for use in pagination"""
+ cursor: String!
+ }
+
+ """A connection to a list of items."""
+ type VehiclesConnection {
+ """Information to aid in pagination."""
+ pageInfo: PageInfo!
+
+ """A list of edges."""
+ edges: [VehiclesEdge]
+
+ """
+ A count of the total number of objects in this connection, ignoring pagination.
+ This allows a client to fetch the first five objects by passing "5" as the
+ argument to "first", then fetch the total count so it could display "5 of 83",
+ for example.
+ """
+ totalCount: Int
+
+ """
+ A list of all of the objects returned in the connection. This is a convenience
+ field provided for quickly exploring the API; rather than querying for
+ "{ edges { node } }" when no edge data is needed, this field can be be used
+ instead. Note that when clients like Relay need to fetch the "cursor" field on
+ the edge to enable efficient pagination, this shortcut cannot be used, and the
+ full "{ edges { node } }" version should be used instead.
+ """
+ vehicles: [Vehicle]
+ }
+
+ """An edge in a connection."""
+ type VehiclesEdge {
+ """The item at the end of the edge"""
+ node: Vehicle
+
+ """A cursor for use in pagination"""
+ cursor: String!
+ }
diff --git a/packages/create-app/templates/default-app/examples/apis/wayback-archive-api.yaml b/packages/create-app/templates/default-app/examples/apis/wayback-archive-api.yaml
new file mode 100644
index 0000000000..8c2a9c7d6e
--- /dev/null
+++ b/packages/create-app/templates/default-app/examples/apis/wayback-archive-api.yaml
@@ -0,0 +1,11 @@
+apiVersion: backstage.io/v1alpha1
+kind: API
+metadata:
+ name: wayback-archive
+ description: Archive API for the wayback machine
+spec:
+ type: openapi
+ lifecycle: production
+ owner: team-a
+ definition:
+ $text: https://github.com/APIs-guru/openapi-directory/blob/main/APIs/archive.org/wayback/1.0.0/openapi.yaml
diff --git a/packages/create-app/templates/default-app/examples/apis/wayback-search-api.yaml b/packages/create-app/templates/default-app/examples/apis/wayback-search-api.yaml
new file mode 100644
index 0000000000..45fa5d1b19
--- /dev/null
+++ b/packages/create-app/templates/default-app/examples/apis/wayback-search-api.yaml
@@ -0,0 +1,11 @@
+apiVersion: backstage.io/v1alpha1
+kind: API
+metadata:
+ name: wayback-search
+ description: Search API for the wayback machine
+spec:
+ type: openapi
+ lifecycle: production
+ owner: team-a
+ definition:
+ $text: https://github.com/APIs-guru/openapi-directory/blob/main/APIs/archive.org/search/1.0.0/openapi.yaml
diff --git a/packages/create-app/templates/default-app/examples/components/artist-lookup-component.yaml b/packages/create-app/templates/default-app/examples/components/artist-lookup-component.yaml
new file mode 100644
index 0000000000..c0022762b4
--- /dev/null
+++ b/packages/create-app/templates/default-app/examples/components/artist-lookup-component.yaml
@@ -0,0 +1,37 @@
+apiVersion: backstage.io/v1alpha1
+kind: Component
+metadata:
+ name: artist-lookup
+ description: Artist Lookup
+ tags:
+ - java
+ - data
+ links:
+ - url: https://example.com/user
+ title: Examples Users
+ icon: user
+ - url: https://example.com/group
+ title: Example Group
+ icon: group
+ - url: https://example.com/cloud
+ title: Link with Cloud Icon
+ icon: cloud
+ - url: https://example.com/dashboard
+ title: Dashboard
+ icon: dashboard
+ - url: https://example.com/help
+ title: Support
+ icon: help
+ - url: https://example.com/web
+ title: Website
+ icon: web
+ - url: https://example.com/alert
+ title: Alerts
+ icon: alert
+spec:
+ type: service
+ lifecycle: experimental
+ owner: team-a
+ system: artist-engagement-portal
+ dependsOn: ['resource:artists-db']
+ apiConsumedBy: ['component:www-artist']
diff --git a/packages/create-app/templates/default-app/examples/components/petstore-component.yaml b/packages/create-app/templates/default-app/examples/components/petstore-component.yaml
new file mode 100644
index 0000000000..878fabd551
--- /dev/null
+++ b/packages/create-app/templates/default-app/examples/components/petstore-component.yaml
@@ -0,0 +1,18 @@
+apiVersion: backstage.io/v1alpha1
+kind: Component
+metadata:
+ name: petstore
+ # This is an extra long description
+ description: The Petstore is an example API used to show features of the OpenAPI spec.
+ links:
+ - url: https://github.com/swagger-api/swagger-petstore
+ title: GitHub Repo
+ icon: github
+spec:
+ type: service
+ lifecycle: experimental
+ owner: team-c
+ providesApis:
+ - petstore
+ - streetlights
+ - hello-world
diff --git a/packages/create-app/templates/default-app/examples/components/playback-lib-component.yaml b/packages/create-app/templates/default-app/examples/components/playback-lib-component.yaml
new file mode 100644
index 0000000000..de7e93d38d
--- /dev/null
+++ b/packages/create-app/templates/default-app/examples/components/playback-lib-component.yaml
@@ -0,0 +1,10 @@
+apiVersion: backstage.io/v1alpha1
+kind: Component
+metadata:
+ name: playback-sdk
+ description: Audio and video playback SDK
+spec:
+ type: library
+ lifecycle: experimental
+ owner: team-c
+ system: audio-playback
diff --git a/packages/create-app/templates/default-app/examples/components/playback-order-component.yaml b/packages/create-app/templates/default-app/examples/components/playback-order-component.yaml
new file mode 100644
index 0000000000..9146063886
--- /dev/null
+++ b/packages/create-app/templates/default-app/examples/components/playback-order-component.yaml
@@ -0,0 +1,13 @@
+apiVersion: backstage.io/v1alpha1
+kind: Component
+metadata:
+ name: playback-order
+ description: Playback Order
+ tags:
+ - java
+ - playback
+spec:
+ type: service
+ lifecycle: production
+ owner: user:guest
+ system: audio-playback
diff --git a/packages/create-app/templates/default-app/examples/components/podcast-api-component.yaml b/packages/create-app/templates/default-app/examples/components/podcast-api-component.yaml
new file mode 100644
index 0000000000..30d254a00f
--- /dev/null
+++ b/packages/create-app/templates/default-app/examples/components/podcast-api-component.yaml
@@ -0,0 +1,12 @@
+apiVersion: backstage.io/v1alpha1
+kind: Component
+metadata:
+ name: podcast-api
+ description: Podcast API
+ tags:
+ - java
+spec:
+ type: service
+ lifecycle: experimental
+ owner: team-b
+ system: podcast
diff --git a/packages/create-app/templates/default-app/examples/components/queue-proxy-component.yaml b/packages/create-app/templates/default-app/examples/components/queue-proxy-component.yaml
new file mode 100644
index 0000000000..a2d5ae5ea4
--- /dev/null
+++ b/packages/create-app/templates/default-app/examples/components/queue-proxy-component.yaml
@@ -0,0 +1,13 @@
+apiVersion: backstage.io/v1alpha1
+kind: Component
+metadata:
+ name: queue-proxy
+ description: Queue Proxy
+ tags:
+ - go
+ - website
+spec:
+ type: website
+ lifecycle: production
+ owner: team-b
+ system: podcast
diff --git a/packages/create-app/templates/default-app/examples/components/searcher-component.yaml b/packages/create-app/templates/default-app/examples/components/searcher-component.yaml
new file mode 100644
index 0000000000..77150c96f0
--- /dev/null
+++ b/packages/create-app/templates/default-app/examples/components/searcher-component.yaml
@@ -0,0 +1,11 @@
+apiVersion: backstage.io/v1alpha1
+kind: Component
+metadata:
+ name: searcher
+ description: Searcher
+ tags:
+ - go
+spec:
+ type: service
+ lifecycle: production
+ owner: user:guest
diff --git a/packages/create-app/templates/default-app/examples/components/shuffle-api-component.yaml b/packages/create-app/templates/default-app/examples/components/shuffle-api-component.yaml
new file mode 100644
index 0000000000..6328ebdf3b
--- /dev/null
+++ b/packages/create-app/templates/default-app/examples/components/shuffle-api-component.yaml
@@ -0,0 +1,12 @@
+apiVersion: backstage.io/v1alpha1
+kind: Component
+metadata:
+ name: shuffle-api
+ description: Shuffle API
+ tags:
+ - go
+spec:
+ type: service
+ lifecycle: production
+ owner: user:guest
+ system: audio-playback
diff --git a/packages/create-app/templates/default-app/examples/components/wayback-archive-component.yaml b/packages/create-app/templates/default-app/examples/components/wayback-archive-component.yaml
new file mode 100644
index 0000000000..5d558db64a
--- /dev/null
+++ b/packages/create-app/templates/default-app/examples/components/wayback-archive-component.yaml
@@ -0,0 +1,11 @@
+apiVersion: backstage.io/v1alpha1
+kind: Component
+metadata:
+ name: wayback-archive
+ description: Archive of the wayback machine
+spec:
+ type: service
+ lifecycle: production
+ owner: team-a
+ providesApis:
+ - wayback-archive
diff --git a/packages/create-app/templates/default-app/examples/components/wayback-archive-ingestion-component.yaml b/packages/create-app/templates/default-app/examples/components/wayback-archive-ingestion-component.yaml
new file mode 100644
index 0000000000..4f870ac831
--- /dev/null
+++ b/packages/create-app/templates/default-app/examples/components/wayback-archive-ingestion-component.yaml
@@ -0,0 +1,10 @@
+apiVersion: backstage.io/v1alpha1
+kind: Component
+metadata:
+ name: wayback-archive-ingestion
+ description: Ingestion subsystem of the Wayback Archive
+spec:
+ type: service
+ lifecycle: production
+ owner: team-d
+ subcomponentOf: wayback-archive
diff --git a/packages/create-app/templates/default-app/examples/components/wayback-archive-storage-component.yaml b/packages/create-app/templates/default-app/examples/components/wayback-archive-storage-component.yaml
new file mode 100644
index 0000000000..78d67258d7
--- /dev/null
+++ b/packages/create-app/templates/default-app/examples/components/wayback-archive-storage-component.yaml
@@ -0,0 +1,10 @@
+apiVersion: backstage.io/v1alpha1
+kind: Component
+metadata:
+ name: wayback-archive-storage
+ description: Storage subsystem of the Wayback Archive
+spec:
+ type: service
+ lifecycle: production
+ owner: team-a
+ subcomponentOf: wayback-archive
diff --git a/packages/create-app/templates/default-app/examples/components/wayback-search-component.yaml b/packages/create-app/templates/default-app/examples/components/wayback-search-component.yaml
new file mode 100644
index 0000000000..0187e4441f
--- /dev/null
+++ b/packages/create-app/templates/default-app/examples/components/wayback-search-component.yaml
@@ -0,0 +1,13 @@
+apiVersion: backstage.io/v1alpha1
+kind: Component
+metadata:
+ name: wayback-search
+ description: Search of the wayback machine
+spec:
+ type: service
+ lifecycle: production
+ owner: team-a
+ providesApis:
+ - wayback-search
+ consumesApis:
+ - wayback-archive
diff --git a/packages/create-app/templates/default-app/examples/components/www-artist-component.yaml b/packages/create-app/templates/default-app/examples/components/www-artist-component.yaml
new file mode 100644
index 0000000000..1ca394ecbc
--- /dev/null
+++ b/packages/create-app/templates/default-app/examples/components/www-artist-component.yaml
@@ -0,0 +1,11 @@
+apiVersion: backstage.io/v1alpha1
+kind: Component
+metadata:
+ name: www-artist
+ description: Artist main website
+spec:
+ type: website
+ lifecycle: production
+ owner: team-a
+ system: artist-engagement-portal
+ consumesApis: ['component:artist-lookup']
diff --git a/packages/create-app/templates/default-app/examples/domains/artists-domain.yaml b/packages/create-app/templates/default-app/examples/domains/artists-domain.yaml
new file mode 100644
index 0000000000..2a74425791
--- /dev/null
+++ b/packages/create-app/templates/default-app/examples/domains/artists-domain.yaml
@@ -0,0 +1,13 @@
+apiVersion: backstage.io/v1alpha1
+kind: Domain
+metadata:
+ name: artists
+ description: Everything related to artists
+ links:
+ - url: http://example.com/domain/artists/
+ title: Domain Readme
+ - url: http://example.com/domains/artists/dashboard
+ title: Domain Metrics Dashboard
+ icon: dashboard
+spec:
+ owner: team-a
diff --git a/packages/create-app/templates/default-app/examples/domains/playback-domain.yaml b/packages/create-app/templates/default-app/examples/domains/playback-domain.yaml
new file mode 100644
index 0000000000..c9933ebf5e
--- /dev/null
+++ b/packages/create-app/templates/default-app/examples/domains/playback-domain.yaml
@@ -0,0 +1,7 @@
+apiVersion: backstage.io/v1alpha1
+kind: Domain
+metadata:
+ name: playback
+ description: Everything related to audio playback
+spec:
+ owner: user:frank.tiernan
diff --git a/packages/create-app/templates/default-app/examples/resources/artists-db-resource.yaml b/packages/create-app/templates/default-app/examples/resources/artists-db-resource.yaml
new file mode 100644
index 0000000000..a666e9b3fd
--- /dev/null
+++ b/packages/create-app/templates/default-app/examples/resources/artists-db-resource.yaml
@@ -0,0 +1,9 @@
+apiVersion: backstage.io/v1alpha1
+kind: Resource
+metadata:
+ name: artists-db
+ description: Stores artist details
+spec:
+ type: database
+ owner: team-a
+ system: artist-engagement-portal
diff --git a/packages/create-app/templates/default-app/examples/systems/artist-engagement-portal-system.yaml b/packages/create-app/templates/default-app/examples/systems/artist-engagement-portal-system.yaml
new file mode 100644
index 0000000000..8de3c00880
--- /dev/null
+++ b/packages/create-app/templates/default-app/examples/systems/artist-engagement-portal-system.yaml
@@ -0,0 +1,10 @@
+apiVersion: backstage.io/v1alpha1
+kind: System
+metadata:
+ name: artist-engagement-portal
+ description: Everything related to artists
+ tags:
+ - portal
+spec:
+ owner: team-a
+ domain: artists
diff --git a/packages/create-app/templates/default-app/examples/systems/audio-playback-system.yaml b/packages/create-app/templates/default-app/examples/systems/audio-playback-system.yaml
new file mode 100644
index 0000000000..7430ae2ff5
--- /dev/null
+++ b/packages/create-app/templates/default-app/examples/systems/audio-playback-system.yaml
@@ -0,0 +1,8 @@
+apiVersion: backstage.io/v1alpha1
+kind: System
+metadata:
+ name: audio-playback
+ description: Audio playback system
+spec:
+ owner: team-c
+ domain: playback
diff --git a/packages/create-app/templates/default-app/examples/systems/podcast-system.yaml b/packages/create-app/templates/default-app/examples/systems/podcast-system.yaml
new file mode 100644
index 0000000000..47a2f7ac9f
--- /dev/null
+++ b/packages/create-app/templates/default-app/examples/systems/podcast-system.yaml
@@ -0,0 +1,8 @@
+apiVersion: backstage.io/v1alpha1
+kind: System
+metadata:
+ name: podcast
+ description: Podcast playback
+spec:
+ owner: team-b
+ domain: playback
diff --git a/packages/create-app/templates/default-app/examples/templates/create-react-app/skeleton/README.md b/packages/create-app/templates/default-app/examples/templates/create-react-app/skeleton/README.md
new file mode 100644
index 0000000000..305d413b8e
--- /dev/null
+++ b/packages/create-app/templates/default-app/examples/templates/create-react-app/skeleton/README.md
@@ -0,0 +1,46 @@
+# Getting Started with Create React App
+
+This project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app).
+
+## Available Scripts
+
+In the project directory, you can run:
+
+### `yarn start`
+
+Runs the app in the development mode.\
+Open [http://localhost:3000](http://localhost:3000) to view it in the browser.
+
+The page will reload if you make edits.\
+You will also see any lint errors in the console.
+
+### `yarn test`
+
+Launches the test runner in the interactive watch mode.\
+See the section about [running tests](https://facebook.github.io/create-react-app/docs/running-tests) for more information.
+
+### `yarn build`
+
+Builds the app for production to the `build` folder.\
+It correctly bundles React in production mode and optimizes the build for the best performance.
+
+The build is minified and the filenames include the hashes.\
+Your app is ready to be deployed!
+
+See the section about [deployment](https://facebook.github.io/create-react-app/docs/deployment) for more information.
+
+### `yarn eject`
+
+**Note: this is a one-way operation. Once you `eject`, you can’t go back!**
+
+If you aren’t satisfied with the build tool and configuration choices, you can `eject` at any time. This command will remove the single build dependency from your project.
+
+Instead, it will copy all the configuration files and the transitive dependencies (`webpack`, Babel, ESLint, etc) right into your project so you have full control over them. All of the commands except `eject` will still work, but they will point to the copied scripts so you can tweak them. At this point you’re on your own.
+
+You don’t have to ever use `eject`. The curated feature set is suitable for small and middle deployments, and you shouldn’t feel obligated to use this feature. However we understand that this tool wouldn’t be useful if you couldn’t customize it when you are ready for it.
+
+## Learn More
+
+You can learn more in the [Create React App documentation](https://facebook.github.io/create-react-app/docs/getting-started).
+
+To learn React, check out the [React documentation](https://reactjs.org/).
diff --git a/packages/create-app/templates/default-app/examples/templates/create-react-app/skeleton/catalog-info.yaml b/packages/create-app/templates/default-app/examples/templates/create-react-app/skeleton/catalog-info.yaml
new file mode 100644
index 0000000000..8c28cb3b4e
--- /dev/null
+++ b/packages/create-app/templates/default-app/examples/templates/create-react-app/skeleton/catalog-info.yaml
@@ -0,0 +1,14 @@
+apiVersion: backstage.io/v1alpha1
+kind: Component
+metadata:
+ name: ${{values.name | dump}}
+ {%- if values.description %}
+ description: ${{values.description | dump}}
+ {%- endif %}
+ annotations:
+ github.com/project-slug: ${{values.destination.owner + "/" + values.destination.repo}}
+ backstage.io/techdocs-ref: dir:.
+spec:
+ type: website
+ lifecycle: experimental
+ owner: ${{values.owner | dump}}
diff --git a/packages/create-app/templates/default-app/examples/templates/create-react-app/skeleton/docs/index.md b/packages/create-app/templates/default-app/examples/templates/create-react-app/skeleton/docs/index.md
new file mode 100644
index 0000000000..41149dadf0
--- /dev/null
+++ b/packages/create-app/templates/default-app/examples/templates/create-react-app/skeleton/docs/index.md
@@ -0,0 +1,28 @@
+## ${{ values.name }}
+
+${{ values.description }}
+
+## Getting started
+
+Start write your documentation by adding more markdown (.md) files to this folder (/docs) or replace the content in this file.
+
+## Table of Contents
+
+The Table of Contents on the right is generated automatically based on the hierarchy
+of headings. Only use one H1 (`#` in Markdown) per file.
+
+## Site navigation
+
+For new pages to appear in the left hand navigation you need edit the `mkdocs.yml`
+file in root of your repo. The navigation can also link out to other sites.
+
+Alternatively, if there is no `nav` section in `mkdocs.yml`, a navigation section
+will be created for you. However, you will not be able to use alternate titles for
+pages, or include links to other sites.
+
+Note that MkDocs uses `mkdocs.yml`, not `mkdocs.yaml`, although both appear to work.
+See also
+ Edit src/App.tsx and save to reload.
+