Vega Channel Integration
Here's what you need to know to integrate Vega Channel into your app for Fire TV. The Vega Channel interface provides modality-agnostic APIs for playing your linear TV content. This can be done using a remote (your Fire TV EPG/Launcher), touch, voice (such as saying to an Alexa enabled device, "Alexa, tune to…."), or casting.
Prerequisites
- Access to the source code of your app for Fire TV.
- A Fire TV device that supports this integration. Check with your Amazon contact for a list of device types currently supported.
- Integration with the Vega Electronic Programming Guide (EPG) Provider.
Integration steps
Step 1: Include the necessary package dependencies in your app
Add the following dependencies in your package.json file.
  "dependencies": {
    "@amazon-devices/kepler-channel": "^1.1.0",
  }
- The kepler-channelpackage contains APIs for the Vega Channel interface for you to implement in your app.
Step 2: Update your manifest file
Update your manifest.toml file to include Vega Channel support. See the following Vega Sample App.
[components]
## Define your app's interactive component (if it doesn't already exist)
[[components.interactive]]
id = "<packageId>.main"
runtime-module = "/com.amazon.kepler.keplerscript.runtime.loader_2@IKeplerScript_2_0"
launch-type = "singleton"
categories = ["com.amazon.category.main", "com.amazon.category.kepler.media"]
[[extras]]
## `interface.provider` designates a component 
## that provides implementation of certain interfaces
key = "interface.provider"
## Declares the component that provides the implementation of the interfaces.
## This component must be defined under [[components.interactive]] and includes
## "com.amazon.category.kepler.media" in its categories.
component-id="<packageId>.main"
[extras.value.application]
## Declare support for Vega Channel
[[extras.value.application.interface]]
interface_name = "com.amazon.kepler.media.IChannelServer"
features = ["ChannelList"]
Details about the 2 categories added for the main interactive component:
- com.amazon.category.maindeclares the component as the default interactive component for the application package.
- com.amazon.category.kepler.mediadeclares the component to be targeted for Vega Media operations.
For more information, see the Manifest [components] Section.
The manifest file declares the support of the com.amazon.kepler.media.IChannelServer interface. The component <packageId>.main defined for "interface.provider" handles all the channel command callbacks. For more information, see steps 3 and 4.
Correct interface definition example
Each interface definition in the manifest must be separate and self-contained. Do not mix attributes from different interfaces. Here is an example of the correct way to define multiple interfaces.
[extras.value.application]
## IChannelServer Interface
[[extras.value.application.interface]]
interface_name = "com.amazon.kepler.media.IChannelServer"
features = ["ChannelList"]
## IContentLauncherServer interface
[[extras.value.application.interface]]
interface_name = "com.amazon.kepler.media.IContentLauncherServer"
attribute_options = ["partner-id"]
[extras.value.application.interface.static_values]
partner-id = "<Your partner id>"
Incorrect interface definition example
And here is an incorrect way to do this. Do not do it this way.
[extras.value.application]
[[extras.value.application.interface]]
interface_name = "com.amazon.kepler.media.IContentLauncherServer"
attribute_options = ["partner-id"]
[[extras.value.application.interface]]
interface_name = "com.amazon.kepler.media.IChannelServer"
features = ["ChannelList"]
[extras.value.application.interface.static_values]
partner-id = "<Your partner id>"
Step 3: Create the handler object for the Vega Channel interfaces
Create a handler which contains the implementation of the Vega Channel interface:
import {
  ChannelServerComponent2,
  ChangeChannelStatus,
  IChannelHandler,
  IChangeChannelResponse,
  OperationError,
} from '@amazon-devices/kepler-channel';
/**
 * The handler that implements the Vega Channel interface
 */
const channelTunerHandler: IChannelHandler = {
  async handleChangeChannel(
    channelIdentifier: string,
  ): Promise<IChangeChannelResponse> {
    /**
     * The value of ${channelIdentifier} here will contain data from the
     * ChannelDescriptor.identifier field from the Vega EPG Provider
     * if it was supplied during EPG Ingestion.
     */
    // Add your business logic to tune to ${channelIdentifier} here.
    const response = ChannelServerComponent2.makeChannelResponseBuilder()
      .status(ChangeChannelStatus.SUCCESS)
      .build();
    return Promise.resolve(response);
  },
    /**
     * handleChangeChannelByNumber should not be used, implement and use handleChangeChannel instead
     */
  async handleChangeChannelByNumber(
    majorNumber: number,
    minorNumber: number,
  ): Promise<IChangeChannelResponse> {
    throw new OperationError(
      'handleChangeChannelByNumber should not be used, implement and use handleChangeChannel instead',
    );
  },
  async handleSkipChannel(
    channelCount: number,
  ): Promise<IChangeChannelResponse> {
    // Add your business logic to handle skip channel
    const response = ChannelServerComponent2.makeChannelResponseBuilder()
      .status(ChangeChannelStatus.SUCCESS)
      .build();
    return Promise.resolve(response);
  },
};
Step 4: Supply your handler object to ChannelServer so it can be invoked
Add code similar to the following in your interactive component:
// Use the latest ChannelServerComponent2 from the library
import { ChannelServerComponent2 } from '@amazon-devices/kepler-channel';
import {
  IComponentInstance,
  IKeplerAppStateManager,
  useKeplerAppStateManager,
} from '@amazon-devices/react-native-kepler';
const keplerAppStateManager: IKeplerAppStateManager = useKeplerAppStateManager();
// Get the component instance
const componentInstance: IComponentInstance = keplerAppStateManager.getComponentInstance();
React.useEffect(() => {
 // Provide a handler for the given component instance to the Channel server.
 ChannelServerComponent2.getOrMakeServer().setHandlerForComponent(channelTunerHandler, componentInstance);
 }, []);
That’s it! You have completed the Vega Channel integration and it should be ready to receive commands.
Related topics
Last updated: Sep 30, 2025

