Skip to content

Releases: fivefold3/own-your-glass

v1.6.0

Choose a tag to compare

@fivefold3 fivefold3 released this 18 Oct 06:24

Install

Needs a rooted TV with Homebrew Channel (root status OK).

Homebrew Channel: Settings → Add repository, enter
https://raw.githubusercontent.com/fivefold3/webos-homebrew-repo/main/repo.json,
then install Own Your Glass from the list. Updates show up there too.

Manually over SSH: turn on the SSH server in Homebrew Channel's settings, download org.ownyourglass.app_1.6.0_all.ipk below, then

scp org.ownyourglass.app_1.6.0_all.ipk root@<tv-ip>:/tmp/oyg.ipk
ssh root@<tv-ip> "luna-send -i -f luna://com.webos.appInstallService/dev/install '{\"id\":\"com.ares.defaultName\",\"ipkUrl\":\"/tmp/oyg.ipk\",\"subscribe\":true}' </dev/null"

Once it prints "state": "installed", press Ctrl-C and remove /tmp/oyg.ipk.

Installing changes nothing. Open the app, pick a protection level and press Own the glass. Everything is undone by Give the glass back or by uninstalling the app.

Upgrading from 1.5.0: install over the top and press Own the glass. The new protections join your preset at once. A Custom selection is kept, rewritten as its changes from its base preset, so the new protections that preset carries reach it too; if your Custom selection had Phone apps on, DIAL stays blocked, and if it had Phone apps off on a Strict or Lockdown base, DIAL stays open.

What's new in 1.6.0

New protections

  • Screenshot shield (every preset). The TV keeps a picture of the app on screen for Home's Recents row in a folder every app can list; it is now root-only, and Recents keeps its pictures. A paired phone app could ask the TV for a screenshot three ways; the calls are taken out of the phone API, and everything else phone apps do keeps working (verified on the C5: the phone app still finds, pairs with and controls the TV). A phone that used the TV before the shield went on keeps the calls until a restart; status says so.
  • Web-app debugger (every preset). Every LG TV runs the web-app debugger on port 9998 with no password, Developer Mode or not: anyone on your network could attach to the open web app, Homebrew Channel included, and run code in it. The port is closed to the network and stays reachable from the TV itself, so ares-inspect and ssh -L 9998:localhost:9998 still work.
  • Network printing port (every preset). The TV listens on port 515 for print jobs from anyone on your network, with no login; nothing on the TV prints through it. Closed on IPv4 and IPv6.
  • Phone apps starting TV apps (DIAL) is its own option (Strict and Lockdown). DIAL lets any device on your network start apps on the TV and turn it off, without asking. Its ports are closed by a firewall rule as well as the service being blocked, so the block holds when DIAL loaded before Own Your Glass at start-up. With it on, Spotify and other phone apps can cast only to an app already open on the TV; the Strict description says so.
  • The "Who.Where.What?" consent (recognition of people, places and products on screen) is declined with the other tracking consents.

Fixes

  • Turning Phone apps off again asks for the restart LG's phone server needs in any boot, not only the one in which it was turned off. Before, undoing the option after a restart left phones unable to find the TV, with no notice.
  • On BusyBox 1.29 to 1.31 (webOS 5.6, 6.5 and a 2023 C3 on 8.3) every system setting Own Your Glass writes failed to build, because of an awk construct those versions misread. Fixed.
  • The firewall chains (LAN firewall, debugger, DIAL) are built complete under a new name and swapped in, so re-applying, or adding a device with oyg lan allow, never opens a port in between.
  • The screen-capture shield keeps its root-only files in /run, which no app sandbox can write, and trusts nothing it finds in /tmp: a link planted at a shielded path is left alone and reported. Status checks that OLED care is still getting its screen samples through the shield.
  • A setting the settings service refuses to put back stays recorded, is tried again at the next undo, and status says so instead of reporting the option as restored.
  • A Custom selection is saved as its changes from a base preset. Saving every option froze a protection that was not yet verified at the time as off for good.
  • The uninstall's last message says what needs a restart.

Docs

  • docs/RESEARCH.md: what the screen shields are built on (OLED pixel care's screen samples, Home's Recents pictures, the phone API's screenshot calls), the open ports a C5 answers on the LAN, and how DIAL behaved from boot to boot. docs/COMPATIBILITY.md: the print server per webOS generation.

Known limits

  • Verified on webOS 10.3 only; the other releases are surveyed, not run. HbbTV options are untested (no broadcast reception on the reference TV).
  • The firewall is IPv4 only (these kernels have no IPv6 netfilter). The LAN firewall option turns IPv6 off; the debugger and DIAL options warn when the TV has an IPv6 address they cannot cover.

v1.5.0

Choose a tag to compare

@fivefold3 fivefold3 released this 27 Sep 02:15

Install

Needs a rooted TV with Homebrew Channel (root status OK).

Homebrew Channel: Settings → Add repository, enter
https://raw.githubusercontent.com/fivefold3/webos-homebrew-repo/main/repo.json,
then install Own Your Glass from the list. Updates show up there too.

Manually over SSH: turn on the SSH server in Homebrew Channel's settings, download org.ownyourglass.app_1.5.0_all.ipk below, then

scp org.ownyourglass.app_1.5.0_all.ipk root@<tv-ip>:/tmp/oyg.ipk
ssh root@<tv-ip> "luna-send -i -f luna://com.webos.appInstallService/dev/install '{\"id\":\"com.ares.defaultName\",\"ipkUrl\":\"/tmp/oyg.ipk\",\"subscribe\":true}' </dev/null"

Once it prints "state": "installed", press Ctrl-C and remove /tmp/oyg.ipk.

Installing changes nothing. Open the app, pick a protection level and press Own the glass. Everything is undone by Give the glass back or by uninstalling the app.

Upgrading from 1.2: install over the top. The first apply moves the old records to the new options and selects Recommended; nothing is undone and redone on the way.

What's new in 1.5.0

Built and verified on a 2025 LG OLED C5 (webOS 10.3.1). What it knows about other TVs comes from 25 official LG firmware images (webOS 5.6 to 11.2; OLED, QNED and UHD; AU, EU, SG, North America and Korea): see docs/COMPATIBILITY.md.

On a webOS release other than 10.3 LG's always-on logging and cloud services are left running by default, because a stopped one can make the TV's own screens wait, and the app says so. Nothing they collect gets out (their upload routes are cut), but they keep collecting on the TV. Settings > Untested protections applies them anyway. If a screen stops responding, Give the glass back or turn the switch off; if the TV does not start properly twice in a row, re-apply switches itself off and the TV comes up stock.

Help verify your TV's release: turn Untested protections on, use the TV for a day (Settings, Date & Time, Home, the Content Store, your casting and phone apps), then Settings > Generate a TV report > Copy to USB storage and open an issue with the report attached (it holds no identifiers) and what worked or broke. Verified releases are added to the knowledge base and stop needing the switch.

Presets

  • Recommended: blocks tracking and ads; keeps AirPlay, Chromecast, phone apps, LG Channels, HbbTV, the Content Store and LG sign-in working.
  • Strict: also turns off AirPlay, Google Cast, phone control, Screen Share, LG Channels and LG's AI features, closes the TV to your network (SSH included) and blocks your LG account.
  • Lockdown: also disables some LG system services; Settings gets slow, automatic time and time zone, search, Universal Control and app installs stop working. The app asks first.
  • Custom: every option on or off, each with one line on what it does and what it breaks.

What the app does now

  • Says whether the glass is owned by you or by LG, and when something needs you: Restart required (with Restart now), LG Account signed in (with Sign out or Remove account), Not re-applied at start-up.
  • Clear collected data: ad caches, upload spools, voice transcripts and request dumps, the Home Hub's cached account token, analytics cookies; resets the advertising ID (or keeps it at zeros with the Opt-out option).
  • Generate a TV report: model, software, which services exist, no identifiers; Copy to USB storage.
  • Re-apply at start-up, Notifications and Untested protections switches. Notifications and Untested protections are off by default.
  • Give the glass back holds until you press Own the glass again. Restore and uninstall leaves no trace of the app after a restart.

Under the hood

  • Every service, hostname, gateway route, setting and app is in a knowledge base (kb/), with what it does, what it breaks and which webOS releases have it; the safety rules are checked in CI.
  • LG's own launch block list backs the binds, so app jails and services on the app partition are covered too.
  • LG's gateway is cut per route (its routing table is rewritten and bound read-only on every mount), which is the only lever left on webOS 11, where nearly every route shares one host with sign-in and the clock.
  • Consents go through LG's settings service, so they hold and restore exactly.
  • Region-coded hostnames cover every LG region (aic, eic, kic, cic, ruc); country-coded ones use your TV's country, or every country LG serves until it is known.
  • The crash-loop breaker trips only on two unconfirmed starts in a row, and the app can turn re-apply back on.
  • Works without python3 (webOS 5 and 6).
  • Four services earlier versions blocked are released: they are local features (screen-time limits, Always Ready, the NPU arbiter behind AI Picture and AI Sound, WOWCAST speakers).
  • The toolkit logs no MAC, serial, IP, SSID, account or device ID; its state is root-only; nothing it puts in /tmp has a guessable name.

Docs

  • docs/RESEARCH.md: what was learned and how it was verified. docs/COMPATIBILITY.md: every service per webOS generation. docs/DESIGN.md: how the option engine, the gateway rewrite, the boot hook and the undo work.
  • Most of this release was written with AI assistance (Claude), directed, reviewed and tested on a real TV by the author; the README says so up front.

Known limits

  • Verified on webOS 10.3 only; the other releases are surveyed, not run. HbbTV options are untested (no broadcast reception on the reference TV).
  • The boot hook runs 10 to 30 s after LG's daemons start; what they send in that window is not stopped. A router-level DNS block covers it.
  • Not a defence against an attacker who already has root. Firmware updates are not blocked (Homebrew Channel has that toggle).

v1.2.4

Choose a tag to compare

@github-actions github-actions released this 25 Sep 15:15
Own Your Glass 1.2.4

- New sdx module: LG's network gateway keeps working for the Content Store,
  AirPlay, Settings and automatic time, but its logging, beacon, nudge, shop
  and recommendation endpoints are routed to nowhere.
- The hostname sinkhole now reads the gateway's hosts from the TV itself, so
  it fits any region.
- telemetry also stops service-logger, user-context-manager, ocpservice,
  sdp-server-notice and ftms.
- Jailed daemons (ThinQ AI, Alexa, voice performer) are blocked too, and
  status reports them correctly.
- voiceconductor and objectdetection are left running: blocking
  voiceconductor hung the Date & Time settings page, and objectdetection
  sends nothing.
- The Homebrew Channel service tree is locked recursively; the capture fix
  no longer leaves the last frame readable inside app sandboxes.
- cloud, sdx and network are on by default.
- Every service description re-checked on hardware; new service table in
  the README. Faster status and apply.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

v1.2.3

Choose a tag to compare

@fivefold3 fivefold3 released this 23 Sep 07:49

Privacy hardening for rooted LG webOS TVs, as a Homebrew Channel app. Verified on a 2025 LG OLED (C5, webOS 10.3.1).

What it does

Stops the ACR / ad-overlay / ad-ID machinery, the log and crash uploaders, LG remote support and the microphone pipelines at the source (services stopped, binaries bound to /dev/null), declines every tracking consent in every store, hides the ad and demo apps, keeps the terms prompts from being raised, and can clear what was already collected (cached ads, ad logs, queued uploads, voice transcripts) and reset the advertising ID. Everything is reversible from the app, and uninstalling the app restores the TV on the next boot.

Install

You need a rooted TV with Homebrew Channel (https://www.webosbrew.org/rooting/).

Over SSH (no LG SDK): download org.ownyourglass.app_1.2.3_all.ipk, then from a clone of this repository:

tools/deploy.sh root@<tv-ip> --no-build --launch

On the TV itself: copy the ipk to /tmp and run

luna-send -i -f luna://com.webos.appInstallService/dev/install '{"id":"com.ares.defaultName","ipkUrl":"/tmp/org.ownyourglass.app_1.2.3_all.ipk","subscribe":true}' </dev/null

From a Homebrew Channel repository: a repository file's package entry can point its manifestUrl at this release's manifest (org.ownyourglass.app.manifest.json); the release must be publicly reachable for the TV to fetch it.

Then open Own Your Glass and press Own the glass. Full details in docs/HOMEBREW.md.

Assets

  • org.ownyourglass.app_1.2.3_all.ipk — the app (sha256 in the manifest)
  • org.ownyourglass.app.manifest.json — webosbrew manifest (ipkUrl + sha256)