firetv-leanback
Fire TV leanback manifest configuration: banner icons, LEANBACK_LAUNCHER intent filter, TV-specific Android settings
Skill by giolaq
Install
Works with Claude Code, Claude apps, Codex, Cursor, Gemini CLI, GitHub Copilot, VS Code, OpenCode, Goose, Windsurf. Read the repository before you give any tool access to your data.
npx agentmarket install skill/giolaq-firetv-leanback
Asks which of your tools to add it to (Claude Code, Codex, Cursor, VS Code, Windsurf, Gemini CLI, Claude Desktop) and shows the change first. See https://agentmart.dev/cli.
Get the weekly diff
The weekly diff: one email a week with new agent tools, notable updates and grade changes, plus security alerts for tools you follow. Double opt-in, one-click unsubscribe.
About
Reviews
Write a reviewNo reviews yet. Installed it? Reviews come from verified installers only. How reviews work
Permissions
What this skill can do and what it asks for, from its SKILL.md. Checked Oct 25, 2026.
- Tools
- No tools found
- Secrets
- None asked for
- Install scripts
- None found
Network hosts it talks to 1
codeload.github.com· found in install command
Files it touches
~/.claude/skills/firetv-leanback
What's inside
- Skill name
firetv-leanback- Description
- Fire TV leanback manifest configuration: banner icons, LEANBACK_LAUNCHER intent filter, TV-specific Android settings
- License
- MIT-0
- Instructions
- 157 lines in SKILL.md · view on GitHub
Files (1)
- SKILL.md
SKILL.md (first lines)
# Fire TV / Android TV (leanback)
> Android TV and Fire TV (Fire OS) share the same Android runtime and require the same manifest configuration to be recognized as TV apps by the system. Without these settings, an APK installs but doesn't appear in the TV launcher, or worse: appears with the wrong icon and gets rejected from the store.
This skill covers what `apps/expo-multi-tv/app.json` and the generated `AndroidManifest.xml` must contain.
## The four non-negotiables
For Fire OS / Android TV to recognize the app as a TV app:
1. **`isTV: true`** in the Expo config-tv plugin options.
2. **`androidTVBanner`** asset (exactly 400×240 PNG) referenced from `app.json`.
3. **`LEANBACK_LAUNCHER` intent filter** on the main activity. The plugin generates this when `isTV: true`.
4. **`uses-feature android.software.leanback` (required=false)** in the manifest. Plugin handles it.
If the agent finds itself manually editing `AndroidManifest.xml`, **stop.** The plugin should produce it. Manual edits get wiped on next prebuild.
## `app.json` shape (verified against template)
```json
{
"expo": {
"name": "AppName",
"slug": "app-slug",
"plugins": [
[
"@react-native-tvos/config-tv",
{
"isTV": true,
"androidTVBanner": "./assets/icon-400x240.png"
}
]
],
"android": {
"package": "com.example.appname",
"versionCode": 1
},
"ios": {
"bundleIdentifier": "com.example.appname"
}
}
}
```
Notes:
- Plugin order matters. `@react-native-tvos/config-tv` should come before any plugin that modifies the Android manifest.
- The Android `package` and iOS `bundleIdentifier` should match your domain. Fire TV store and Apple TV App Store check these.
## Banner specs (the most common bug)
- **Exact dimensions: 400 × 240 pixels.** Not 800×480. Not 200×120. Exact.
- PNG, RGB, no alpha needed (but supported).
- Visually balanced — there is no safe zone padding in the launcher.
- Includes app name as text (the launcher doesn't render the app name beside the banner).
The `replace_assets` tool generates this if not provided. Generation rule:
- Background = `brand.background_color` or `brand.primary_color` (whichever has better contrast with the logo).
- Logo or wordmark centered, fitting within a 360×200 inner area.
- Output to `apps/expo-multi-tv/assets/icon-400x240.png`.
## Fire TV specifics on top of Android TV
Fire TV is Android TV with extra:
- **Amazon Appstore submission** rather than Google Play. Different store entry, different review.
- **No Google Play Services.** If a dep needs Play Services (e.g. some auth libs), it won't work on Fire TV. Audit deps.
- **Different system back behavior.** Long-press Home opens the Amazon overlay. Generally not the app's concern.
- **D-pad center is "select" same as Android TV.** Voice search via remote follows the same intent system.
## Distinguishing Fire OS from Android TV in code (rare)
You usually don't need to. The build artifact is the same APK and runtime APIs are identical. Reach for runtime detection only for:
- Deep-linking that uses Amazon-specific URI schemes.
- Analytics tagging by manufacturer.
- Account integration (Amazon account vs Google account).
If you need it:
```ts
import { NativeModules, Platform } from "react-native";
const isFireOS = Platform.OS === "android" &&
/amazon/i.test(NativeModules.PlatformConstants?.Manufacturer ?? "");
```
This goes in a single utility file (`isFireOS.android.ts`) — don't sprinkle it.
## D-pad center button = select (the gotcha)
Android TV remote sends `KEYCODE_DPAD_CENTER` for the center press. React TV Space Navigation translates this to a "select" event on the focused element. **It does not translate to `onPress` on a regular `<Pressable>` unless the Pressable is wrapped in a focusable.**
Use the template's themed `<Pressable>` (which is already wrapped) or wrap manually with `<SpatialNavigationFocusableView>`. Don't use `<TouchableOpacity>` — it responds to touch, not to focus + select.
## Prebuild → APK flow
```bash
# In apps/expo-multi-tv/
EXPO_TV=1 npx expo prebuild --platform android --clean
cd android && ./gradlew assembleDebug
cd ..
android describe --project_dir=android
android run \
--apks=android/app/build/outputs/apk/debug/app-debug.apk \
--device=<deviceId> \
--activity=.MainActivity
```
`--device` is required when multiple emulators or devices are connected,
including a phone emulator that may also be running. Forget this and the app
can install on the wrong target.
To find Fire TV device IDs:
```bash
adb devices
# AFTSS, AFTMM, AFTT, etc. are Fire TV model codes
```
To find the leanback emulator:
```bash
android emulator listFrom giolaq/tv-build-harness, MIT-0.
More from giolaq/tv-build-harness
- 0.563score
meta
giolaq
Meta skill loaded for all phases: project conventions, file modification rules, code quality standards
SkillBFreshness: B★ 4Claude Code +9 - 0.516score
kmp-navigation
giolaq
Compose Navigation for TV: state-based screen switching, BackHandler, focus-aware transitions, and drawer/sidebar patterns
SkillCFreshness: C★ 4Claude Code +9 - 0.516score
kmp-compose-tv
giolaq
Compose for TV patterns: TvLazyRow/Column, focusable cards, FocusRequester, D-pad navigation, and 10-foot UI composables
SkillCFreshness: C★ 4Claude Code +9 - 0.516score
kmp-template-anatomy
giolaq
KMP TV template repo structure: shared-core, androidtv-app, appletv-app modules and where screens, theme, data, and navigation live
SkillCFreshness: C★ 4Claude Code +9 - 0.516score
creative-tv-ui
giolaq
Creative visual design patterns for TV apps: typography, color depth, focus states, animations, per-content-type personalities
SkillCFreshness: C★ 4Claude Code +9 - 0.516score
kmp-data-layer
giolaq
Kotlin data layer patterns: data classes in shared-core, repository pattern, StateFlow, CatalogService, and content wiring
SkillCFreshness: C★ 4Claude Code +9 - 0.513score
kmp-build-commands
giolaq
Gradle build commands: assembleDebug, assembleRelease, APK output paths, and emulator installation
SkillCFreshness: C★ 4Claude Code +9 - 0.513score
kmp-theming
giolaq
Compose MaterialTheme patterns: Color.kt, Typography, darkColorScheme, and TV-specific theming for KMP apps
SkillCFreshness: C★ 4Claude Code +9 - 0.513score
kmp-verify-patterns
giolaq
How to verify KMP builds: compile checks, lint, common Compose compiler errors, Gradle dependency resolution issues
SkillCFreshness: C★ 4Claude Code +9 - 0.513score
rn-manifest-wiring
giolaq
Content manifest wiring: how to connect content.json data to React Native data hooks and screen components
SkillCFreshness: C★ 4Claude Code +9 - 0.513score
rn-shared-ui-catalog
giolaq
Catalog of available shared-ui components: what exists in the template, how to reuse vs create new
SkillCFreshness: C★ 4Claude Code +9 - 0.513score
10ft-ui
giolaq
10-foot UI design guidelines: safe zones, font sizes, contrast, focus indicators for TV viewing distance
SkillCFreshness: C★ 4Claude Code +9
Signals
- Stars
- 4
- Forks
- 0
- Open issues
- 3
- Last commit (this folder)
- Jul 15, 2026 (3 months ago)
From GitHub (fetched Oct 24, 2026).
Details
- License
- MIT-0
- Repository
- github.com/giolaq/tv-build-harness
- Website
- tv-build-harness.vercel.app
- First seen
- Oct 24, 2026
- Last checked
- Oct 24, 2026
- Source
- GitHubgithub-graphql
More from giolaq
- 0.563score
meta
giolaq
Meta skill loaded for all phases: project conventions, file modification rules, code quality standards
SkillBFreshness: B★ 4Claude Code +9 - 0.516score
creative-tv-ui
giolaq
Creative visual design patterns for TV apps: typography, color depth, focus states, animations, per-content-type personalities
SkillCFreshness: C★ 4Claude Code +9 - 0.516score
kmp-navigation
giolaq
Compose Navigation for TV: state-based screen switching, BackHandler, focus-aware transitions, and drawer/sidebar patterns
SkillCFreshness: C★ 4Claude Code +9 - 0.516score
kmp-compose-tv
giolaq
Compose for TV patterns: TvLazyRow/Column, focusable cards, FocusRequester, D-pad navigation, and 10-foot UI composables
SkillCFreshness: C★ 4Claude Code +9 - 0.516score
kmp-data-layer
giolaq
Kotlin data layer patterns: data classes in shared-core, repository pattern, StateFlow, CatalogService, and content wiring
SkillCFreshness: C★ 4Claude Code +9 - 0.516score
kmp-template-anatomy
giolaq
KMP TV template repo structure: shared-core, androidtv-app, appletv-app modules and where screens, theme, data, and navigation live
SkillCFreshness: C★ 4Claude Code +9
Cite this page
firetv-leanback skill. Agent Mart. https://agentmart.dev/skills/giolaq-firetv-leanback (last updated 2026-10-24)