Catch LG's rejection reasons before LG does.
Content Store review is slow, and one bounce costs you a week. Most rejections are
thirty-second fixes: a largeIcon that's 128×128 instead of 130×130,
a :has() that breaks on older panels, a stray
localhost URL. This finds them first.
- ✓ Zero setup · stdlib Python
- ✓ READY / NOT READY verdict
- ✓ Full P2 checklist included
It even reads PNG headers to verify icon dimensions.
A one-week rejection over a 2-pixel icon
LG's reviewers are thorough and slow. The reasons they bounce you are almost always small and mechanical — exactly the kind of thing a static check catches in seconds, long before a human ever looks at your build.
wrong icon/splash dimensions or a missing required asset.
:has() or other CSS that breaks older webOS Chromium.
a localhost URL or http:// that shipped by accident.
point · run · fix · re-run
From build to submit-ready
Point it at your app
python3 webos-qa.py ./my-app
Read the verdict
Sectioned PASS / WARN / BLOCKER report and a clear READY / NOT READY.
Fix & re-run
Clear every blocker, re-run until READY, then submit. --fail-on=blocker gates CI.
What it checks automatically
Plus a printed manual checklist for what a static tool can't verify — playback, D-pad focus, store metadata.
-
✓appinfo.json
reverse-DNS id,
x.x.xversion, vendor, type, icon fields — present & well-formed. -
✓Icon & splash sizes
reads PNG headers directly and checks exact pixel dimensions.
-
✓CSS
:has()flags selectors unsupported on older webOS Chromium.
-
✓Insecure / hard-coded URLs
http://mixed content,localhost/127.0.0.1, and missing BACK (461) handling.
What's in the pack
- ›webos-qa.py — the static checker; reads PNG headers, greps source, prints the verdict
- ›P2-checklist.md — the full LG pre-submission checklist, useful on its own
- ›--fail-on=blocker — READY / NOT READY exit code to gate CI
- ›SKILL.md — a Claude Code skill: "is my app ready for the Content Store?"
- ›examples/sample-app — a runnable fixture with planted issues + its report
- ›INSTALL.md — run it against your app, fix blockers, re-run before submission
one-time · yours forever
- ✓ Zero setup — plain Python 3
- ✓ Full P2 checklist reference
- ✓ READY / NOT READY + CI gate
- ✓ Tunable required-asset sizes
- ✓ Free updates to this product
- ✓ 14-day refund, no questions
A static checker plus a checklist — it won't test playback on a real device, and the size table is documented and editable.
Questions, answered
Do I need any tooling installed?+
Just Python 3 — no Pillow, no Node, no SDK. It parses PNG headers itself and greps your source. Point it at the app directory (or an unpacked IPK) and run.
What can't it check?+
Anything that needs a real device — actual playback, remote-control focus order, store metadata, privacy-policy reachability. Those are printed as an explicit manual checklist so nothing slips.
Can I change the required asset sizes?+
Yes. They default to the FHD profile and live in a small, documented table at the top of the script — adjust for your target firmware in seconds.
Does it work in CI?+
Yes — --fail-on=blocker returns a non-zero exit code when any blocker is present, so a build that LG would reject can't pass your pipeline.
One run. Fix the blockers. Submit with confidence.
Stop trading week-long review cycles for two-pixel mistakes.