• mit
  • tvos + ios
  • 2 images → 44 files

tvos-assets

Generate complete Images.xcassets bundles with parallax tvOS icons, iOS 18+ appearance variants, Top Shelf, and splash assets. Expo-first: the config plugin regenerates all of it on every prebuild.

move your cursor — this is the real generated imagestack. select it to lay the layers flat

What Goes In

you bring

  • ├─icon.svg
  • or
  • │  ├─layer-middle.svg
  • │  └─layer-front.svg
  • ├─background.png
  • └─#F39C12

3 inputs. Give both layers and you get real parallax on Apple TV, with the flat icon assembled from them. Pass --icon and your file is used as-is instead.

tvos-assets writes

  • ├─AppIcon.brandassets/30
  • ├─AppIcon.appiconset/4
  • ├─SplashScreenLogo.imageset/6
  • ├─SplashScreenBackground.colorset/1
  • └─icon.png · preview.html3

44 files: 21 Contents.json, 21 PNGs, and the contact sheet.

Three Ways To Run

// app.json: regenerates on every expo prebuild
"plugins": [
["tvos-assets/plugin", {
"icon": "./assets/brand/icon.svg",
"background": "./assets/brand/background.png",
"color": "#F39C12",
"layers": {
"front": "./assets/brand/layer-front.svg",
"middle": "./assets/brand/layer-middle.svg"
}
}]
]
EXPO_TV=1 → tvOS brand assets + Info.plist keys · plain prebuild → iOS appiconset

One Config, Three Surfaces

Expo plugin

Add it to app.json. Every expo prebuild regenerates the full catalog, nothing gets committed under ios/.

CLI

One command, one zip. Made for scripts and CI, with --dry-run and --quiet included.

Config file

tvos-assets.config.json, read by both. Auto-discovered in the project root, schema included.

When the same setting arrives from two places, the more direct one wins: the config file overrides the defaults, --set overrides the config file, and --icon, --background, and --color always win.

CLI Reference

Inputs

FlagDescriptionDefault
--icon <path>Icon PNG or SVG (transparent background). Optional when --layer-front and --layer-middle are both given: the icon is assembled from them instead.required
--background <path>Background PNG or SVGrequired
--color <hex>Splash background color, light moderequired
--dark-color <hex>Splash background color, dark modeauto-darkened
--icon-dark <path>iOS dark-appearance icon overridederived from --icon
--icon-tinted <path>iOS tinted-appearance icon overridegrayscale of --icon
--icon-border-radius <px>Icon corner radius (0 = square)0
--layer-front <path>Custom front parallax layer art
--layer-middle <path>Custom middle parallax layer art
--layer-back <path>Custom back parallax layer art

--icon <path>

Icon PNG or SVG (transparent background). Optional when --layer-front and --layer-middle are both given: the icon is assembled from them instead.

Required

--background <path>

Background PNG or SVG

Required

--color <hex>

Splash background color, light mode

Required

--dark-color <hex>

Splash background color, dark mode

Default: auto-darkened

--icon-dark <path>

iOS dark-appearance icon override

Default: derived from --icon

--icon-tinted <path>

iOS tinted-appearance icon override

Default: grayscale of --icon

--icon-border-radius <px>

Icon corner radius (0 = square)

Default: 0

--layer-front <path>

Custom front parallax layer art

--layer-middle <path>

Custom middle parallax layer art

--layer-back <path>

Custom back parallax layer art

Output

FlagDescriptionDefault
--config <path>Config JSON file./tvos-assets.config.json if present
--output <path>Directory for the zip file~/Desktop
--out-dir <path>Write Images.xcassets directly, no zip
--mode <zip|dir>Output mode; --out-dir implies dirzip
--platforms <list>Icon families: tvos, ios, or bothboth
--preview / --no-previewWrite preview.html contact sheeton for zip, off for --out-dir

--config <path>

Config JSON file

Default: ./tvos-assets.config.json if present

--output <path>

Directory for the zip file

Default: ~/Desktop

--out-dir <path>

Write Images.xcassets directly, no zip

--mode <zip|dir>

Output mode; --out-dir implies dir

Default: zip

--platforms <list>

Icon families: tvos, ios, or both

Default: both

--preview / --no-preview

Write preview.html contact sheet

Default: on for zip, off for --out-dir

Naming & selection

FlagDescriptionDefault
--brand-name <name>Name of the .brandassets bundleAppIcon
--ios-icon-name <name>Name of the iOS .appiconsetAppIcon
--splash-logo-name <name>Splash logo imageset nameSplashScreenLogo
--splash-background-name <name>Splash colorset nameSplashScreenBackground
--splash-logo-size <px>Base splash logo size200
--no-ios-iconSkip the iOS appiconset
--no-top-shelfSkip both Top Shelf imagesets
--no-splashSkip splash logo and colorset

--brand-name <name>

Name of the .brandassets bundle

Default: AppIcon

--ios-icon-name <name>

Name of the iOS .appiconset

Default: AppIcon

--splash-logo-name <name>

Splash logo imageset name

Default: SplashScreenLogo

--splash-background-name <name>

Splash colorset name

Default: SplashScreenBackground

--splash-logo-size <px>

Base splash logo size

Default: 200

--no-ios-icon

Skip the iOS appiconset

--no-top-shelf

Skip both Top Shelf imagesets

--no-splash

Skip splash logo and colorset

Advanced

FlagDescriptionDefault
--set <path=value>Override any config key by dotted path; repeatable
--dry-runReport what would be written, then exit
--print-configPrint the fully merged config as JSON
--init [path]Write a starter tvos-assets.config.json
--quietOnly errors and the final output path

--set <path=value>

Override any config key by dotted path; repeatable

--dry-run

Report what would be written, then exit

--print-config

Print the fully merged config as JSON

--init [path]

Write a starter tvos-assets.config.json

--quiet

Only errors and the final output path

Frequently Asked Questions

Do I need Xcode or design tools to generate the assets?

No. Two images and Node.js 18+ are enough. Xcode is only where the generated Images.xcassets catalog ends up.

Does it work with Expo and React Native TVOS?

Yes, that is the primary integration: the tvos-assets/plugin entry in app.json regenerates the full catalog on every expo prebuild, for both the tvOS and iOS targets. Nothing gets committed under ios/.

Can I use SVG inputs?

Yes, for the icon, the background, the iOS appearance overrides, and the parallax layers. SVGs are rasterized at the density each output needs, so one small vector stays crisp up to the 4640px Top Shelf image.

How are the iOS 18 dark and tinted icons made?

Derived automatically: dark is your icon on transparency, since iOS supplies the dark gradient behind it; tinted is a grayscale render that iOS colors with the user's accent. Both can be replaced with explicit art via --icon-dark and --icon-tinted.

How do the parallax layers work on Apple TV?

tvOS app icons are 3-layer imagestacks (Front, Middle, Back) that the home screen tilts in 3D. By default the tool renders your icon on the front and middle layers; pass separate art per layer with --layer-front and --layer-middle for true depth.

Does the generated catalog pass App Store validation?

Yes. Asset names, Contents.json structure, and dimensions follow Apple's spec, and the same layout ships in App Store-approved apps.