From b137bf9eda42469dfce060db256ac1b9deeb49d1 Mon Sep 17 00:00:00 2001
From: Rene Kievits
Date: Sat, 5 Sep 2026 22:27:44 +0200
Subject: [PATCH] init commit
---
.github/workflows/release.yml | 57 +
.gitignore | 5 +
LICENSE | 21 +
README.md | 144 +
app/index.html | 46 +
app/index.js | 407 ++
app/style.css | 234 ++
appinfo.json | 18 +
assets/icon.png | Bin 0 -> 4800 bytes
assets/icon.svg | 11 +
assets/icon400.png | Bin 0 -> 15536 bytes
assets/largeIcon.png | Bin 0 -> 7795 bytes
docs/description.html | 23 +
docs/screenshot.png | Bin 0 -> 203694 bytes
package-lock.json | 6295 ++++++++++++++++++++++++++++++
package.json | 20 +
service/data/lg-update-hosts.txt | 26 +
service/package.json | 6 +
service/service.js | 871 +++++
tools/build.js | 83 +
tools/gen-manifest.js | 104 +
21 files changed, 8371 insertions(+)
create mode 100644 .github/workflows/release.yml
create mode 100644 .gitignore
create mode 100644 LICENSE
create mode 100644 README.md
create mode 100644 app/index.html
create mode 100644 app/index.js
create mode 100644 app/style.css
create mode 100644 appinfo.json
create mode 100644 assets/icon.png
create mode 100644 assets/icon.svg
create mode 100644 assets/icon400.png
create mode 100644 assets/largeIcon.png
create mode 100644 docs/description.html
create mode 100644 docs/screenshot.png
create mode 100644 package-lock.json
create mode 100644 package.json
create mode 100644 service/data/lg-update-hosts.txt
create mode 100644 service/package.json
create mode 100644 service/service.js
create mode 100644 tools/build.js
create mode 100644 tools/gen-manifest.js
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
new file mode 100644
index 0000000..2f082ed
--- /dev/null
+++ b/.github/workflows/release.yml
@@ -0,0 +1,57 @@
+name: Build
+
+on:
+ push:
+ branches: ['**']
+ tags: ['v*']
+ pull_request:
+ workflow_dispatch:
+
+jobs:
+ build:
+ runs-on: ubuntu-latest
+
+ steps:
+ - uses: actions/checkout@v4
+
+ - uses: actions/setup-node@v4
+ with:
+ node-version: '20'
+
+ - name: Install ares CLI
+ run: npm install
+
+ - name: Build
+ run: npm run build
+
+ - name: Package IPK
+ run: npm run package
+
+ - name: Generate manifest and repository index
+ run: npm run manifest
+
+ - name: Upload build artifacts
+ uses: actions/upload-artifact@v4
+ with:
+ name: lg-update-blocker
+ path: dist/*
+
+ # Tag a commit with v (matching package.json) to publish a
+ # release. The repository URL for the Homebrew Channel stays stable:
+ # https://github.com///releases/latest/download/apps.json
+ - name: Release
+ if: startsWith(github.ref, 'refs/tags/v')
+ uses: softprops/action-gh-release@v2
+ with:
+ files: dist/*
+ generate_release_notes: true
+ body: |
+ Install through the Homebrew Channel by adding this repository once
+ (Homebrew Channel → Settings → Add repository):
+
+ ```
+ https://github.com/${{ github.repository }}/releases/latest/download/apps.json
+ ```
+
+ Or install the `.ipk` below manually with
+ `ares-install .ipk`.
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..6d2a015
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,5 @@
+node_modules/
+build/
+dist/
+*.ipk
+.DS_Store
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..8d603ab
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2026 LG Update Blocker contributors
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..b35585c
--- /dev/null
+++ b/README.md
@@ -0,0 +1,144 @@
+
+
+
+
+# LG Update Blocker
+
+A webOS homebrew app that gets rid of the *"a new software version is
+available"* popup LG shows on every boot — without touching the firmware
+itself, and fully reversible.
+
+Built for a rooted **LG CX (webOS 5)**, but nothing in it is model specific: it
+only ever probes for things and acts on what it actually finds on your TV.
+
+
+
+## Why the popup keeps coming back
+
+The Homebrew Channel's own *Block system updates* toggle only writes four
+hostnames into `/etc/hosts` at boot. That is not enough in practice:
+
+* it misses several update hostnames (`nsu`, `*-ssl`, the CDN aliases),
+* it does nothing about a firmware image the TV **already downloaded** — a
+ staged update keeps prompting even when the update servers are unreachable,
+* it leaves the auto-update settings and the update services alone.
+
+This app covers all of that, and re-applies everything on each boot (webOS
+resets `/`, `/tmp` and the mount namespace on every start).
+
+## Protection layers
+
+| Layer | What it does | Default |
+| --- | --- | --- |
+| **Block LG update servers** | Points `snu`/`su`/`nsu.lge.com`, their TLS variants, the `-dev` fallbacks and the CDN aliases at `127.0.0.1` in `/etc/hosts` | on |
+| **Delete staged firmware** | Wipes the update image staged in `/mnt/lg/cmn_data/swupdate` | on |
+| **Lock the staging folder** | Bind-mounts an empty read-only directory over it, so nothing can be staged again | off |
+| **Turn off auto-update settings** | Reads every `com.webos.settingsservice` category, switches off each update-related key it finds, and remembers the original values | on |
+| **Stop update services at boot** | Stops the update-related upstart jobs discovered in `/etc/init` (advanced) | off |
+
+Every layer is undone by **Remove protection**, which also restores the
+settings from the backup it made.
+
+## Requirements
+
+* A rooted webOS TV with the [Homebrew Channel](https://github.com/webosbrew/webos-homebrew-channel)
+ installed and its root status showing **ok**.
+* The app's own service needs root. On first launch it asks the Homebrew
+ Channel to elevate it (`elevateService`, falling back to running
+ `elevate-service` through `exec`), then restarts itself. The header badge
+ turns green when it worked.
+
+## Install
+
+### Through the Homebrew Channel (repository)
+
+Add the repository once — *Homebrew Channel → Settings → Add repository*:
+
+```
+https://github.com///releases/latest/download/apps.json
+```
+
+The app then shows up in the Homebrew Channel list, and every new release you
+tag is picked up automatically (that URL always points at the newest release).
+
+### Manually
+
+Download the `.ipk` from the release and:
+
+```sh
+ares-install com.rkievits.lgupdateblocker_1.0.0_all.ipk
+ares-launch com.rkievits.lgupdateblocker
+```
+
+## Using it
+
+Navigate with ▲▼, select with OK, leave with BACK.
+
+1. Check the layers you want (the defaults are a good start).
+2. **Apply protection** — the log pane shows exactly what was changed.
+3. Reboot and confirm the popup is gone.
+
+Other buttons: **Purge staged update** (wipe a downloaded image right now),
+**Remove protection** (undo everything), **Refresh status**, and
+**Diagnostics** (dumps OS info, mounts, discovered settings, the tail of
+`/etc/hosts` and the boot-hook log — handy for a bug report).
+
+## What it touches
+
+| Path | Purpose |
+| --- | --- |
+| `/etc/hosts` | Blocked hostnames, between `# >>> lg-update-blocker >>>` markers. Bind-mounted from `/tmp/lgupdateblocker-hosts` because `/` is read-only |
+| `/var/lib/webosbrew/init.d/lgupdateblocker` | Boot hook, run by the Homebrew Channel startup script; re-applies the enabled layers |
+| `/var/lib/webosbrew/lgupdateblocker/` | `config.json`, `hosts.txt`, `settings-backup.json`, `boot.log` |
+| `/mnt/lg/cmn_data/swupdate` | Staged firmware, emptied (and optionally locked) |
+
+Nothing is written to system partitions, and no LG binaries are patched or
+replaced.
+
+## Troubleshooting
+
+* **Badge says "no root"** — open the Homebrew Channel, verify *Root status* is
+ `ok`, then relaunch this app. If the Homebrew Channel itself is unelevated,
+ fix that first (its Settings screen has a button for it).
+* **Popup still appears after a reboot** — run *Diagnostics* and look at the
+ boot-hook log at the bottom. It records, per boot, whether the hosts entries
+ were added, what was purged and which jobs were stopped.
+* **Belt and braces** — a hosts file only helps if the TV uses DNS. Blocking
+ `snu.lge.com`, `su.lge.com` and `nsu.lge.com` on your router or Pi-hole as
+ well is the one measure that also survives a factory reset.
+* **Forced *app* updates** (the *"You must update this app to launch it"*
+ dialog) are a different mechanism — that is what
+ [LG App Update Blocker](https://github.com/dr0dr1dr2dr3/lgappupdateblocker)
+ is for. This app deliberately leaves the `lgtvsdp.com` hosts alone, since
+ blocking those also breaks the store and several other services.
+
+## Building
+
+No bundler, no runtime dependencies — `tools/build.js` copies `app/` and
+`service/` into `build/` and substitutes the app id and version.
+
+```sh
+npm install # only the ares CLI
+npm run dist # build + package + manifest, output in dist/
+npm run deploy # ares-install the resulting ipk
+```
+
+## Releasing
+
+`.github/workflows/release.yml` builds on every push. Tag a commit `v`
+(matching `version` in `package.json`) and the workflow additionally publishes a
+release containing:
+
+* `com.rkievits.lgupdateblocker__all.ipk`
+* `com.rkievits.lgupdateblocker.manifest.json` — Homebrew Channel manifest,
+ with the absolute ipk URL, its sha256 and size
+* `apps.json` — the one-package repository index used by the repository URL above
+* `description.html` — the long description shown in the Homebrew Channel
+
+The app id lives in exactly one place: the `name` field of `package.json`.
+Change it there and everything (appinfo, service name, Luna URIs, manifest)
+follows.
+
+## License
+
+MIT
diff --git a/app/index.html b/app/index.html
new file mode 100644
index 0000000..a130c18
--- /dev/null
+++ b/app/index.html
@@ -0,0 +1,46 @@
+
+
+
+
+
+ __TITLE__
+
+
+
+
+
+
+
+
+ Protection layers
+
+ Actions
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/index.js b/app/index.js
new file mode 100644
index 0000000..6bdde0f
--- /dev/null
+++ b/app/index.js
@@ -0,0 +1,407 @@
+/**
+ * LG Update Blocker - frontend.
+ *
+ * No frameworks and no build step: Luna calls go straight through
+ * PalmServiceBridge, which every webOS webapp gets injected for free.
+ */
+(function () {
+ 'use strict';
+
+ var SERVICE = 'luna://__SERVICE_ID__';
+ var HBCHANNEL = 'luna://org.webosbrew.hbchannel.service';
+ var HBCHANNEL_ELEVATE =
+ '/media/developer/apps/usr/palm/services/org.webosbrew.hbchannel.service/elevate-service';
+
+ var TOGGLES = [
+ {
+ key: 'blockHosts',
+ title: 'Block LG update servers',
+ desc: 'Points snu/su/nsu.lge.com at 127.0.0.1 in /etc/hosts, re-applied on every boot'
+ },
+ {
+ key: 'purgeCache',
+ title: 'Delete staged firmware',
+ desc: 'Wipes an already downloaded update - the usual reason the popup keeps returning'
+ },
+ {
+ key: 'lockCache',
+ title: 'Lock the staging folder',
+ desc: 'Mounts an empty read-only folder over it so no update can be staged again'
+ },
+ {
+ key: 'disableSettings',
+ title: 'Turn off auto-update settings',
+ desc: 'Switches off every update-related key com.webos.settingsservice exposes'
+ },
+ {
+ key: 'stopServices',
+ title: 'Stop update services at boot',
+ desc: 'Advanced: stops the update upstart jobs found on this TV after every boot'
+ }
+ ];
+
+ var ACTIONS = [
+ { key: 'apply', label: 'Apply protection', primary: true },
+ { key: 'purge', label: 'Purge staged update' },
+ { key: 'revert', label: 'Remove protection' },
+ { key: 'refresh', label: 'Refresh status' },
+ { key: 'diagnostics', label: 'Diagnostics' }
+ ];
+
+ var config = {
+ blockHosts: true,
+ purgeCache: true,
+ lockCache: false,
+ disableSettings: true,
+ stopServices: false
+ };
+
+ var focusables = [];
+ var focusIndex = 0;
+ var busy = false;
+ var bridges = [];
+
+ /* ----------------------------------------------------------- luna calls */
+
+ function luna(uri, params, onSuccess, onFailure) {
+ if (typeof PalmServiceBridge === 'undefined') {
+ if (onFailure) onFailure({ returnValue: false, errorText: 'no Luna bus (not running on a TV)' });
+ return;
+ }
+ var bridge = new PalmServiceBridge();
+ bridges.push(bridge);
+ bridge.onservicecallback = function (raw) {
+ var index = bridges.indexOf(bridge);
+ if (index !== -1) bridges.splice(index, 1);
+ var response;
+ try {
+ response = JSON.parse(raw);
+ } catch (err) {
+ response = { returnValue: false, errorText: 'malformed response: ' + raw };
+ }
+ if (response.returnValue === false || response.errorText) {
+ if (onFailure) onFailure(response);
+ } else if (onSuccess) {
+ onSuccess(response);
+ }
+ };
+ bridge.call(uri, JSON.stringify(params || {}));
+ }
+
+ /* ------------------------------------------------------------------- ui */
+
+ function el(id) {
+ return document.getElementById(id);
+ }
+
+ function log(text) {
+ var pane = el('log');
+ var stamp = new Date().toTimeString().slice(0, 8);
+ pane.textContent += '[' + stamp + '] ' + text + '\n';
+ pane.scrollTop = pane.scrollHeight;
+ }
+
+ function logLines(lines) {
+ (lines || []).forEach(function (line) {
+ log(line);
+ });
+ }
+
+ function setHint(text, isBusy) {
+ var hint = el('hint');
+ hint.textContent = text || '';
+ hint.className = isBusy ? 'busy' : '';
+ }
+
+ function setBusy(state, text) {
+ busy = state;
+ setHint(text || (state ? 'working…' : ''), state);
+ }
+
+ function bytes(value) {
+ if (!value) return '0 B';
+ var units = ['B', 'kB', 'MB', 'GB'];
+ var index = 0;
+ var size = value;
+ while (size >= 1024 && index < units.length - 1) {
+ size /= 1024;
+ index += 1;
+ }
+ return (index === 0 ? size : size.toFixed(1)) + ' ' + units[index];
+ }
+
+ function buildUi() {
+ var toggles = el('toggles');
+ TOGGLES.forEach(function (toggle) {
+ var row = document.createElement('div');
+ row.className = 'row';
+ row.innerHTML =
+ '' +
+ '
';
+ row.querySelector('.title').textContent = toggle.title;
+ row.querySelector('.desc').textContent = toggle.desc;
+ row.dataset.toggle = toggle.key;
+ row.onActivate = function () {
+ config[toggle.key] = !config[toggle.key];
+ renderToggles();
+ log((config[toggle.key] ? 'enabled: ' : 'disabled: ') + toggle.title +
+ ' (press Apply protection to write it to the TV)');
+ };
+ toggles.appendChild(row);
+ focusables.push(row);
+ });
+
+ var actions = el('actions');
+ ACTIONS.forEach(function (action) {
+ var button = document.createElement('div');
+ button.className = 'button' + (action.primary ? ' primary' : '');
+ button.textContent = action.label;
+ button.onActivate = function () {
+ runAction(action.key);
+ };
+ actions.appendChild(button);
+ focusables.push(button);
+ });
+
+ renderToggles();
+ renderFocus();
+ }
+
+ function renderToggles() {
+ TOGGLES.forEach(function (toggle, index) {
+ var row = focusables[index];
+ var on = !!config[toggle.key];
+ row.className = 'row' + (on ? ' on' : '') + (index === focusIndex ? ' focused' : '');
+ row.querySelector('.state').textContent = on ? 'ON' : 'OFF';
+ });
+ }
+
+ function renderFocus() {
+ focusables.forEach(function (node, index) {
+ var focused = index === focusIndex;
+ if (focused) {
+ if (node.className.indexOf('focused') === -1) node.className += ' focused';
+ if (node.scrollIntoView) node.scrollIntoView(false);
+ } else {
+ node.className = node.className.replace(/\s*focused/g, '');
+ }
+ });
+ }
+
+ function move(delta) {
+ focusIndex = (focusIndex + delta + focusables.length) % focusables.length;
+ renderFocus();
+ }
+
+ function badge(id, text, kind) {
+ var node = el(id);
+ node.textContent = text;
+ node.className = 'badge' + (kind ? ' badge-' + kind : '');
+ }
+
+ function renderStatus(status) {
+ var list = el('status');
+ list.innerHTML = '';
+
+ function row(label, value) {
+ var wrapper = document.createElement('div');
+ var dt = document.createElement('dt');
+ var dd = document.createElement('dd');
+ dt.textContent = label;
+ dd.textContent = value;
+ wrapper.appendChild(dt);
+ wrapper.appendChild(dd);
+ list.appendChild(wrapper);
+ }
+
+ var staged = 0;
+ var stagedDirs = 0;
+ var locked = 0;
+ (status.cache || []).forEach(function (entry) {
+ stagedDirs += 1;
+ staged += entry.bytes || 0;
+ if (entry.locked) locked += 1;
+ });
+
+ row('Service user', status.root ? 'root' : 'uid ' + status.uid + ' (not elevated)');
+ row('Hosts entries', status.hosts.blockedDomains + ' / ' + status.hosts.totalDomains +
+ (status.hosts.bindMounted ? ' (bind-mounted)' : ''));
+ row('Staging folders', stagedDirs ? stagedDirs + ' found' : 'none on this TV');
+ row('Staged firmware', stagedDirs ? bytes(staged) : '-');
+ row('Staging locked', stagedDirs ? locked + ' / ' + stagedDirs : '-');
+ row('Update jobs found', (status.jobs || []).length ? status.jobs.join(', ') : 'none');
+ row('Boot hook', status.bootHook.installed ? 'installed' : 'not installed');
+
+ var settings = status.settings || [];
+ if (settings.length) {
+ settings.forEach(function (entry) {
+ row(entry.category + '/' + entry.key, JSON.stringify(entry.value));
+ });
+ } else {
+ row('Update settings', 'none exposed');
+ }
+
+ badge('badge-root', status.root ? 'root' : 'no root', status.root ? 'ok' : 'bad');
+ badge('badge-version', 'v' + status.version);
+
+ if (status.config) {
+ Object.keys(config).forEach(function (key) {
+ if (typeof status.config[key] === 'boolean') config[key] = status.config[key];
+ });
+ renderToggles();
+ }
+ }
+
+ /* -------------------------------------------------------------- actions */
+
+ function refresh(onDone) {
+ luna(SERVICE + '/status', {}, function (status) {
+ renderStatus(status);
+ if (onDone) onDone(status);
+ }, function (err) {
+ log('status failed: ' + (err.errorText || JSON.stringify(err)));
+ badge('badge-root', 'service error', 'bad');
+ if (onDone) onDone(null);
+ });
+ }
+
+ function runAction(key) {
+ if (busy) return;
+
+ if (key === 'refresh') {
+ setBusy(true, 'refreshing…');
+ refresh(function () {
+ setBusy(false);
+ log('status refreshed');
+ });
+ return;
+ }
+
+ if (key === 'diagnostics') {
+ setBusy(true, 'collecting diagnostics…');
+ luna(SERVICE + '/diagnostics', {}, function (res) {
+ setBusy(false);
+ log('--- diagnostics ---');
+ log('os: ' + JSON.stringify(res.osInfo));
+ log('mounts: ' + JSON.stringify(res.mounts));
+ log('settings: ' + JSON.stringify(res.settings));
+ log('hosts (tail):\n' + res.hostsFile);
+ log('boot hook log (tail):\n' + res.bootLog);
+ log('--- end ---');
+ }, function (err) {
+ setBusy(false);
+ log('diagnostics failed: ' + (err.errorText || JSON.stringify(err)));
+ });
+ return;
+ }
+
+ var uri = SERVICE + '/' + key;
+ var params = key === 'apply' ? config : {};
+ setBusy(true, key === 'revert' ? 'removing…' : 'applying…');
+ luna(uri, params, function (res) {
+ setBusy(false);
+ logLines(res.log);
+ if (res.status) renderStatus(res.status);
+ else refresh();
+ }, function (err) {
+ setBusy(false);
+ logLines(err.log);
+ log('failed: ' + (err.errorText || JSON.stringify(err)));
+ });
+ }
+
+ /* ------------------------------------------------------------ elevation */
+
+ function elevate(onDone) {
+ log('service is not running as root, asking the Homebrew Channel to elevate it…');
+
+ function afterElevation() {
+ // The running instance keeps its old (unprivileged) process; quitting it
+ // makes the bus start a fresh, elevated one on the next call.
+ luna(SERVICE + '/quit', {}, function () {
+ window.setTimeout(recheck, 2500);
+ }, function () {
+ window.setTimeout(recheck, 2500);
+ });
+ }
+
+ function recheck() {
+ refresh(function (status) {
+ if (status && status.root) {
+ log('service elevated - ready');
+ } else {
+ log('still not elevated. Open the Homebrew Channel, make sure "Root status" says ' +
+ '"ok", then relaunch this app.');
+ }
+ setBusy(false);
+ if (onDone) onDone();
+ });
+ }
+
+ luna(HBCHANNEL + '/elevateService', { id: '__SERVICE_ID__' }, function () {
+ log('elevateService succeeded, restarting our service…');
+ afterElevation();
+ }, function (err) {
+ log('elevateService unavailable (' + (err.errorText || 'unknown') + '), trying exec fallback…');
+ luna(HBCHANNEL + '/exec', { command: HBCHANNEL_ELEVATE + ' __SERVICE_ID__' }, function () {
+ log('elevate-service executed, restarting our service…');
+ afterElevation();
+ }, function (execErr) {
+ log('could not elevate: ' + (execErr.errorText || JSON.stringify(execErr)));
+ log('Is the Homebrew Channel installed and rooted? Its service must be elevated first.');
+ setBusy(false);
+ if (onDone) onDone();
+ });
+ });
+ }
+
+ /* ---------------------------------------------------------------- input */
+
+ document.addEventListener('keydown', function (event) {
+ switch (event.keyCode) {
+ case 38: // up
+ move(-1);
+ break;
+ case 40: // down
+ move(1);
+ break;
+ case 37: // left
+ move(-1);
+ break;
+ case 39: // right
+ move(1);
+ break;
+ case 13: // OK
+ case 32: // space (keyboard/dev)
+ if (!busy && focusables[focusIndex] && focusables[focusIndex].onActivate) {
+ focusables[focusIndex].onActivate();
+ }
+ break;
+ case 461: // back
+ case 27: // esc
+ window.close();
+ break;
+ default:
+ return;
+ }
+ event.preventDefault();
+ });
+
+ /* ----------------------------------------------------------------- boot */
+
+ buildUi();
+ log('LG Update Blocker v__VERSION__');
+ setBusy(true, 'checking service…');
+ refresh(function (status) {
+ if (!status) {
+ setBusy(false);
+ return;
+ }
+ if (status.root) {
+ setBusy(false);
+ log('service is running as root - ready');
+ } else {
+ elevate();
+ }
+ });
+})();
diff --git a/app/style.css b/app/style.css
new file mode 100644
index 0000000..1ea2fef
--- /dev/null
+++ b/app/style.css
@@ -0,0 +1,234 @@
+* {
+ box-sizing: border-box;
+ margin: 0;
+ padding: 0;
+}
+
+html,
+body {
+ width: 1920px;
+ height: 1080px;
+ overflow: hidden;
+ background: #0d1014;
+ color: #e6e9ee;
+ font-family: "LG Smart UI", "Museo Sans", Helvetica, Arial, sans-serif;
+ font-size: 24px;
+}
+
+.screen {
+ /* TV overscan safe area */
+ padding: 54px 90px 40px;
+ height: 100%;
+ display: flex;
+ flex-direction: column;
+}
+
+.header {
+ display: flex;
+ align-items: flex-start;
+ justify-content: space-between;
+ padding-bottom: 24px;
+ border-bottom: 2px solid #232a33;
+}
+
+h1 {
+ font-size: 46px;
+ font-weight: 600;
+ letter-spacing: 0.5px;
+}
+
+h2 {
+ font-size: 24px;
+ font-weight: 600;
+ text-transform: uppercase;
+ letter-spacing: 2px;
+ color: #7c8899;
+ margin: 26px 0 14px;
+}
+
+h2:first-child {
+ margin-top: 0;
+}
+
+.subtitle {
+ color: #8b95a5;
+ font-size: 22px;
+ margin-top: 6px;
+}
+
+.badges {
+ display: flex;
+ gap: 12px;
+}
+
+.badge {
+ padding: 8px 18px;
+ border-radius: 999px;
+ background: #1a2029;
+ color: #9aa5b5;
+ font-size: 20px;
+ white-space: nowrap;
+}
+
+.badge-ok {
+ background: #123021;
+ color: #4ade80;
+}
+
+.badge-bad {
+ background: #35161a;
+ color: #f87171;
+}
+
+.badge-unknown {
+ background: #2a2413;
+ color: #fbbf24;
+}
+
+.columns {
+ display: flex;
+ gap: 40px;
+ flex: 1;
+ min-height: 0;
+ padding-top: 26px;
+}
+
+.panel {
+ flex: 1;
+ min-width: 0;
+ display: flex;
+ flex-direction: column;
+}
+
+.panel:last-child {
+ max-width: 720px;
+}
+
+.toggles,
+.actions {
+ display: flex;
+ flex-direction: column;
+ gap: 10px;
+}
+
+.actions {
+ flex-direction: row;
+ flex-wrap: wrap;
+}
+
+.row {
+ display: flex;
+ align-items: center;
+ gap: 20px;
+ padding: 16px 22px;
+ border: 3px solid transparent;
+ border-radius: 12px;
+ background: #151b23;
+}
+
+.row .text {
+ flex: 1;
+ min-width: 0;
+}
+
+.row .title {
+ font-size: 25px;
+}
+
+.row .desc {
+ font-size: 19px;
+ color: #8b95a5;
+ margin-top: 4px;
+}
+
+.row .state {
+ font-size: 22px;
+ font-weight: 600;
+ padding: 6px 16px;
+ border-radius: 8px;
+ background: #232b36;
+ color: #94a3b8;
+ min-width: 92px;
+ text-align: center;
+}
+
+.row.on .state {
+ background: #14361f;
+ color: #4ade80;
+}
+
+.button {
+ padding: 16px 28px;
+ border: 3px solid transparent;
+ border-radius: 12px;
+ background: #1d2530;
+ font-size: 24px;
+}
+
+.button.primary {
+ background: #7f1d24;
+ color: #ffe4e6;
+}
+
+.focused {
+ border-color: #f43f5e;
+ background: #222c38;
+}
+
+.button.primary.focused {
+ background: #b91c2c;
+}
+
+.status {
+ font-size: 21px;
+ line-height: 1.5;
+}
+
+.status div {
+ display: flex;
+ justify-content: space-between;
+ gap: 16px;
+ padding: 5px 0;
+ border-bottom: 1px solid #1b2029;
+}
+
+.status dt {
+ color: #8b95a5;
+}
+
+.status dd {
+ text-align: right;
+ color: #dbe2ea;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ max-width: 60%;
+}
+
+.log {
+ flex: 1;
+ min-height: 120px;
+ overflow-y: auto;
+ background: #0a0d11;
+ border: 1px solid #1b2029;
+ border-radius: 10px;
+ padding: 14px 18px;
+ font-family: "Andale Mono", monospace;
+ font-size: 18px;
+ line-height: 1.45;
+ color: #9fb0c3;
+ white-space: pre-wrap;
+ word-break: break-word;
+}
+
+.footer {
+ display: flex;
+ justify-content: space-between;
+ padding-top: 18px;
+ color: #6b7686;
+ font-size: 20px;
+}
+
+.busy {
+ color: #fbbf24;
+}
diff --git a/appinfo.json b/appinfo.json
new file mode 100644
index 0000000..26805a4
--- /dev/null
+++ b/appinfo.json
@@ -0,0 +1,18 @@
+{
+ "id": "__APP_ID__",
+ "version": "__VERSION__",
+ "vendor": "rkievits",
+ "type": "web",
+ "main": "index.html",
+ "title": "__TITLE__",
+ "appDescription": "Blocks the recurring LG webOS firmware update popup (rooted TVs, Homebrew Channel required)",
+ "icon": "icon.png",
+ "largeIcon": "largeIcon.png",
+ "iconColor": "#1b1f24",
+ "bgColor": "#101418",
+ "disableBackHistoryAPI": true,
+ "requiredPermissions": [
+ "time.query",
+ "activity.operation"
+ ]
+}
diff --git a/assets/icon.png b/assets/icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..7cc7852938261120eef7ec5f67d979d77a3a3c90
GIT binary patch
literal 4800
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
+
+
+
+
+
+
+
+
+
diff --git a/assets/icon400.png b/assets/icon400.png
new file mode 100644
index 0000000000000000000000000000000000000000..7e737a7243a080ea9528ee52a5a4b28f69886cf1
GIT binary patch
literal 15536
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
literal 0
HcmV?d00001
diff --git a/assets/largeIcon.png b/assets/largeIcon.png
new file mode 100644
index 0000000000000000000000000000000000000000..a51085ed4b43d2eb2cfb01550db2a82d39d0fc37
GIT binary patch
literal 7795
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 Update Blocker stops the "a new software version is available" popup
+that webOS shows on every boot, without touching the firmware itself.
+
+It applies up to five reversible layers and re-applies them on every boot
+through a Homebrew Channel startup hook:
+
+
+ Block LG update servers - points snu/su/nsu.lge.com and their TLS
+ and CDN aliases at 127.0.0.1 in /etc/hosts.
+ Delete staged firmware - wipes /mnt/lg/cmn_data/swupdate. An update
+ that was already downloaded keeps prompting even when the servers are
+ unreachable, which is why blocking alone often is not enough.
+ Lock the staging folder - bind-mounts an empty read-only directory
+ over it so nothing can be staged again.
+ Turn off auto-update settings - switches off every update related
+ key that com.webos.settingsservice exposes on your firmware, remembering
+ the original values.
+ Stop update services at boot - optional, stops the update upstart
+ jobs found on the TV.
+
+
+Requires root and the Homebrew Channel: the app asks the Homebrew Channel to
+elevate its own service on first launch. "Remove protection" undoes everything.
diff --git a/docs/screenshot.png b/docs/screenshot.png
new file mode 100644
index 0000000000000000000000000000000000000000..50701bc5bf89204c4dc78661be658ea84803b4f5
GIT binary patch
literal 203694
zcmeFY=RaI)8#XK?1VNf4`cBhJ^yn>m@13Y)Fhm`l1Q7($`;6Xu?-HVSqt_^-8;sFL
zd)NK!z3=<^2j2J7>kHQ`zqMwa*V&HaJg!hR6O954d59zbK|;$TZEx}3$0r~vfPKWLo854
z_7)GIP$(NJ*JK9;%h^7AqZ`R1Kd+_He}3EMvzW@CIIxI(9CO?1sWLw^7vKa|6)GC+UB@spM-JV3WhICBYF=R!^MeMmuMAEiH%OK
zb1yFDA8)B)44QiOO+X>`hWTXt@flp4a^VDPXv7mc}PIuE#&RZt$92?9@Db0P_nnjlGy36
z)YSFwR{TUr4amUrk1-K9IaX6uQ{{uK7LC51Y!DIO*s7Q>x0aRBc~Ur~
za~$ngbKN7Vna4ZvEN~yRSYD&s!IH)4o<7YN!51$mr}!d1yporf*RS=O>?WbwvKr)p
z&sJMUz~9SfYO+3!fWIrt%7Q)SOXYLq&6f^=ZBAoO?_)6ppOWH8yg#wlar^*jOVLC(AMU#($f7M?P3bQ2!B@#i>&AD
zM!mw2FH({w{`+ph!)%6pbiy7#{xP3NkYnb+w7)?tf7@sG_~f!TroB9AKYz-}%Kj9#
zaCN=+I5e}OCGO7K`x)B1Q?1R(g@uy&F!3m`&eGD7*fplQyxg%>6Mf+W0&S|^ob_EE
zwBB|`iIo^OCxGb}y)lQMpt`7ho|Yx8N-4D;VR%C0J}tcXqc2~+>`%vHy`-hP2CLb4
zc(jnB8Ifbzvi>(0n@41HZMRF!P}D*pgiDrzflO63ScS^YZi8teU-y9BxQWsA+4JWw
z|E(^hsu{UfXxESmAI-%gv_cclo{7O6?k{ey4gurOpY>Q{zDYlr2*SaJdLCR$SA&Mk
zDdqlp=yNsJW6}LRSrp<01{30yrsn2O7HJoI@b2O)HbOVE$;2#gShoJUi=3XXgDlrO
zE(;yB4E^I7!pG+uO@o?|Z3o9gt}F;Doo`YZj=jRgHsOSr2mN8hFA50nU}7sR`(i%h
z5pYHzm#1!fqhALSkjdaL_6rCKGDdx>uc`TX6D|`;U6`ADvXSce?w?zaaEY+BE&0E6
z$*wJ!K$uU^-W{5r8k?H>h<0#1(9_XLfWwPXm`Ih2#zrfvorJE@sj0eJsGO>DVTt`r
zgJYw>*0{{izijT^&wvNSv*@}XECqrosi;!%2uM%&=Tq<4@O~wss&hhg7weY&_nFLX
z>MTSHtlpk8q?kU@=ZT&?Vc_=$&qL?#)RZ}J>z2oZKnL#~S5o!$DHQ#$Gf_+=4@i2x
z!&gx&(x17E+1Qu_TtAL1&hzgygja{}jy@V0lRC88Ebku}Sgf#?cGsate5!fW|44iq
zgGv8(4CZ&)Al}Itku$r^d%Ah0MZIo~Xi3ztpQzDZpK-s+s!-n4)O;or)ai1LpFk$HM`O@NH8$#y`f(FK%vLla
zUllIw$t5NRCv6OJC)yt?o<6U%7-G|U4oTtxk1r40D#)vt;iQo7M*uF$?27jI-Ue%H
z`}{eyvNG&gwco?T;{^r9v*+3G|9KJNa1Sp7VbQ3I@(j03UX4wypgBRoy~CA_$!w_D
z?axy_KKD3@Vs770J;Ur}sK=p}7gfvSh@8;boI>vFE4&`%B=pH@l-5%4D)_UwnugKU
z{D>(rOVBtr>%h<6(q7nlA#Rc-fs^F-<`Gy^%lu&t_1#gnolUr3;eM{3j)9=vX$ciS
z?JaeH3A0&Z=N9@{RgB#j3u^cC)m}QfK3nqNubqAoU>%0D8Eg~wc;53
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
z
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