Overview
This tutorial guides you through building a No-Code UI for a custom integration. A No-Code UI provides a more user-friendly way to configure your fact collector options directly through the Soundcheck interface, rather than manually editing YAML configuration files. Soundcheck offers a No-Code UI configuration option for every integration developed by Spotify. To create a No-Code UI for your custom integration, you can leverage frontend extensions available in the new frontend system.You cannot directly edit, extend, or replace the No-Code UI for integrations
pre-built and shipped by Soundcheck. If you need a custom No-Code UI for an
existing Soundcheck integration, you must build a custom integration for that
fact collector along with a new No-Code UI, then disable the pre-built one.
See Step 5: Configure Integration
Extension for how to disable a
pre-built integration.
ExamplePagerDutyFactCollector (the custom PagerDuty integration we built in the Creating a Custom Third-Party Integration tutorial). This No-Code UI allows users to configure the integration directly from the Soundcheck Integrations page, rather than editing YAML files. We’ll also disable the pre-shipped PagerDuty integration to use our custom one instead.
Time to complete: ~20 minutes
📖 What are integration extensions?
📖 What are integration extensions?
Integration extensions are the pages that appear when you click “Configure” on an Integration within the Soundcheck Integrations tab. The “Configure” button will only display for an integration when an integration extension is installed for that Third-Party Integration.The following integration extensions are provided by Soundcheck and enabled by default:
It’s currently not possible to change the content of the integration table’s
rows.
app-config.yaml
Prerequisites
Before starting, ensure you have:- Backstage migrated to the new frontend system (Portal uses the new frontend system exclusively)
Either a complete transition or a hybrid migration to the new frontend system
is supported. If using a hybrid migration, complete Steps 1–6 first, then
follow the Additional Steps for Hybrid Frontend
Migrations section.
-
A Third-Party Integration that is configurable (implements
ConfigurableFactCollectorinterface). Most integrations developed by Spotify are configurable. Exceptions: Tech Insights and Soundcheck (they will be configurable in the future) - Soundcheck plugin modules and the corresponding Third-Party Integration backend module installed in your Backstage instance. See Creating a Custom Third-Party Integration for how to create one
Implementation
Step 1: Create the Frontend Plugin
Use the Backstage CLI to create a new frontend plugin for your integration:| Prompt | Value |
|---|---|
| What do you want to create? | frontend-plugin |
| Enter the ID of the plugin | soundcheck-integrations |
The new frontend system is still in alpha and therefore not yet the default
when creating frontend plugins. Frontend plugins should follow the migration
guide
to create an alpha export (this will be covered in the next steps).
ExampleComponent & ExampleFetchComponent and their exports/imports that were created by the CLI.
Step 2: Create the alpha.tsx File
Create analpha.tsx file that will contain your plugin declaration compatible with the new frontend system:
plugins/soundcheck-integrations/src/alpha.tsx
Ensure
integrationId and collectorId match the ID of the corresponding
fact collector (the custom fact collector you have created).📖 Integration Extension Configuration Options
📖 Integration Extension Configuration Options
The
The extension reference follows the pattern
IntegrationPageBlueprint supports the following configuration options:| Option | Required | Description |
|---|---|---|
name | No | Extension name, should be unique for all integration extensions. Must be provided if your plugin implements more than one integration extension |
disabled | No | A boolean flag, if set to true it disables the extension by default |
params.integrationId | Yes | ID of the corresponding fact collector |
params.loader | Yes | A function that returns the custom implementation of the No-Code UI (React component) |
params.path | No | A path to the integration page. Default value is /soundcheck/integrations/:integrationId |
params.routeRef | No | A routing reference to expose a path in Backstage’s routing system |
<kind>:<namespace>/<name> where:| Part | Description |
|---|---|
kind | Defaulted to integration for extensions created from IntegrationPageBlueprint extension blueprint |
namespace | ID of your frontend plugin that implements the extension (example: soundcheck-integrations) |
name | Extension name (example: pagerduty) |
Step 3: Update package.json
Update yourpackage.json file in the soundcheck-integrations plugin:
- Include
alpha.tsxfile in exports and typesVersions - Include
@spotify/backstage-plugin-soundcheck,@backstage/core-compat-apiand@backstage/frontend-plugin-apimodules in dependencies
plugins/soundcheck-integrations/package.json
The
backstage:^ version syntax requires the Backstage Yarn
plugin
to be installed in your project. This plugin automatically resolves the
correct package version based on your Backstage release.📖 Soundcheck frontend exports for No-Code UI
📖 Soundcheck frontend exports for No-Code UI
The Soundcheck frontend module exports the following constants and functions for creating a custom No-Code UI:
| Export | Description |
|---|---|
IntegrationPageBlueprint | Extension blueprint for the custom integration config page |
useGetCollectors | React hook that fetches collector configurations from the database and/or YAML by their IDs. See Appendix: React Hooks Reference |
useUpdateCollectorConfig | React hook that saves collector configuration to the database. See Appendix: React Hooks Reference |
Step 4: Create the Integration React Component
Implement a React component that will display the configuration options for the Third-Party Integration:plugins/soundcheck-integrations/src/components/IntegrationComponent.tsx
This is a demo component that doesn’t implement any validation and it’s not
meant to be used as-is in production.
Step 5: Configure Integration Extension
While extensions derived from theIntegrationPageBlueprint blueprint do not offer custom configuration options, they do universally support the disabled option (note that integration extensions are enabled by default).
Add the following configuration to disable the pre-shipped PagerDuty integration and enable the No-Code UI for the custom PagerDuty integration you just built:
app-config.yaml
Step 6: Verify Your Integration
- Save your changes and run your Backstage instance
- Navigate to Soundcheck → Integrations
- Confirm your custom integration shows a “Configure” button
Additional Steps for Hybrid Frontend Migrations
If you have completed a full transition to the new frontend system and have frontend feature discovery enabled, no additional steps are required—your plugins will be discovered and registered automatically. However, if you have done a hybrid migration to the new frontend system (feature discovery is not enabled), you need to manually register the features by following these additional steps.Hybrid Step 1: Add Dependencies to Your App
Add the following dependencies to yourpackages/app/package.json and run yarn install:
packages/app/package.json
Make sure the dependency name for your custom integration is correct. If you
have followed this tutorial with no changes, the name above is correct.
Hybrid Step 2: Remove the Soundcheck Route
Remove the Soundcheck Route frompackages/app/src/App.tsx as this will now be handled by the new frontend system.
packages/app/src/App.tsx
Hybrid Step 3: Register the Plugins
Import the Soundcheck plugin and your custom integration, then add them to thefeatures array in createApp in App.tsx:
packages/app/src/App.tsx
Make sure the import path for your custom integration is correct. If you have
followed this tutorial with no changes, the path above is correct.
📖 Full example: App.tsx with hybrid migration
📖 Full example: App.tsx with hybrid migration
packages/app/src/App.tsx
Hybrid Step 4: Verify Your Integration
- Save your changes and run your Backstage instance
- Navigate to Soundcheck → Integrations
- Confirm your custom integration shows a “Configure” button
Appendix: React Hooks Reference
The Soundcheck frontend module provides the following React hooks for building custom No-Code UI components.useGetCollectors
📖 useGetCollectors - Fetch collector configurations
📖 useGetCollectors - Fetch collector configurations
React hook that fetches collector configurations from the database (Collector type definition:Example response:
collector table) and/or YAML by their IDs.
If the collector’s configuration is found in both database and YAML and the YAML configuration is a
plain object (not an array), the configurations will be merged (it’s recommended to configure secrets
in YAML only and don’t expose secret configuration in No-Code UI for security reasons).
Otherwise, the database configuration takes precedence. Collector’s YAML configuration
can be found under soundcheck.collectors.<integrationId> in app-config.yaml file.Usage example:useUpdateCollectorConfig
📖 useUpdateCollectorConfig - Save collector configuration
📖 useUpdateCollectorConfig - Save collector configuration
React hook that saves collector configuration to the database (
collector table). No-Code UI configuration
is always stored in the database as a raw JSON object. The configuration JSON object should only include the
actual collector’s configuration (aka what you’d configure under soundcheck.collectors.<integrationId>
in app-config.yaml file as YAML config). The configuration should be a valid JSON object, otherwise
an error will be thrown by the backend.On top of persisting the config to the database the hook also calls ConfigurableFactCollector.setConfig()
method implemented by the fact collector, so the fact collector will be aware of the updated config right away.Usage example: