Amazon Developer

as

Settings
Sign out
Notifications
Alexa
Amazon Appstore
Ring
AWS
Documentation
Support
Contact Us
My Cases
Get Started
Design and Develop
Publish
Reference
Support
Native
Skip to main content

Rate your experience with the Vega SDK

Vega SDK and OS version 2.0

Vega SDK 2.0, Vega OS 2.0, and the Vega Developer Tools are now generally available, and they’re no longer in open beta. Vega OS 2.0 has rolled out to all Vega-powered Fire TV devices, so you can build for OS 2.0 today. Vega 2.0 enables you to:
  • Build faster, more responsive apps with React Native 0.83. React Native 0.83 is now generally available and brings React 19, the React Compiler, and Hermes v1. The React Compiler handles memoization at build time, so you no longer need to add React.memo or useCallback by hand. Debug performance issues with React Native DevTools. Style focus states with new CSS properties such as boxShadow and outline. Since SDK 0.24, more libraries support RN 0.83. These include React Navigation, Reanimated, and Lottie, plus additional Expo libraries.
  • Add native capabilities to your React Native app. Use Vega native APIs to build custom UI components in C++ and to schedule background tasks that run after your app closes. Build the rest of your app in React Native. Native tooling is in open beta.
  • Migrate and build with AI assistance. Amazon Devices Builder Tools (ADBT) for AI is the recommended way to use AI coding agents for Vega development. Use it to plan your upgrade from RN 0.72 to RN 0.83, migrate a Fire OS app to React Native for Vega, and debug performance issues.
  • Catch compatibility issues before you build. vega project doctor now includes compatibility linters for JavaScript, TypeScript, and native code. They flag APIs that aren’t available on every OS version your app targets.
This release requires OS 2.0 on your Vega Fire TV device, which is compatible with Vega SDK 2.0.x. Build numbers vary by device. See OS builds.

Announcements

Vega general availability and API stability

Starting with 2.0, the Vega API surface stays stable across minor SDK releases. Breaking changes ship only in the major release, once a year. Minor releases follow on a regular cadence. You can adopt each minor release without rework, and plan for major upgrades on your own timeline.

OS version range support

Your app’s manifest can now declare a range of supported OS versions, from a minimum to a target. Most Vega devices update to the latest OS version, so for most apps, set both min and target to 2.0. In future releases, some devices might not receive the latest OS version. If your app needs to reach those devices, set min to the oldest OS version you support, and use the compatibility linters to guard newer APIs. Action required: Set [os.version] in manifest.toml to the range your app supports, then rebuild. See Target OS Versions

TextInput Done and Back behavior will match stock React Native

In an upcoming Vega OS release, a single-line TextInput on React Native 0.83 without submitBehavior will use the React Native default, blurAndSubmit. Pressing Done will fire onSubmitEditing, then blur the field and close the keyboard. Pressing Back will fire onSubmitEditing with submitAction set to 'previous', then do the same. Today, the field keeps focus after Done, and Back closes the keyboard without notifying your app. Fields that set submitBehavior="submit", multiline fields, and React Native 0.72 apps aren’t affected. Action required: If your RN 0.83 app treats every onSubmitEditing event as a submission, filter on submitAction and treat 'previous' as a dismiss. To keep the keyboard open after Done, set submitBehavior="submit". For details, see Handle Password Input Events.

Breaking changes

OS version module entries are now generated at build time

In SDK 0.24, vega project update-manifest wrote /com.amazon.vega.os@IVega_* entries into the [[needs.module]] and [[wants.module]] sections of your source manifest.toml. Starting with SDK 2.0, the build owns these entries and generates them from [os.version] into the packaged manifest. vega project update-manifest now writes only the min and target values, and on every run it removes tool-owned module entries from your source manifest. Module entries you declare for other system modules are preserved. On a project created with SDK 0.24, the first run deletes these lines from your source-controlled manifest:
Action required: Commit the resulting diff, and don’t restore the removed entries by hand. See Manifest [os.version] Section

Deep imports no longer resolve in React Native 0.83 libraries

Starting with SDK 2.0, the React Native for Vega core package and the Vega versions of Gesture Handler, Lottie, React Navigation, Reanimated, React Native SVG, and React Native Screens expose only their public JavaScript interface in node_modules. The public API is unchanged. If your RN 0.83 app uses top-level imports, it’s unaffected. If it uses deep imports that reach into a library’s internal implementation paths, your build fails because those paths no longer resolve. This change doesn’t affect RN 0.72 apps. Action required: If your RN 0.83 app uses deep imports, replace them with top-level imports (preferred) or lazy imports. If any of your Jest tests depend on a library’s internal implementation, mock those modules in your test code instead.

React Linear Gradient is replaced by a built-in style prop in React Native 0.83

React Native 0.83 supports linear gradients natively through the experimental_backgroundImage style prop, which accepts standard CSS linear-gradient() syntax on any View. The @amazon-devices/react-linear-gradient library is no longer needed and isn’t included in the RN 0.83 library set. RN 0.72 apps are unaffected.
Action required: When you migrate to RN 0.83, remove the @amazon-devices/react-linear-gradient dependency and replace <LinearGradient> components with the experimental_backgroundImage style prop on a View. See Replace LinearGradient with the backgroundImage style prop

Use @shopify/flash-list instead of @amazon-devices/shopify__flash-list in React Native 0.83

On React Native 0.72, Vega provided its own FlashList implementation as @amazon-devices/shopify__flash-list. On React Native 0.83, use the public FlashList package, @shopify/flash-list, instead. The @amazon-devices/shopify__flash-list package isn’t available for React Native 0.83 apps, so an app that still imports it fails at runtime. RN 0.72 apps are unaffected. Action required: When you migrate to RN 0.83, replace the @amazon-devices/shopify__flash-list dependency with @shopify/flash-list, and update your imports.

Experimental APIs are no longer supported

SDK 0.24 announced that the Vega SDK’s experimental APIs were being deprecated. Starting with SDK 2.0, experimental APIs are no longer supported. Action required: If your app uses experimental APIs, migrate to the supported APIs before you build with SDK 2.0. To find the experimental APIs in your app and plan the migration, use Amazon Devices Builder Tools (ADBT) for AI version 1.0.19 or later.

New features

Build native UI components and background tasks in C++

React Native for Vega apps can now include views and modules written in C++, and use them from JavaScript like any other component or module. Two sample apps for React Native 0.83 show how. Both run on Fire TV Stick and the Vega Virtual Device:
  • Native UI Component sample: Renders C++ views built with the Vega UI toolkit inside your React tree. The sample passes props from JavaScript to native code and sends events back to JavaScript. It also covers D-pad focus, animation, image prefetching, and VoiceView accessibility.
  • Periodic Background Task sample: Wraps the Vega Task Manager in a C++ Turbo Module, so your app can run a headless JavaScript task on a repeating schedule. The schedule stays in place after your app closes. The minimum interval is 60 seconds, and each run can take up to five minutes.
Task Manager doesn’t have a JavaScript API yet. To schedule tasks, copy the sample’s PeriodicTasks Turbo Module into your app. Read more in the Enhance your React Native App with Vega native APIs blog post.

Find and fix accessibility issues as you edit in Vega Studio

The A11y Inspector in Vega Studio checks your .tsx and .jsx files as you edit. It flags components that assistive technologies, such as VoiceView, can’t describe or operate, and suggests quick fixes. The inspector uses the same rules as the Vega ESLint plugin, so its results match your build pipeline. It’s on by default in Vega Studio 0.24.2 and later. See Find and Fix Accessibility Issues in Vega Studio

Compatibility lint for JavaScript and TypeScript

When min is lower than target, an API introduced after min might not exist on every device your app supports. vega project doctor now checks your source code against the SDK compatibility manifest and reports three rules:
  • no-unguarded-os-api (error): an API introduced after min is used without a guard.
  • no-removed-api (error): an API removed at or before min is still in use.
  • warn-deprecated-api (warning): an API deprecated at or before target is still in use.
To fix an unguarded API, wrap it in an isPresentOnOS() check from @amazon-devices/kepler-compatibility and provide a fallback, or raise min. The second argument to isPresentOnOS() is the library version that provides the API, not the OS version. vega project doctor exits with a non-zero status when a check fails, so you can use it as a gate in your CI pipeline.
See Target OS Versions

Compatibility lint for native code

For projects with kepler.projectType set to native, vega project doctor also checks C and C++ sources. It reports unguarded QueryInterface calls for OmniKit interfaces added after min, and interfaces removed before min or deprecated by target. To use an optional newer interface, call TryQueryInterface<T>() and check for nullptr. Use QueryInterface<T>() only for interfaces guaranteed at min. See Upgrade Your App’s OS Version Compatibility

Verify Account Login integration from the command line

The new kcp-cli-v2 tool, pre-installed on Vega devices, lets you check your app’s Content Launcher Account Login status without a separate test harness. From your app’s component shell, run kcp-cli-v2 account-login read-status to read the current login status. Run kcp-cli-v2 account-login watch-status to monitor login status changes in real time while you sign in and out of your app. The tool requires Developer Mode and a sideloaded app, and doesn’t run on the Vega Virtual Device. See Test Content Launcher Integration

Improvements

Full TextPath support in React Native SVG

@amazon-devices/react-native-svg now fully supports the TextPath element, so you can render text along a curved or arbitrary path, for example for circular labels and curved headings, without pre-rendering the text as an image. See react-native-svg

Smoother audio across MSE segment boundaries

The W3C Media pipeline now implements the Media Source Extensions audio splice algorithm and handles overlapping audio frames. Before this change, adaptive streams that appended overlapping or padded audio segments, such as at ad insertion points or period boundaries, could produce audible clicks, gaps, or drift. Decoded (PCM) audio is now trimmed and linearized before it reaches the audio sink, so playback stays continuous across segment boundaries without any change to your app. See W3C Media API in React Native for Vega

Resolved issues

AC-3 and E-AC-3 codec strings in W3C Media capability checks

navigator.mediaCapabilities.decodingInfo() no longer rejects configurations that use the ac3, eac3, or ec3 codec strings. Before this fix, these strings were routed to the AV1 codec parser, so the call failed and players such as Shaka Player filtered out every variant with AC-3 audio. Separately, an MPEG-TS SourceBuffer with a combined codec string such as video/mp2t; codecs="avc1.4D401F,ac3" played video but silently dropped the AC-3 audio track. These streams now use a demuxer that supports AC-3 in MPEG-TS, so audio plays.

dash.js stability fix in dash-rel-v5.0.0-r1.8

The Vega release of dash.js includes the following fix:
  • dash.js now reports an error once, when the retry limit is reached, instead of on every retry. This matches the behavior of upstream dash.js 5.0.0.
To get this fix, download the latest release from Play Adaptive Content (DASH) with Dash.js Player.

Video surface resize while playback is paused

When you resized a video surface while playback was paused, the paused frame didn’t scale to the new size, or the video briefly appeared in the wrong position before it resumed. The compositor now re-presents the last frame at the new size, so picture-in-picture and multiview layouts resize correctly in the paused state.

Seek events in MSSE mode

Native apps that use Media Source Sample Extensions (MSSE) mode didn’t receive the seeked event after a call to seek() on IMediaSampleSourceTrack. The media pipeline now registers its seek-completion callback, so IHtmlMediaElementEventListener receives timeupdate and seeked when a seek completes. In MSSE mode, seek() is asynchronous.

TextInput cursor position after focus changes

When a TextInput sat next to another focusable element, moving focus away with the D-pad and back moved the cursor one character each time. The key-up event from the D-pad press reached the TextInput after focus had already moved. The cursor now stays where you left it.

vpm install-async exits after installation

vpm install-async printed INSTALLATION_COMPLETED but didn’t exit when you ran it without the --token argument, which blocked automated test scripts. The command now exits when installation finishes. If you added --token as a workaround, you can remove it.

W3C Media API reference formatting

The W3C Media API reference now renders type links and multi-line descriptions correctly. This affects MediaCapabilitiesKeySystemConfiguration, the scalingmode property of VideoProps, HTMLVideoElement, and AudioPlayer.

Appium tests work again on OS 1.2 and later

On some OS 1.2 builds, the automation toolkit service that Appium uses didn’t start on the device. Port 8383 showed as listening, but no process handled requests. Appium commands such as findElement, takeScreenshot, and getPageSource failed with socket hang up or ECONNRESET, and re-enabling Developer Mode didn’t help. The automation toolkit service now starts in Developer Mode, so Appium sessions connect and run as expected.

Known issues

RN 0.83 apps crash at launch when a dependency pulls in the RN 0.72 runtime

If an RN 0.83 app depends on a library version built for RN 0.72, the RN 0.72 runtime loads into the same process and the app crashes at launch with SIGABRT or SIGSEGV. The device log shows Failed to get system bundle path for: index.amzn__react-native-kepler-2.hermes.bundle. The most common cause is @amazon-devices/kepler-ui-components 2.x, which depends on @amazon-devices/keplerscript-native-ui-components and its bundled RN 0.72 runtime. Workaround: Upgrade @amazon-devices/kepler-ui-components to 3.0.0 or later. Replace @amazon-devices/react-linear-gradient with the experimental_backgroundImage style prop (see Replace LinearGradient with the backgroundImage style prop). After a clean rebuild, check that keplerscript-app-config.json doesn’t list any RN 0.72 system bundles.

HEVC playback fails on Fire TV Stick HD (2026)

On Fire TV Stick HD (2026) running OS 2.0, the HEVC hardware decoder isn’t available. HEVC streams load indefinitely without an error event, and KeplerMediaDescriptor.queryMediaCapabilitiesSync() returns no decoders for CodecMimeType.MIME_HEVC. H.264 playback isn’t affected. Workaround: Before playback, query KeplerMediaDescriptor for HEVC support and fall back to an H.264 stream when no decoder is returned.

No error event when a video decoder can’t be created

If the media pipeline can’t create or link a video decoder, it doesn’t send an error event to JavaScript. Playback appears to load indefinitely. To detect unsupported codecs before playback, use KeplerMediaDescriptor.queryMediaCapabilities().

HEVC live HLS in MPEG-TS doesn’t start

Live HLS streams that carry HEVC video in MPEG-TS segments don’t show video. The timestamp offset is applied twice, so samples get negative timestamps and are dropped, and Shaka Player repeatedly seeks forward. H.264 streams and HEVC VOD streams aren’t affected. Workaround: In Shaka Player, set manifest.hls.sequenceMode to true.

removeSourceBuffer() hangs while an append is in progress

If you call MediaSource.removeSourceBuffer() while appendBuffer() is still in progress on that SourceBuffer, the call blocks the JavaScript thread and the system stops the app as not responding. The call doesn’t throw an InvalidStateError. Workaround: Before you remove a SourceBuffer, check that its updating property is false, or wait for its updateend event.

Video surface ignores pixel aspect ratio

KeplerVideoSurfaceView renders decoded frames with square pixels and ignores the stream’s pixel aspect ratio. Anamorphic standard-definition content, such as 720×576 broadcast video with a 16:9 display aspect ratio, appears horizontally squeezed. All scalingmode values, including strech, preserve the buffer’s aspect ratio, so you can’t correct the aspect ratio in your app.

Large multi-period DASH manifests can make dash.js apps stop responding

The native XML parser is available only for Shaka Player, so dash.js parses manifests in JavaScript. Live DVR streams that add a period for each ad break grow on every manifest refresh. After about 25–60 minutes, a single refresh can block the JavaScript thread long enough that the system stops the app as not responding. Workaround: Run the player in a headless JavaScript service so manifest processing doesn’t block the UI thread. Don’t log or JSON.stringify the full manifest in your app.

HMAC keys must be exactly 256 bits

WebCrypto.subtle.importKey() in @amazon-devices/keplercrypto rejects HMAC-SHA-256 keys that aren’t exactly 256 bits long, with NotSupportedError: A key length greater than the hash length (256 bits) is not supported. Workaround: For keys longer than 512 bits, hash the key with SHA-256 before you import it. This produces the same HMAC result. For other key lengths, use another HMAC implementation until the fix ships.

Screensaver starts during gameplay with a phone controller

The screensaver starts after five minutes without local input, even when a user plays a cloud-streamed game with a paired phone as the controller. Input from the phone goes to the cloud session, so the device doesn’t register user activity. Vega doesn’t provide an API to keep the screen on.

Apps can’t change the display refresh rate

State-changing DisplayManager APIs, such as requestConfigChange() and enableAutoConfigSwitch(), require the com.amazon.graphics.privilege.display.manager privilege, which isn’t available to third-party apps. Without it, commitStates() returns a commit ID but makes no change and doesn’t call onCommitSuccess or onCommitFailure. Apps can’t switch the output to match content frame rates such as 23.976 or 50 fps.

”Alexa, previous” doesn’t reach the app

When a user says “Alexa, previous” during playback, the app’s Media Playback handler doesn’t receive the Previous command, and Alexa replies that the command isn’t working. “Alexa, next” and “Alexa, pause” work as expected.

VPN Manager doesn’t route IPv6 traffic

The VPN Manager API supports WireGuard only and doesn’t route IPv6 traffic through the tunnel. IPv6 traffic leaves the device outside the VPN, and addRoute() rejects IPv6 CIDRs with Invalid route CIDR format. IPv6 support is planned for a future release.

PNG splash screen animations play at a low frame rate

Splash screen animations made of many full-HD PNG frames play at about 8 fps and can take several seconds to appear. The device decodes each PNG on the CPU. Workaround: Encode the frames as ASTC and package them as compressedSplashScreenImages.zip next to SplashScreenImages.zip in assets/raw/. ASTC splash animations play at 30 fps. In this release, an ASTC splash screen can render black on every launch after the first until the device restarts.

Crash reporting libraries can’t capture low-memory kills

When the kernel stops an app for exceeding its memory limit, the process receives SIGKILL, so crash reporting libraries such as Sentry can’t record the crash. tryGetLastTerminationData() currently reports only app-not-responding terminations.

VoiceView can’t be enabled from the Developer Mode shell

vdcm set "com.amazon.devconf/system/accessibility/VoiceViewEnabled" "ENABLED" fails with No permission for operation in the Developer Mode shell. To turn on VoiceView, use the device’s accessibility settings instead.

ifconfig doesn’t work in the Developer Mode shell

The Developer Mode shell doesn’t have access to /proc/net, so ifconfig doesn’t return network information. To find your device’s IP address for VDA over TCP/IP, select Settings > Network on the device.

TypeScript 4 projects fail to build with @types/node 26

If your project uses TypeScript 4 and installs @types/node 26.x, directly or through another dependency, type checking and builds fail with errors in the @types/node declaration files. @types/node 26.x uses TypeScript syntax that TypeScript 4 doesn’t support. @types/node is a community-maintained package that isn’t part of the Vega SDK. The Vega SDK doesn’t set your @types/node version, so this issue can affect a project on any SDK version. Workaround: Update typescript in your devDependencies to version 5, for example 5.8.3. If you can’t upgrade TypeScript yet, pin @types/node to a version earlier than 26 in devDependencies or overrides. Then run npm install and rebuild.

OS builds

Vega OS 2.0 ships with a different build number on each supported device. Use the following table to confirm that your device runs the OS 2.0 build. To check your device software version, go to My Fire TV > About.
Last modified on October 28, 2026