A one-page guide to cleaning up an Android TV over ADB,
and a prompt to hand to an AI agent. In ten languages.
An Android TV arrives with its home screen given over to ad and recommendation rows, fifteen factory apps you never open running behind them, and, two years later, a noticeable pause between pressing a button on the remote and anything happening.
Most of the advice online answers this with root, an unlocked bootloader, or a custom ROM. All three factory-reset the television, and if the Widevine certificate drops from L1 to L3 on the way, Netflix falls back to SD. There is nothing to gain.
What the job actually needs is adb and one family of commands: pm disable-user.
Nothing is removed, only switched off, and pm enable brings it back. The prompt on
the site explains that to an AI agent, which installs the tool, connects to the
television, measures first, and then cleans up.
- Nothing is uninstalled. The prompt forbids
pm uninstalloutright and allows onlypm disable-user --user 0, so any change you dislike is one command away from being undone. - No root, no bootloader, no custom ROM. The prompt is told not to suggest them either, along with the reason.
- It backs up and measures first. Package lists,
getprop, everysettingstable anddumpsys meminfoare saved before anything changes, a restore script grows with each disabled package, and memory is measured again at the end for a before-and-after table. - It checks its own work. After each batch of at most ten packages the agent presses keys over ADB and reads a screenshot of the TV, and only asks you about what a screenshot cannot show.
- Ten languages from one template. The same
index.template.htmlfilled from ten JSON files, Arabic included. - No server. A static page on Cloudflare Pages.
Turn on developer options and USB debugging on the television, note its IP address, copy the prompt from tv.cobanov.dev, fill in the model and the IP where the first two lines say so, and hand it to Claude Code or Codex. The four steps on the page walk through that screen by screen.
The prompt is also published as prompt.txt, so it can be fetched directly:
curl https://tv.cobanov.dev/prompt.txt
curl https://tv.cobanov.dev/tr/prompt.txtEnglish is the default and sits at the root. The rest live under /<code>/.
| Language | Path | Language | Path |
|---|---|---|---|
| English | / |
Italiano | /it/ |
| Türkçe | /tr/ |
Русский | /ru/ |
| Français | /fr/ |
日本語 | /ja/ |
| Español | /es/ |
العربية | /ar/ |
| Deutsch | /de/ |
简体中文 | /zh/ |
English used to live under /en/. public/_redirects moves those addresses to the
root with a 301, so links people already have keep working.
| File | What it is |
|---|---|
index.template.html |
The single page template. {{key}} placeholders are filled in. |
i18n/<code>.json |
Every string for that language. Values may contain HTML fragments. |
prompts/<code>.txt |
That language's prompt. Embedded in the page and also published as prompt.txt. |
assets/site.css |
All the styling. Logical properties for Arabic, per-language fonts for CJK and Arabic. |
assets/og.template.html |
Source of the social card. |
assets/og-<code>.png |
The 1200x630 social preview, one per language. |
build.py |
Produces public/. |
build.sh |
build.py plus the file copying. |
og.sh |
Regenerates the social cards through headless Chrome. |
./build.sh
cd public && python3 -m http.server 8899Links between pages are relative, so public/index.html opens from the filesystem
too. _redirects only works on Cloudflare.
To regenerate the social cards (macOS, needs Chrome):
./build.sh && ./og.sh- Write
i18n/<code>.json. Copying an existing language and translating it is the fastest route; do not forgetpath,name,og_localeanddir. - Write
prompts/<code>.txt. - Add the code to
ORDERinbuild.py, and a row to theOGdictionary (font, heading size, heading width, letter spacing). ./build.sh && ./og.sh
For a right-to-left language, "dir": "rtl" in the JSON is enough; the stylesheet was
written with logical properties from the start.
The heading size varies by language for a specific reason: the ch unit is based on
the width of a Latin 0, so it comes out too narrow for a CJK heading, and the
tightened letter spacing only looks right on Latin script. A single fixed size
overflows in several of the ten at once.
Cloudflare Pages project: tv
./build.sh
wrangler pages deploy public --project-name tv --branch mainThe prompt borrows several lessons from cleanyourtv:
the full backup, checking each batch with screenshots, the brand-agnostic list of
packages never to touch, and the pitfalls around macOS Local Network, Android 14
installs and Google TV's setup wizard. Its examples/ folder has ready-made lists
for many TV models, and the prompt points the agent there.
