<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: ILIA KARPENKO</title>
    <description>The latest articles on DEV Community by ILIA KARPENKO (@ghost_wayne).</description>
    <link>https://dev.to/ghost_wayne</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4205782%2Fca424541-1cb1-4d69-8a61-3f0f43b40aef.jpg</url>
      <title>DEV Community: ILIA KARPENKO</title>
      <link>https://dev.to/ghost_wayne</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ghost_wayne"/>
    <language>en</language>
    <item>
      <title>AI Test Case Generator: Turn Requirements into TestRail-Ready Test Cases (Free Prompts)</title>
      <dc:creator>ILIA KARPENKO</dc:creator>
      <pubDate>Sun, 25 Oct 2026 04:23:34 +0000</pubDate>
      <link>https://dev.to/ghost_wayne/ai-test-case-generator-turn-requirements-into-testrail-ready-test-cases-free-prompts-2a6i</link>
      <guid>https://dev.to/ghost_wayne/ai-test-case-generator-turn-requirements-into-testrail-ready-test-cases-free-prompts-2a6i</guid>
      <description>&lt;p&gt;A new spec lands as a PDF on Monday. By Wednesday you have to hand over test cases in your team's TestRail format: their column names, their priority values, their ID scheme. You spend two days copying requirement text into rows, and the import fails anyway because one header reads &lt;code&gt;Expected Result&lt;/code&gt; instead of &lt;code&gt;Expected result&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;So you paste the spec into ChatGPT or Claude and ask for test cases. You get rows of happy path, each with "Verify the feature works correctly" as the expected result, in columns nobody on your team uses.&lt;/p&gt;

&lt;p&gt;Your prompt skipped the work a QA lead does before writing a single case. This guide gives you that work as five prompts you can paste into any AI chat today. No tool to install.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1. Give the AI your format, not just the spec
&lt;/h2&gt;

&lt;p&gt;Attach two files: the requirements, and a file with two or three test cases your team already wrote. The example teaches the AI more than any description of your format.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;I'm attaching (1) the requirements for the Payments module and (2) three test
cases in my team's format.

Before anything else, describe the format of file 2: the exact column names in
order, the allowed values for Priority and Type, the ID scheme and the last ID
used, and the writing style of steps and expected results. Don't write any test
cases yet.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Check the answer. If it lists &lt;code&gt;High / Medium / Low&lt;/code&gt; and your team uses &lt;code&gt;Blocker / Critical / Major / Minor&lt;/code&gt;, correct it now. Every case inherits this.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2. Ask for a plan and the gaps, not the cases
&lt;/h2&gt;

&lt;p&gt;This step decides what gets tested at all.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Read the requirements for the refund flow. Don't write test cases yet.

Give me:
1. A coverage plan: the areas you'll cover, the test design technique for each,
   and an estimated number of cases.
2. A list of gaps in the spec, each with the section number and one concrete
   question for the analyst. Look for: requirements with no measurable outcome,
   sections that contradict each other or a worked example, error paths that are
   never described, terms used as conditions but never defined, and external
   services whose failure is not specified.

End by asking me to approve or change the plan.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A spec that says "refunds should be processed quickly" has no testable outcome. A limit of $50,000 in one section and a worked example of a successful $75,000 refund in another is a contradiction someone has to resolve before you can write the boundary cases. "Silent on the error path" is the most common gap: the success flow fills a page, and nobody wrote what happens when the payment provider times out.&lt;/p&gt;

&lt;p&gt;Approve the plan, or cut it down. Then move on.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3. Make the AI use real test design techniques
&lt;/h2&gt;

&lt;p&gt;Without explicit techniques, generated suites drift to whatever the spec mentions first: ten variations of the happy path. Name the techniques in the prompt:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Plan approved. Write the test cases using:

- Equivalence partitioning: one case per group of inputs that behave the same.
- Boundary values on both sides of every edge. For a limit of 50,000 that means
  49,999, 50,000 and 50,001, not just the rejected value.
- A decision table wherever an outcome depends on several conditions: one case
  where all conditions pass, plus one case per condition failing on its own.
- State transitions: the allowed ones, and a case proving each forbidden one is
  rejected.
- Error guessing: empty and max-length input, double submit, session expiry
  mid-flow, network failure between request and response.

Use exactly the columns, values and ID scheme from step 1, continuing from the
last ID.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The "both sides of every edge" line matters. A suite with 50,000 and 50,001 but no 49,999 proves the limit rejects. It never proves the system accepts everything up to the limit, so an off-by-one that moved the limit down would pass.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4. Review the cases against a quality bar
&lt;/h2&gt;

&lt;p&gt;Ask the AI to grade its own output before you read it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Review every case against these rules and fix the ones that fail:

1. Atomic: one behaviour per case. If the title needs "and", split it.
2. Independent: it sets up its own preconditions.
3. One deterministic expected result with values, e.g. "Balance decreases by
   $500 and the history shows a refund with status Completed". No "works
   correctly", no "either X or Y".
4. Concrete data in the steps: "Amount: 50,001", not "an amount over the limit".
5. Steps are actions; checks go in the expected result.
6. No two cases test the same partition.
7. Every requirement in scope has at least one case. List any that have none.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Rule 3 protects the tester who runs the case. A case whose expected result reads "the operation ends in created or pending" can't be marked pass or fail. A real fork in behaviour means two cases. An undecided spec is a gap for the list.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 5. Export a file TestRail can import
&lt;/h2&gt;

&lt;p&gt;Ask for a CSV with your exact headers:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Export all cases as CSV. Use the headers from step 1, exactly as spelled, in the
same order. One row per case. Put each step on its own line inside the cell, not
as "&amp;lt;br&amp;gt;" or "\n" text. Quote every field.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Two things break imports: a header that differs by one character from your field mapping, and multi-line steps that arrive as literal &lt;code&gt;&amp;lt;br&amp;gt;&lt;/code&gt; tags. Open the file in a spreadsheet and check both before you import it into TestRail, Qase, Zephyr or Xray.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the prompts start to hurt
&lt;/h2&gt;

&lt;p&gt;The five prompts work. After a few sprints, these four things get old:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You re-describe your format every new chat, and the model forgets a column halfway through a long suite.&lt;/li&gt;
&lt;li&gt;It writes cases before you approve the plan unless you stop it every time.&lt;/li&gt;
&lt;li&gt;The gap list depends on how carefully you phrased step 2 that day.&lt;/li&gt;
&lt;li&gt;The CSV still needs a manual pass for headers and line breaks.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's why I packaged the workflow as &lt;strong&gt;&lt;a href="https://github.com/JohnWayneeee/casely-qa-skill" rel="noopener noreferrer"&gt;Casely&lt;/a&gt;&lt;/strong&gt;, a free, open-source skill for Claude Code, claude.ai, Cowork, the Claude desktop app and Codex. You attach the spec (or name a Jira issue or a Confluence page) and one example file, and say what you need:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Here are the requirements for the Payments module and two example test cases my team writes. Give me test cases for the refund flow."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Casely runs the five steps above in one conversation and stops once, at the plan, for your OK. It copies your columns, priority values and ID scheme from the example file. It writes the cases with the techniques from step 3, then exports one &lt;code&gt;.xlsx&lt;/code&gt; with your headers that TestRail imports in one pass, plus one Markdown file per case, or a UTF-8 CSV if your tracker wants one. Say yes once and it saves your team's style, so the next run needs no example file. When the spec describes an API, it also builds a Postman collection with every base URL, token and ID pulled out into variables, and no credentials in the file. When the spec names no endpoints, it asks for the API docs instead of inventing paths. In Claude Code, &lt;code&gt;/casely:run&lt;/code&gt; then walks the UI cases in a browser, and &lt;code&gt;/casely:bug&lt;/code&gt; turns a failure or a trace ID into a bug report in your team's format.&lt;/p&gt;

&lt;h2&gt;
  
  
  How do you know it finds the gaps?
&lt;/h2&gt;

&lt;p&gt;The repo ships a benchmark: a fintech wallet spec with &lt;strong&gt;five planted defects&lt;/strong&gt; (a vague "processed quickly", a $50,000 limit that contradicts a successful $75,000 example, a fee that is withheld but never sized, an undefined "verified status", and no behaviour for a payment provider outage), plus boundary rules, a state machine and a five-condition decision table. A 100-point rubric scores the run.&lt;/p&gt;

&lt;p&gt;The first full run scored &lt;strong&gt;85/100&lt;/strong&gt;. It produced 33 cases continuing the team's ID scheme, matched all nine columns in order, and exported one workbook with no rejected case. It missed two of the five planted gaps. The rules that catch those two are now part of the skill. The spec, the example file and the rubric are in &lt;a href="https://github.com/JohnWayneeee/casely-qa-skill/tree/main/benchmark" rel="noopener noreferrer"&gt;&lt;code&gt;benchmark/&lt;/code&gt;&lt;/a&gt;, so you can score a run yourself.&lt;/p&gt;

&lt;p&gt;Pick Opus for the plan phase if you can. Smaller models write acceptable cases from a plan they're handed, and miss the holes in the spec.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Is there a free AI test case generator?&lt;/strong&gt;&lt;br&gt;
The prompts in this article are free with any AI chat. Casely is free and open-source under the MIT license; you pay only for the Claude or Codex plan you already use.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I import AI-generated test cases into TestRail?&lt;/strong&gt;&lt;br&gt;
Yes. Match the headers to your TestRail field mapping exactly and keep multi-line steps as real line breaks. Casely exports a file that already does both.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does it work with requirements in other languages?&lt;/strong&gt;&lt;br&gt;
Casely writes the cases in the language of your example cases. A round-trip test checks that Arabic and Korean text, commas, quotes and line breaks survive the XLSX and CSV export cell for cell. A reader suggested the Korean case in the comments below.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What about scanned PDFs?&lt;/strong&gt;&lt;br&gt;
Text-based PDFs, DOCX and XLSX work well. An image-only scan may not extract cleanly, so export a text version when you can.&lt;/p&gt;



&lt;p&gt;Add Casely to claude.ai, Cowork or the desktop app in one click from the &lt;a href="https://claude.ai/customize/plugins/id/8bcda77b-fec6-46f2-b329-ebca18a801c1%40anthropic-plugin-directory" rel="noopener noreferrer"&gt;Claude plugin directory&lt;/a&gt;. In Claude Code, paste this prompt:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Install the Casely plugin from https://github.com/JohnWayneeee/casely-qa-skill
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Codex and manual setup are in the &lt;a href="https://github.com/JohnWayneeee/casely-qa-skill#install" rel="noopener noreferrer"&gt;README&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;More on how Casely came about: &lt;a href="https://medium.com/@ghost.waynee/your-qa-team-was-hired-to-find-bugs-it-spends-two-days-a-sprint-formatting-spreadsheets-a05d0a483821" rel="noopener noreferrer"&gt;Your QA team was hired to find bugs. It spends two days a sprint formatting spreadsheets&lt;/a&gt; and &lt;a href="https://medium.com/@ghost.waynee/stop-manually-writing-test-cases-how-i-built-a-claude-skill-that-turns-requirements-into-100-3d88a58ed283" rel="noopener noreferrer"&gt;Stop manually writing test cases&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If it saved you a day of formatting test cases, a ⭐ on the repo helps other QA engineers find it, and a &lt;a href="https://buymeacoffee.com/JohnWayne" rel="noopener noreferrer"&gt;coffee&lt;/a&gt; pays for the next release.&lt;/p&gt;

</description>
      <category>testing</category>
      <category>qa</category>
      <category>ai</category>
      <category>opensource</category>
    </item>
    <item>
      <title>How to Remove Ads from Google TV (and Make It Faster): a Free ADB Guide</title>
      <dc:creator>ILIA KARPENKO</dc:creator>
      <pubDate>Sun, 25 Oct 2026 04:09:55 +0000</pubDate>
      <link>https://dev.to/ghost_wayne/how-to-remove-ads-from-google-tv-and-make-it-faster-a-free-adb-guide-592f</link>
      <guid>https://dev.to/ghost_wayne/how-to-remove-ads-from-google-tv-and-make-it-faster-a-free-adb-guide-592f</guid>
      <description>&lt;p&gt;&lt;em&gt;No root. Every step can be undone. The full command list, plus the two traps that turn a TV into a black screen.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;You turn the TV on to watch one thing. First you get a row of ads and "recommended for you". The menu lags a second behind the remote. Apps open slowly. You search for a fix and find forum threads with a list of &lt;code&gt;adb&lt;/code&gt; commands, no explanation, and no way back if one of them kills your Wi-Fi.&lt;/p&gt;

&lt;p&gt;This guide shows how to remove ads from the Google TV home screen and free memory using ADB, step by step, with the undo command for each change. You need a computer and the TV on the same network.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why your TV shows ads and slows down
&lt;/h2&gt;

&lt;p&gt;Out of the box an Android TV or Google TV set runs a dozen vendor services in the background: telemetry, content stores, recommendation rows, a second cast receiver, a demo mode. The home screen itself is an ad surface. All of it shares 1–3 GB of RAM with the apps you open.&lt;/p&gt;

&lt;p&gt;The picture and sound get the same treatment. Motion smoothing, noise reduction and "enhancers" are on by default. On one CHiQ set I tuned, the stock equaliser boosted 5 kHz by +41.&lt;/p&gt;

&lt;h2&gt;
  
  
  The quick fix, and why it isn't enough
&lt;/h2&gt;

&lt;p&gt;Google TV has an &lt;strong&gt;Apps-only mode&lt;/strong&gt; (Settings → Accounts &amp;amp; Sign In → your account → Apps only mode). It hides most recommendations. The stock home screen stays, the vendor services keep running, and the lag stays with them.&lt;/p&gt;

&lt;p&gt;An ad-blocking DNS (Settings → Network → Private DNS, for example &lt;code&gt;dns.adguard-dns.com&lt;/code&gt;) blocks some ad requests on Android 9 and newer. It does not block YouTube ads.&lt;/p&gt;

&lt;p&gt;To fix the cause you have to switch off the services themselves. That takes ADB.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1. Turn on developer options and debugging
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Open &lt;strong&gt;Settings → System → About&lt;/strong&gt; (on older Android TV: &lt;strong&gt;Settings → Device Preferences → About&lt;/strong&gt;).&lt;/li&gt;
&lt;li&gt;Press OK on &lt;strong&gt;Build&lt;/strong&gt; (or &lt;strong&gt;Android TV OS build&lt;/strong&gt;) seven times. You'll see "You are now a developer".&lt;/li&gt;
&lt;li&gt;Go back to &lt;strong&gt;Developer options&lt;/strong&gt;. Turn on &lt;strong&gt;USB debugging&lt;/strong&gt;, and &lt;strong&gt;Network debugging&lt;/strong&gt; if it is listed.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;On a computer, install Android SDK platform-tools, which contain &lt;code&gt;adb&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2. Connect over the network
&lt;/h2&gt;

&lt;p&gt;Find the TV's IP address in &lt;strong&gt;Settings → Network&lt;/strong&gt;. Then:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;adb connect 192.168.1.50:5555
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A prompt "Allow USB debugging?" appears on the TV. Tick &lt;strong&gt;Always allow from this computer&lt;/strong&gt; and press OK. Without the tick, the prompt comes back every time you reconnect.&lt;/p&gt;

&lt;p&gt;If the connection is refused, your TV may only offer &lt;strong&gt;Wireless debugging&lt;/strong&gt; (common on Google TV 12+). Open it, choose &lt;strong&gt;Pair device with pairing code&lt;/strong&gt;, then on the computer:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;adb pair 192.168.1.50:&amp;lt;pairing-port&amp;gt;     &lt;span class="c"&gt;# enter the code shown on the TV&lt;/span&gt;
adb connect 192.168.1.50:&amp;lt;port-shown-on-tv&amp;gt;
adb tcpip 5555
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If nothing answers at all, not even your router, a VPN on the computer is capturing the local network. Exclude your home subnet from the tunnel.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3. Save what you have before changing anything
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;adb shell pm list packages &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; packages-system.txt
adb shell pm list packages &lt;span class="nt"&gt;-3&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; packages-3rdparty.txt
adb shell pm list packages &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; disabled-before.txt
adb shell &lt;span class="s2"&gt;"grep -E 'MemTotal|MemAvailable' /proc/meminfo"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Write down &lt;code&gt;MemAvailable&lt;/code&gt;. You'll compare it at the end.&lt;/p&gt;

&lt;p&gt;Now the first trap. Check which app owns your saved Wi-Fi network:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;adb shell &lt;span class="s2"&gt;"dumpsys wifi | grep -o 'cname=[^ ]*'"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When you disable the app that saved a network, Android deletes that network. The TV drops off Wi-Fi, and your ADB session drops with it. Never disable the package this command names. On Google TV it is often the setup wizard, and that matters in step 6.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4. Decide what to disable
&lt;/h2&gt;

&lt;p&gt;Open &lt;code&gt;packages-system.txt&lt;/code&gt; and sort the vendor packages into groups:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;vendor telemetry and analytics;&lt;/li&gt;
&lt;li&gt;vendor stores, recommendation rows and content providers;&lt;/li&gt;
&lt;li&gt;background services you don't use: a second cast receiver, cleaners, demo modes, print;&lt;/li&gt;
&lt;li&gt;preinstalled apps you never open.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When a package name says nothing, read it without starting it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;adb shell &lt;span class="s2"&gt;"dumpsys package &amp;lt;package&amp;gt; | grep -E 'versionName|sharedUser|permission&lt;/span&gt;&lt;span class="se"&gt;\.&lt;/span&gt;&lt;span class="s2"&gt;'"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;BIND_TV_INPUT&lt;/code&gt; means an input or remote service: keep it. Firebase or &lt;code&gt;c2dm&lt;/code&gt; together with a boot receiver usually means push and telemetry.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Never disable these.&lt;/strong&gt; Each one can stop the TV from booting, showing a picture or taking input:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Android core: &lt;code&gt;android&lt;/code&gt;, &lt;code&gt;com.android.systemui&lt;/code&gt;, &lt;code&gt;com.android.shell&lt;/code&gt;, &lt;code&gt;com.android.settings&lt;/code&gt;, &lt;code&gt;com.android.tv.settings&lt;/code&gt;, the permission controller, the package installer, and &lt;code&gt;com.android.providers.*&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;What the TV needs to work: the TV app and HDMI/tuner input services, the input menu, &lt;code&gt;com.android.bluetooth&lt;/code&gt; and the remote pairing service, the on-screen keyboard, Play Store, Play Services, the Android TV Remote service.&lt;/li&gt;
&lt;li&gt;Any package with &lt;code&gt;factory&lt;/code&gt;, &lt;code&gt;fac&lt;/code&gt; or &lt;code&gt;AT&lt;/code&gt; in its name. Don't disable them, and don't even open them. On some Haier and CVTE boards, opening one flips a factory flag: the Input key and HDMI-CEC stop working, and the next boot disables Play Services.&lt;/li&gt;
&lt;li&gt;The Wi-Fi owner from step 3.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;An original Mi TV Stick never booted again after a debloat list took six of the core packages. Check each package yourself instead of trusting a list.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 5. Disable in small batches
&lt;/h2&gt;

&lt;p&gt;Disable, don't uninstall. &lt;code&gt;disable-user&lt;/code&gt; is reversible. &lt;code&gt;uninstall&lt;/code&gt; on a system package is much harder to undo.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;adb shell pm disable-user &lt;span class="nt"&gt;--user&lt;/span&gt; 0 &amp;lt;package&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Do four or five packages at a time. After each batch, press Home on the TV and check that the picture, the remote and the network still work. If something breaks, you know which batch did it.&lt;/p&gt;

&lt;p&gt;Check the result by listing, not by the exit code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;adb shell pm list packages &lt;span class="nt"&gt;-d&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Some firmware (Fire OS and a few others) prints success and changes nothing, or refuses with &lt;code&gt;SecurityException&lt;/code&gt;. If every package is refused, your TV doesn't allow this. Use the TV's own privacy toggles and the DNS from above instead.&lt;/p&gt;

&lt;p&gt;Undo one package:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;adb shell pm &lt;span class="nb"&gt;enable&lt;/span&gt; &amp;lt;package&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 6. Replace the ad-filled home screen
&lt;/h2&gt;

&lt;p&gt;Install a launcher first. Any Android TV launcher works for this step. Then try to make it the Home app:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;adb shell cmd package set-home-activity &amp;lt;launcher.package&amp;gt;/&amp;lt;.MainActivity&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On most Google TV sets this prints &lt;code&gt;Success&lt;/code&gt; and changes nothing. The stock launcher, &lt;code&gt;com.google.android.apps.tv.launcherx&lt;/code&gt;, has Home priority 2. The setup wizard's &lt;code&gt;RecoveryActivity&lt;/code&gt; has priority 1. A third-party launcher is capped at priority 0. The system picks the highest priority, whatever you set as preferred.&lt;/p&gt;

&lt;p&gt;So you have to disable the stock launcher, and that hides the second trap. If you disable only &lt;code&gt;launcherx&lt;/code&gt;, the setup wizard's &lt;code&gt;RecoveryActivity&lt;/code&gt; takes over Home, tries to re-enable &lt;code&gt;launcherx&lt;/code&gt;, fails, and loops on a black screen. You have to disable the wizard too, &lt;code&gt;com.google.android.tungsten.setupwraith&lt;/code&gt;. The wizard often owns the Wi-Fi network from first setup. Do it in this order:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Run the Wi-Fi check from step 3. If it names &lt;code&gt;setupwraith&lt;/code&gt;, go to &lt;strong&gt;Settings → Network&lt;/strong&gt;, &lt;strong&gt;forget&lt;/strong&gt; your network and join it again. The TV may get a new IP: reconnect ADB.&lt;/li&gt;
&lt;li&gt;Run the check again. The owner should now be &lt;code&gt;com.android.tv.settings&lt;/code&gt; or a system uid.&lt;/li&gt;
&lt;li&gt;Disable both:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;adb shell pm disable-user &lt;span class="nt"&gt;--user&lt;/span&gt; 0 com.google.android.tungsten.setupwraith
adb shell pm disable-user &lt;span class="nt"&gt;--user&lt;/span&gt; 0 com.google.android.apps.tv.launcherx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Press Home and check who holds the screen:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;adb shell &lt;span class="s2"&gt;"dumpsys activity activities | grep mFocusedApp"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you see a black screen at any point:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;adb shell pm &lt;span class="nb"&gt;enable &lt;/span&gt;com.google.android.apps.tv.launcherx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then press Home.&lt;/p&gt;

&lt;p&gt;One cost to know about: on Google TV the stock launcher also handles the gear (dashboard) button on the remote. After the swap that button stops working, and no third-party app can take it over. The Input button keeps working.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 7. Make it faster
&lt;/h2&gt;

&lt;p&gt;Halve the animations so menus respond quicker:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;adb shell settings put global window_animation_scale 0.5
adb shell settings put global transition_animation_scale 0.5
adb shell settings put global animator_duration_scale 0.5
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Stop background Wi-Fi and Bluetooth scanning, which a TV doesn't need:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;adb shell settings put global wifi_scan_always_enabled 0
adb shell settings put global ble_scan_always_enabled 0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On Android 11 and newer, freeze cached apps so they use no CPU in the background (reboot to apply):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;adb shell settings put global cached_apps_freezer enabled
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Before you change a setting, read its old value with &lt;code&gt;settings get global &amp;lt;key&amp;gt;&lt;/code&gt; and write it down. That is your undo.&lt;/p&gt;

&lt;p&gt;Now measure &lt;code&gt;MemAvailable&lt;/code&gt; again and compare it with step 3.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 8. Turn off the picture "enhancers"
&lt;/h2&gt;

&lt;p&gt;Open the picture menu (on Google TV: &lt;strong&gt;Settings → Display &amp;amp; Sound → Picture&lt;/strong&gt;) and switch off motion smoothing, noise reduction and dynamic contrast. Pick a Movie or Cinema mode with a warm colour temperature. Picture settings are usually per input, so repeat this for each HDMI port you use.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 9. Close the door behind you
&lt;/h2&gt;

&lt;p&gt;Network debugging on port 5555 is plaintext and gives a shell to any authorised computer on your network. When you're done:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;In &lt;strong&gt;Developer options&lt;/strong&gt;, switch off USB debugging and network debugging.&lt;/li&gt;
&lt;li&gt;Tap &lt;strong&gt;Revoke USB debugging authorisations&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Reboot the TV.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Why I stopped doing this by hand
&lt;/h2&gt;

&lt;p&gt;I've done the steps above on several TVs. Four things kept slowing me down:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Vendor package names say nothing. Every brand calls its telemetry something different, and you have to read each one.&lt;/li&gt;
&lt;li&gt;The Wi-Fi owner trap and the setup wizard loop give no warning. You learn about them from a black screen.&lt;/li&gt;
&lt;li&gt;Factory packages differ by board, and one wrong tap can break the Input key for good.&lt;/li&gt;
&lt;li&gt;To undo everything you need a log of every package and every setting you changed, with the old values.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So I wrote &lt;strong&gt;&lt;a href="https://github.com/JohnWayneeee/cleantv" rel="noopener noreferrer"&gt;CleanTV&lt;/a&gt;&lt;/strong&gt;, a free, open-source skill for Claude Code. You turn on debugging and say "Set up my TV". It does the steps in this article on your real TV:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;You&lt;/strong&gt; turn on debugging, say "Set up my TV" and answer 10–15 questions about how you use the TV.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Claude&lt;/strong&gt; finds the TV on your network, picks the packages, runs every &lt;code&gt;adb&lt;/code&gt; command, and checks each step with a screenshot from the TV.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It backs up the TV before the first change. It refuses core, factory and Wi-Fi owner packages. It disables the stock launcher and the wizard in the right order. It installs its own launcher: a pitch-black home screen with a dock of your apps, a clock and an HDMI inputs menu. It calibrates picture and sound for your room, and at the end it closes network debugging and checks that the port is shut. One command, &lt;code&gt;restore.py&lt;/code&gt;, undoes all of it.&lt;/p&gt;

&lt;p&gt;Measured on two TVs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;CHiQ, 2.8 GB RAM:&lt;/strong&gt; free memory went from 1.42 GB to &lt;strong&gt;1.77 GB&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Harper, 1.8 GB RAM:&lt;/strong&gt; free memory went from 721 MB to &lt;strong&gt;888 MB&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Home screen:&lt;/strong&gt; ads and recommendations replaced by &lt;strong&gt;your apps on black&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It works on Android TV and Google TV: Xiaomi, TCL, Hisense, Sony, Philips, CHiQ/Changhong, Haier, Harper, Nvidia Shield and others. It doesn't work on Samsung Tizen, LG webOS or Fire TV.&lt;/p&gt;

&lt;h2&gt;
  
  
  If YouTube is throttled where you live
&lt;/h2&gt;

&lt;p&gt;In some countries, Russia among them, the ISP slows YouTube down with deep packet inspection. Videos stall while everything else works.&lt;/p&gt;

&lt;p&gt;CleanTV can install &lt;a href="https://github.com/romanvht/ByeByeDPI" rel="noopener noreferrer"&gt;ByeByeDPI&lt;/a&gt;, an open-source app, on the TV itself. It runs locally as a VPN: no external server, no account. Only YouTube's traffic goes through it, every other app keeps the direct route. The CleanTV launcher starts the bypass when you open YouTube and stops it when you return Home.&lt;/p&gt;

&lt;p&gt;To set it up by hand: install the APK for your TV's CPU (&lt;code&gt;adb shell getprop ro.product.cpu.abi&lt;/code&gt;), set the DNS to Google (8.8.8.8), turn on the app whitelist with only &lt;code&gt;com.google.android.youtube.tv&lt;/code&gt;, and run the built-in strategy test. The test takes 10–15 minutes; don't touch the remote while it runs.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Can you remove ads from Google TV without root?&lt;/strong&gt;&lt;br&gt;
Yes. Everything in this guide works over ADB debugging, which you turn on in Developer options. No root, no unlocked bootloader.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is it safe?&lt;/strong&gt;&lt;br&gt;
Disabling is reversible: &lt;code&gt;pm enable &amp;lt;package&amp;gt;&lt;/code&gt; brings a package back. The risk is in what you disable. Stick to the never-disable list in step 4, work in small batches, and check the Wi-Fi owner first.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Will it remove YouTube ads?&lt;/strong&gt;&lt;br&gt;
No. This removes ads from the home screen and switches off vendor services. YouTube serves its own ads, and neither a launcher nor DNS can remove them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does it work on Fire TV?&lt;/strong&gt;&lt;br&gt;
No. Fire OS refuses &lt;code&gt;pm disable-user&lt;/code&gt;, and Fire TV doesn't use the Google TV launcher.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Will a system update undo it?&lt;/strong&gt;&lt;br&gt;
Some firmware re-enables its own packages on every boot (TCL on Android 9 does this). After a reboot, compare &lt;code&gt;pm list packages -d&lt;/code&gt; with your list.&lt;/p&gt;




&lt;p&gt;If you'd rather not spend the evening on it, &lt;strong&gt;&lt;a href="https://github.com/JohnWayneeee/cleantv" rel="noopener noreferrer"&gt;CleanTV is on GitHub&lt;/a&gt;&lt;/strong&gt;. Install it in Claude Code and say "Set up my TV".&lt;/p&gt;

&lt;p&gt;If it saved you that evening, a ⭐ on the repo helps other owners find it, and a &lt;a href="https://www.buymeacoffee.com/JohnWayne" rel="noopener noreferrer"&gt;coffee&lt;/a&gt; pays for the next module: remote buttons and Bluetooth remotes.&lt;/p&gt;

</description>
      <category>android</category>
      <category>adb</category>
      <category>tutorial</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
