Hayden Griffin

PRISM

One remote for an Android TV box and an LG TV: while an LG app is on screen, the Shield's remote drives the TV, with a launcher for LG apps and quick TV settings, through Home Assistant.

PRISM on the Shield: continue on the LG, favourite LG apps and quick TV settings

One remote for your Android TV box and your LG TV. While an LG app or menu is on screen, the box's remote drives the LG: arrows, OK, Back, play/pause, rewind and fast-forward go to the TV through Home Assistant. When the box's own input is on screen, the keys stay with the box as usual.

Prism is also a launcher for the LG, so you can open LG apps, LG Home, LG Settings and a few common TV settings without picking up the LG remote.

Status: an earlier private build of this app runs every day on an NVIDIA Shield with a rooted 2021 LG C1. Version 1.0.0 (the new package name, the Remotes page and opt-in monitoring) has only run in the host tests so far. Reports either way are very welcome.

What it does

Screenshots

From an NVIDIA Shield with a 2021 LG C1.

The launcher Quick TV settings
The Prism launcher: Continue on the LG with Afterglow, favourite LG apps with their own icons, and recently used apps Quick TV settings: input, picture mode, OLED brightness, energy saving, sound mode and sleep timer, each changed with Left and Right

The "LG apps" row on Projectivy's home screen, with the Continue card first:

The LG apps row in Projectivy: Afterglow with a Continue badge, then House, Home Dashboard and Homebrew Channel

Requirements

Compatibility

Prism has been tested on one setup so far. Everything else in this table is what should happen, not what has been seen. If you try Prism on something else, a device report is the most useful thing you can send: it turns a row below from "expected" into "tested".

Box Status Notes
NVIDIA Shield TV (Android 11) ✅ Tested Shield remote; Projectivy for the home-screen rows.
Chromecast with Google TV, Google TV Streamer, onn. 4K and other Google TV boxes Expected, untested The remote should work. The rows need a launcher such as Projectivy; Google TV's own home screen doesn't show them. Newer Android versions may block the Accessibility switch for apps installed outside a store until you allow restricted settings in Prism's app info. Run the deviceidle step from Setup: these boxes stop background apps readily.
Other Android TV boxes (Xiaomi, Homatics, Nokia and others) Expected, untested Should behave like the Shield.
Fire TV on Fire OS 7 or 8 Expected, untested The remote should work; Fire OS button mappers use the same Accessibility key filtering. The home-screen rows won't show, because Fire TV's launcher doesn't display channels and newer Fire OS makes replacing it hard.
Fire TV on Vega OS (newer sticks such as the Fire TV Stick 4K Select) ❌ Not possible Vega OS isn't Android, so it can't install APKs.

Remotes. Prism only uses the standard arrow, OK, Back, Home and media keys, so it should work with any remote the box treats as a physical device: Bluetooth remotes, the box's own IR receiver, air mice and keyboards. Setup → Remotes lists each one Prism has seen, and you can turn any of them off. Some remotes are left out on purpose:

Install

Download prism-<version>.apk from Releases and sideload it:

adb connect <box address>
adb install prism-1.0.0.apk

Or copy the APK to the box and open it with a file manager. To get updates automatically, add this repository to Obtainium.

Set up

Open Prism on the box. Setup is one list; work down it.

  1. Home Assistant. Create a local, non-admin user for the box in Home Assistant, sign in as it once, and make a long-lived access token on its profile page. Enter your Home Assistant address and the token. Prism needs only to read states, subscribe to them and call entity services; admin rights are never needed.

  2. TV. Prism lists the Glasshouse TVs it finds in Home Assistant's registries. Entities are matched by their role, so renaming them in Home Assistant is fine, and Prism follows added or renamed entities on its own.

  3. The box's input (for example "SHIELD input"). Prism reads which HDMI input the box is on from the TV. Nothing switches.

  4. Remote permission. In the box's Settings → Device Preferences → Accessibility, turn on Prism. This is how it receives key presses while another app is open.

  5. Stay connected in sleep. Android's Doze cuts apps off the network while the box sleeps, and Android TV has no screen to exempt an app. Run this once from a computer (it persists):

    adb shell dumpsys deviceidle whitelist +io.github.haydengriffin.prism

    Setup shows "Off · needs adb" until it's done.

  6. Follow the TV. Turn it on, and the remote follows whatever the TV shows.

tools/configure.py can send the address and token from a computer over adb instead of typing the token with the remote. It needs a debug build (--help for details).

Remotes

Setup → Remotes lists every input device that has pressed a key since the permission was allowed, with its kind and a switch for whether it controls the LG. Until you change a switch:

The TV's own remote, passed through to the box over HDMI-CEC, is listed without a switch: it can never control the LG, because forwarding it would send the TV's presses back to the TV.

Monitoring (optional)

Setup → Monitoring can write Prism's state and version (for example lg · 1.0.0) to an input_text helper of your choice: when it connects, whenever the state changes, and every minute while the link is healthy. An automation can then warn you when the value stops changing while the box is on. It's off by default, and nothing is written until you turn it on. The Home Assistant user needs no extra rights for it.

Using it

How the routing works, including timings and what happens when the link drops, is in docs/how-it-works.md.

Privacy

Building

JDK 17 and the Android SDK command-line tools, with platform 36 and build-tools 36.0.0. There's no Gradle.

python3 tools/test.py               # host tests: routing, the link, the launcher, home-screen rows, remotes
python3 tools/build.py              # build/prism-<version>-debug.apk, signed with your Android debug key
python3 tools/build.py --release    # build/prism-<version>.apk, not debuggable, plus build/SHA256SUMS

ANDROID_SDK_ROOT and JAVA_HOME point at the SDK and JDK. A release build reads its signing key from PRISM_KEYSTORE (the keystore's path), PRISM_KEYSTORE_PASSWORD, PRISM_KEY_ALIAS and PRISM_KEY_PASSWORD. Keystores are git-ignored; never commit one.

Other tools: tests/emulator_smoke.py runs the APK on an Android emulator against a fake Home Assistant; tools/hero.py draws the README hero and screenshots from screenshots taken on the box; tools/brand.py draws the launcher icon, TV banner and social preview from the SVGs in docs/brand/ (written by tools/brand_svg.py; usage notes in its README); tools/icons.mjs regenerates the icons from Material Design Icons; tools/fonts.py regenerates res/font from the variable fonts.

Pushing a v* tag builds a signed release on GitHub Actions and attaches the APK and SHA256SUMS to a GitHub Release (see .github/workflows/release.yml).

Limitations

Support

Prism is free. If it saves you a reach for the other remote, you can buy me a coffee.

Credits

Licence

MIT, © 2026 Hayden Griffin. The bundled fonts and icons keep their own licences; see NOTICE.