Skip to main content

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.
What you’ll build: A No-Code UI for the 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
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.
It’s currently not possible to change the content of the integration table’s rows.
The following integration extensions are provided by Soundcheck and enabled by default:
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 ConfigurableFactCollector interface). 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:
When prompted, enter: You’ll see: “Successfully created frontend-plugin.”
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).
You may remove the ExampleComponent & ExampleFetchComponent and their exports/imports that were created by the CLI.

Step 2: Create the alpha.tsx File

Create an alpha.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).
The IntegrationPageBlueprint supports the following configuration options:The extension reference follows the pattern <kind>:<namespace>/<name> where:

Step 3: Update package.json

Update your package.json file in the soundcheck-integrations plugin:
  • Include alpha.tsx file in exports and typesVersions
  • Include @spotify/backstage-plugin-soundcheck, @backstage/core-compat-api and @backstage/frontend-plugin-api modules 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.
Then run:
The Soundcheck frontend module exports the following constants and functions for creating a custom No-Code UI:

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 the IntegrationPageBlueprint 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

  1. Save your changes and run your Backstage instance
  2. Navigate to SoundcheckIntegrations
  3. Confirm your custom integration shows a “Configure” button
Clicking the “Configure” button will take you to the No-Code UI that you created in Step 4. 🎉 Congratulations! Your custom No-Code UI is now running.

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 your packages/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 from packages/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 the features 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.
packages/app/src/App.tsx

Hybrid Step 4: Verify Your Integration

  1. Save your changes and run your Backstage instance
  2. Navigate to SoundcheckIntegrations
  3. Confirm your custom integration shows a “Configure” button
🎉 Congratulations! Soundcheck will now register your No-Code UI plugin. You should be able to click the “Configure” button for your custom integration and access the configuration page you built.

Appendix: React Hooks Reference

The Soundcheck frontend module provides the following React hooks for building custom No-Code UI components.

useGetCollectors

React hook that fetches collector configurations from the database (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:
Collector type definition:
Example response:

useUpdateCollectorConfig

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: