Skip to content
HaydenGriffinPublic

About

One remote for your Android TV box and your LG TV: an Android TV app for rooted LG webOS TVs running Glasshouse, through Home Assistant.

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Repository files navigation

Prism on an NVIDIA Shield, captured by the TV: LG Settings open over the Prism launcher, driven by the Shield remote, beside Quick TV settings and the LG apps row in Projectivy

Prism

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.

On a PS5? Prism for PS5 is the same remote and launcher as a homebrew title for a jailbroken PS5: the DualSense drives the LG while an LG app is on screen.

Status: version 1.0.1 runs on an NVIDIA Shield with a rooted 2021 LG C1, where the pictures below were taken. Other boxes and TVs haven't been tried yet, so reports either way are very welcome.

What it does

  • Follows the TV. Prism watches the TV's active app in Home Assistant. When an LG app, LG Home or LG Settings is in front (even above the box's HDMI input), the remote's navigation keys go to the LG. When the box's input is back in front, they stay on the box.
  • Hold Back to come back. Hold Back for 0.8 s while the remote drives the LG to switch the TV to the box's input. Home does the same, and still opens the box's home screen.
  • A launcher for the LG. Your favourite LG apps as big tiles with their own LG icons, recently used apps, all apps, LG Home, LG Settings, and a "Continue on the LG" tile for the last LG app you used.
  • Quick TV settings. Input, picture mode, OLED brightness, energy saving, sound mode, sleep timer and logo dimming, changed with Left and Right.
  • Home-screen rows. Two Android TV channels, "LG apps" and "LG commands", for launchers that show apps' channels as rows (such as Projectivy).
  • The LG keyboard. While the LG's on-screen keyboard is up, the remote drives it, and a keyboard's Delete and keypad Enter go to the LG keyboard's own keys.
  • You choose the remotes. Setup → Remotes lists every input device that has pressed a key, each with a switch.

Screenshots

From an NVIDIA Shield with a 2021 LG C1. First, a screenshot the TV took of itself: LG Settings, opened from Prism's launcher, over Prism.

LG Settings on the General page, open over the Prism launcher on the Shield, with the LG Settings tile still focused underneath

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

  • An LG TV running webOS, rooted, with Glasshouse and its Home Assistant MQTT bridge. Prism uses Glasshouse's app IDs (#737), focused-window routing (#742) and icon server (#743), which are all in Glasshouse's main branch. Rewind and fast-forward need #758. LG keyboard support needs a Glasshouse change that isn't upstream yet; without it the keyboard part does nothing and everything else works.
  • Home Assistant on your local network, with the TV's Glasshouse entities enabled (Launch App, Input Source, Active App and the Remote buttons).
  • An Android TV or Google TV box, Android 8 or later. Tested on an NVIDIA Shield (Android 11); see Compatibility for other boxes.
  • For the home-screen rows, a launcher that shows apps' channels as rows, such as Projectivy. The stock Google TV home screen doesn't.

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:

  • The TV's own remote over HDMI-CEC never controls the TV through Prism, because its presses would loop back.
  • Phone remote apps and adb are off until you turn them on in Setup → Remotes.
  • Volume, power and the mic button are always left to the box.
  • Buttons for particular apps (Netflix, YouTube and similar) do whatever the box normally does.

Install

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

adb connect <box address>
adb install prism-1.0.1.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.

Prism stays open behind whatever it opens on the LG, so it is still there under LG Settings and other LG menus that cover only part of the screen. To have it close instead, turn on Close after opening on the LG.

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:

  • Physical remotes (Bluetooth, USB, IR receivers) control the LG.
  • Virtual devices are off. Phone remote apps and adb shell input show up as virtual; turn one on to drive the LG from your phone.

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

  • Keys. With an LG app or menu in front, arrows, OK, Back, play/pause, rewind and fast-forward go to the LG. Home, power, volume and the mic button always stay with the box (for voice search on the LG, use the LG remote's own voice button).
  • Going back to the box. Hold Back for 0.8 s, or press Home.
  • The launcher. OK on a tile opens it on the LG, and the remote follows. Favourites are chosen in Setup → Favourites, in any order. The header's live line says where the remote is: "On the LG · BBC iPlayer", "On the SHIELD" (the box's own name, from Android's settings), "The TV is off", or the step that's failing.
  • Quick TV settings. Left and Right step a value; it's sent after half a second, or when you leave the row.
  • Home-screen rows. "LG apps" has the Continue card and your favourites; "LG commands" has LG Home, LG Settings, Quick TV settings and one "Switch to" card for each input the TV has used lately, under the TV's own name for it (Setup can hide this row). Projectivy keeps new channels hidden: open its settings (the gear at the top), then Edit channels → Prism, pick each row and turn on Visible. The rows appear at the bottom of the home screen (checked on Projectivy 4.72).
  • The LG keyboard. When the LG asks for text, the remote drives its on-screen keyboard. A keyboard's Delete and keypad Enter press the LG keyboard's own keys.
  • Shortcuts for a button mapper. Prism doesn't remap buttons itself, but a button mapper such as TvQuickActions can open its activities: .OpenLgHome, .OpenLgSettings, .OpenQuickSettings, or .ShortcutActivity with --es target app:<LG app id> (or input:<input name>, which switches the TV's input).
  • On-TV cue. If Glasshouse's Screen Notification entity is enabled in Home Assistant, the first press of each LG session shows "Remote on the LG · hold Back for the SHIELD" on the TV.

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

Privacy

  • Prism uses accessibility for key filtering only. It can't read the screen, anything typed, or the microphone.
  • It talks only to the Home Assistant you configure, and the TV's icon server, on your local network. No analytics, no other servers.
  • The token is encrypted with a non-exportable Android Keystore key, excluded from backups and never logged. The page where you type it blocks screenshots and the recents thumbnail.
  • The home-screen card images are served read-only to the launcher, and contain only app names and icons.

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 and one the TV took of itself; 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

  • Tested on an NVIDIA Shield only; see Compatibility.
  • Prism controls one LG TV, and only one that runs Glasshouse. Stock webOS isn't supported.
  • Every press is a Home Assistant service call, so how fast it feels depends on your network and Home Assistant. Held arrows repeat at most every 150 ms.
  • Volume, power and the mic button are never taken. Use the box's own CEC volume, or the LG remote.
  • The keyboard needs a Glasshouse change that isn't upstream yet.
  • The steps for showing the rows in Projectivy were checked on version 4.72 only.

Support

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

Credits

  • Glasshouse by Rory Gallagher does the hard part: it runs on the TV and puts it in Home Assistant.
  • Fonts: Atkinson Hyperlegible Next (Braille Institute of America) and Lexend (The Lexend Project Authors), SIL Open Font License 1.1.
  • Icons: Material Design Icons, Apache License 2.0.

Licence

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

About

One remote for your Android TV box and your LG TV: an Android TV app for rooted LG webOS TVs running Glasshouse, through Home Assistant.

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Sponsor this project

Packages

Contributors

Languages