
Vega Multi Tv Migration
Configure an Expo app for Amazon Vega / multi-TV migration with react-native-tvos plugins, landscape TV layout, and native build properties.
Overview
Vega-multi-tv-migration is an agent skill for the Build phase that documents critical Expo `app.json` and Metro settings for react-native-tvos TV apps.
Install
npx skills add https://github.com/amazonappdev/devices-agent-skills --skill vega-multi-tv-migrationWhat is this skill?
- Requires `@react-native-tvos/config-tv` plugin for TV support
- `expo-build-properties` with `android.kotlinVersion` pinned to 1.9.25 for Kotlin/Compose compatibility
- Platforms limited to `android` and `ios`—no web for TV apps
- Landscape orientation and custom URL `scheme` for expo-router deep links on TV
- Kotlin version 1.9.25 called out as critical
- iOS deploymentTarget 15.1 noted for ExpoModulesCore / tvOS
Adoption & trust: 1.3k installs on skills.sh; 3 GitHub stars; 3/3 security scanners passed (skills.sh audits).
What problem does it solve?
Your Expo project fails TV prebuild or Vega migration because TV plugins, Kotlin versions, or platform lists are wrong for a living-room target.
Who is it for?
Developers migrating or bootstrapping an Expo TV app for Fire TV / Vega with expo-router in a monorepo.
Skip if: Pure mobile-phone Expo apps, web-only targets, or teams not using `@react-native-tvos/config-tv`.
When should I use this skill?
You are configuring or migrating an Expo app for TV with `@react-native-tvos/config-tv` and expo-router.
What do I get? / Deliverables
You apply a validated Expo TV `app.json` skeleton with required plugins, landscape orientation, and monorepo-aware Metro paths ready to customize.
- Customized `app.json` TV block
- Metro monorepo root configuration snippet
- Plugin list for TV-native builds
Recommended Skills
Journey fit
TV client configuration is product UI delivery, so the canonical shelf is Build even when targeting device-store launch later. The skill is `app.json`, Metro monorepo paths, and TV-specific Expo plugins—frontend/mobile shell work, not backend APIs.
How it compares
Configuration templates for TV Expo—not a generic React Native phone starter or Amazon store listing skill.
Common Questions / FAQ
Who is vega-multi-tv-migration for?
Indie builders shipping React Native TV apps with Expo who need Vega- or Fire-TV-compatible native settings.
When should I use vega-multi-tv-migration?
In Build frontend/mobile work while editing `app.json`, Metro config, and TV plugins before device builds and launch distribution.
Is vega-multi-tv-migration safe to install?
It is documentation-heavy configuration guidance; review the Security Audits panel on this page before letting an agent modify your repo.
SKILL.md
READMESKILL.md - Vega Multi Tv Migration
{ "expo": { "name": "MyAppTV", "slug": "myapp-tv", "orientation": "landscape", "platforms": ["android", "ios"], "scheme": "myapp-tv", "plugins": [ "@react-native-tvos/config-tv", [ "expo-build-properties", { "android": { "kotlinVersion": "1.9.25" }, "ios": { "deploymentTarget": "15.1" } } ], "expo-router" ] } } # Expo TV app.json Configuration ## Critical Settings ### plugins - `@react-native-tvos/config-tv` - Enables TV support (REQUIRED) - `expo-build-properties` - Configures native build settings - `expo-router` - File-based routing for the TV app ### expo-build-properties - `android.kotlinVersion: "1.9.25"` - CRITICAL: Fixes Kotlin/Compose compiler compatibility - `ios.deploymentTarget: "15.1"` - REQUIRED for ExpoModulesCore (may need manual fix for tvOS) ### platforms - Only `["android", "ios"]` - No web support for TV apps ### orientation - `"landscape"` - TV apps are always landscape ### scheme - `"myapp-tv"` - URL scheme for deep linking with expo-router ## Customization Replace these values: - `name` - Your app display name - `slug` - URL-friendly identifier - `scheme` - Your app's URL scheme const { getDefaultConfig } = require("expo/metro-config"); const path = require("path"); const projectRoot = __dirname; const monorepoRoot = path.resolve(projectRoot, ".."); const config = getDefaultConfig(projectRoot); // Watch shared package for hot reload config.watchFolders = [path.resolve(monorepoRoot, "shared")]; // Resolve from local and parent node_modules config.resolver.nodeModulesPaths = [ path.resolve(projectRoot, "node_modules"), path.resolve(monorepoRoot, "node_modules"), ]; config.resolver.resolverMainFields = ["react-native", "browser", "main"]; // TV-specific file extensions: .tv.tsx, .tv.ts resolved before .tsx, .ts // Allows platform-specific implementations for TV platforms if (process.env?.EXPO_TV === "1") { const originalSourceExts = config.resolver.sourceExts; config.resolver.sourceExts = [ ...originalSourceExts.map((e) => `tv.${e}`), ...originalSourceExts, ]; } module.exports = config; { "name": "mytvproject", "version": "1.0.0", "private": true, "scripts": { "start": "EXPO_TV=1 npx expo start", "android": "EXPO_TV=1 npx expo run:android --device", "ios": "EXPO_TV=1 npx expo run:ios", "web": "EXPO_TV=1 npx expo start --web", "prebuild": "EXPO_TV=1 npx expo prebuild --clean && ./scripts/fix-tvos-deployment.sh", "clean": "rm -rf node_modules android ios .expo" }, "dependencies": { "@myapp/shared": "*", "expo": "~52.0.0", "expo-build-properties": "~0.13.0", "expo-router": "~4.0.0", "react": "18.3.1", "react-native": "npm:react-native-tvos@~0.76.0-0" }, "devDependencies": { "@react-native-tvos/config-tv": "~0.0.12" } } # Expo TV Package Configuration ## Critical Settings ### Package Name - `name: "mytvproject"` - The workspace package name referenced by root scripts ### scripts - All scripts MUST use `EXPO_TV=1` environment variable - `--device` flag on android avoids conflicts with Vega simulator - `web` script uses `expo start --web` for web target ### dependencies - `react-native: "npm:react-native-tvos@~0.76.0-0"` - Uses react-native-tvos fork - `@myapp/shared: "*"` - Always uses local workspace version - `expo-router: "~4.0.0"` - File-based routing ## Target Versions - Expo SDK: ~52.0.0 - react-native-tvos: ~0.76.0-0 - React: 18.3.1 - expo-router: ~4.0.0 ## Customization Replace `@myapp` with your project namespace in the shared dependency { "name": "@myapp/workspace", "version": "0.1.0", "description": "Monorepo for MyApp across Vega and Expo TV", "scripts": { "clean": "yarn workspaces foreach --all run clean ; rm -rf node_modules", "vega:build": "yarn workspace @myapp/vega run build:debug", "expotv": "yarn workspace mytvproje