{
  "@context": "https://schema.org",
  "@id": "https://aggr.aymericbeaumet.com/items/hnrss-org/2026-10-19-an-ad-free-android-tv/#webpage",
  "@type": [
    "WebPage",
    "ArchiveComponent"
  ],
  "articleBody": "I like Android TV. It runs every app I care about, it’s cheap on a [Chromecast](https://store.google.com/product/chromecast_google_tv), and it’s built into plenty of TVs. What I don’t like is ads.\n\nGoogle TV, the default interface on most Android TV devices, puts a large banner at the top of the home screen promoting whatever Google wants you to watch next. **Apps only mode** is supposed to strip the home screen down to your apps, but the banner stays. There’s no setting to change the launcher, and YouTube adds its own ads on top.\n\n![The Google TV home screen in Apps only mode, still showing a large promotional banner](https://cretezy.com/2026/ad-free-android-tv) *Before: Google TV, in Apps only mode*\n\nAfter setting up a few devices around the house, I landed on a setup with no ads at all, and a nicer interface to go with it.\n\n## The setup\n\n- [**Projectivy Launcher**](https://play.google.com/store/apps/details?id=com.spocky.projengmenu) replaces the home screen. It shows your apps and nothing else, and it’s very customizable.\n- [**SmartTube**](https://github.com/yuliskov/SmartTube) replaces YouTube, with no ads, a better interface, and [SponsorBlock](https://sponsor.ajay.app/) built in. I still pay for YouTube Premium to support creators, but I vastly prefer SmartTube to the official app.\n- [**Wholphin**](https://play.google.com/store/apps/details?id=com.github.damontecres.wholphin) is my preferred [Jellyfin](https://jellyfin.org/) client, for its UI and customization options.\n- [**Button Mapper**](https://play.google.com/store/apps/details?id=flar2.homebutton) remaps the remote, so the YouTube button opens SmartTube.\n\n![My Projectivy Launcher home screen, with just my apps](https://cretezy.com/2026/ad-free-android-tv) *After: Projectivy Launcher*\n\n![The SmartTube home screen](https://cretezy.com/2026/ad-free-android-tv) *SmartTube, blurred*\n\nI’ve set this up on two Chromecasts with Google TV and a Hisense TV, and it should work on most Android TV devices.\n\n## Tutorial\n\n> **Tip:** Hand this article to an AI agent (like [Claude Code](https://claude.com/claude-code)) and have it guide you through the setup. It can run the ADB commands for you and adapt them to your device.\n\nInstall the apps first. Projectivy, Wholphin, and Button Mapper are on the Play Store, and SmartTube can be sideloaded with [Downloader](https://play.google.com/store/apps/details?id=com.esaba.downloader). The rest needs [ADB](https://developer.android.com/tools/adb).\n\n### Connecting ADB\n\nEnable Developer options by clicking **Settings → System → About → Android TV OS build** 7 times. Then, in **Developer options**, enable **Wireless debugging** and choose **Pair device with pairing code**:\n\n```bash\nadb pair <ip>:<pairing-port> <code>\nadb mdns services # Find the connect port\nadb connect <ip>:<connect-port>\n\nD=<ip>:<connect-port> # Used in the commands below\n```\n\nWireless debugging only works over Wi-Fi. If your device doesn’t have it (like my Hisense TV), enable **USB debugging** instead and connect with `adb connect <ip>:5555`.\n\n### Replacing the launcher\n\nProjectivy has an **Override current launcher** option, but the stock home screen still flashes before it. Instead, disable the stock launcher and the package that restores it, then set Projectivy as the home app:\n\n```bash\nadb -s $D shell pm disable-user --user 0 com.google.android.apps.tv.launcherx\nadb -s $D shell pm disable-user --user 0 com.google.android.tungsten.setupwraith\nadb -s $D shell cmd package set-home-activity com.spocky.projengmenu/.ui.home.MainActivity\n```\n\nOn a TV, the stock launcher may also handle switching HDMI inputs, so check that still works afterward.\n\n### Replacing YouTube\n\nOnce SmartTube is set up, remove the official app:\n\n```bash\nadb -s $D uninstall com.google.android.youtube.tv\n```\n\nIf it’s built into the firmware (`DELETE_FAILED_INTERNAL_ERROR`), use `adb -s $D shell pm uninstall --user 0 com.google.android.youtube.tv` instead.\n\n### Remapping the remote\n\nButton Mapper and Projectivy both need their accessibility services enabled. This replaces the whole list, so check the current one first with `adb -s $D shell settings get secure enabled_accessibility_services` and keep anything else you use:\n\n```bash\nadb -s $D shell settings put secure enabled_accessibility_services \\\n  'flar2.homebutton/a.i:com.spocky.projengmenu/com.spocky.projengmenu.services.ProjectivyAccessibilityService'\nadb -s $D shell settings put secure accessibility_enabled 1\n```\n\n> Use Projectivy’s full component name, as above. With the short form (`com.spocky.projengmenu/.services...`), Projectivy shows **Enabled: No** even though the service is running.\n\nAndroid sometimes turns accessibility services off. Granting Button Mapper `WRITE_SECURE_SETTINGS` lets it turn itself back on, and exempting it from battery optimization keeps it responsive:\n\n```bash\nadb -s $D shell pm grant flar2.homebutton android.permission.WRITE_SECURE_SETTINGS\nadb -s $D shell dumpsys deviceidle whitelist +flar2.homebutton\n```\n\nThen, in Button Mapper, map the YouTube button to SmartTube.\n\n### Cleaning up\n\nWhile you’re connected, speed up animations and disable some Google apps you probably won’t use:\n\n```bash\nfor k in window_animation_scale transition_animation_scale animator_duration_scale; do\n  adb -s $D shell settings put global $k 0.75\ndone\n\nfor p in com.google.android.videos com.google.android.play.games \\\n         com.google.android.feedback com.google.android.partnersetup; do\n  adb -s $D shell pm disable-user --user 0 $p\ndone\n```\n\nEverything can be undone with `adb shell pm enable <package>` (or `adb shell cmd package install-existing <package>` for YouTube). Turn Wireless debugging off when you’re done.\n\nThat’s it: no banner, no ads, and a remote that opens the apps you actually use.\n",
  "authors": [
    "CraftThatBlock"
  ],
  "captured_at": "2026-10-20T07:25:43.733405278+00:00",
  "category": "news",
  "content_html": "<p>I like Android TV. It runs every app I care about, it’s cheap on a <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://store.google.com/product/chromecast_google_tv\">Chromecast</a>, and it’s built into plenty of TVs. What I don’t like is ads.</p>\n<p>Google TV, the default interface on most Android TV devices, puts a large banner at the top of the home screen promoting whatever Google wants you to watch next. <strong>Apps only mode</strong> is supposed to strip the home screen down to your apps, but the banner stays. There’s no setting to change the launcher, and YouTube adds its own ads on top.</p>\n<p><picture class=\"article-picture article-picture-fallback\" style=\"--image-ratio:16 / 9\"><img src=\"https://cretezy.com/2026/ad-free-android-tv\" alt=\"The Google TV home screen in Apps only mode, still showing a large promotional banner\" loading=\"eager\" decoding=\"async\" fetchpriority=\"high\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture> <em>Before: Google TV, in Apps only mode</em></p>\n<p>After setting up a few devices around the house, I landed on a setup with no ads at all, and a nicer interface to go with it.</p>\n<h2>The setup</h2>\n<ul>\n<li><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://play.google.com/store/apps/details?id=com.spocky.projengmenu\"><strong>Projectivy Launcher</strong></a> replaces the home screen. It shows your apps and nothing else, and it’s very customizable.</li>\n<li><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://github.com/yuliskov/SmartTube\"><strong>SmartTube</strong></a> replaces YouTube, with no ads, a better interface, and <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://sponsor.ajay.app/\">SponsorBlock</a> built in. I still pay for YouTube Premium to support creators, but I vastly prefer SmartTube to the official app.</li>\n<li><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://play.google.com/store/apps/details?id=com.github.damontecres.wholphin\"><strong>Wholphin</strong></a> is my preferred <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://jellyfin.org/\">Jellyfin</a> client, for its UI and customization options.</li>\n<li><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://play.google.com/store/apps/details?id=flar2.homebutton\"><strong>Button Mapper</strong></a> remaps the remote, so the YouTube button opens SmartTube.</li>\n</ul>\n<p><picture class=\"article-picture article-picture-fallback\" style=\"--image-ratio:16 / 9\"><img src=\"https://cretezy.com/2026/ad-free-android-tv\" alt=\"My Projectivy Launcher home screen, with just my apps\" loading=\"lazy\" decoding=\"async\" fetchpriority=\"low\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture> <em>After: Projectivy Launcher</em></p>\n<p><picture class=\"article-picture article-picture-fallback\" style=\"--image-ratio:16 / 9\"><img src=\"https://cretezy.com/2026/ad-free-android-tv\" alt=\"The SmartTube home screen\" loading=\"lazy\" decoding=\"async\" fetchpriority=\"low\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture> <em>SmartTube, blurred</em></p>\n<p>I’ve set this up on two Chromecasts with Google TV and a Hisense TV, and it should work on most Android TV devices.</p>\n<h2>Tutorial</h2>\n<blockquote>\n<p><strong>Tip:</strong> Hand this article to an AI agent (like <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://claude.com/claude-code\">Claude Code</a>) and have it guide you through the setup. It can run the ADB commands for you and adapt them to your device.</p>\n</blockquote>\n<p>Install the apps first. Projectivy, Wholphin, and Button Mapper are on the Play Store, and SmartTube can be sideloaded with <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://play.google.com/store/apps/details?id=com.esaba.downloader\">Downloader</a>. The rest needs <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://developer.android.com/tools/adb\">ADB</a>.</p>\n<h3>Connecting ADB</h3>\n<p>Enable Developer options by clicking <strong>Settings → System → About → Android TV OS build</strong> 7 times. Then, in <strong>Developer options</strong>, enable <strong>Wireless debugging</strong> and choose <strong>Pair device with pairing code</strong>:</p>\n<pre><code class=\"language-bash\"><span class=\"code-snippet\" data-language=\"Shell\"><span class=\"syntax-source syntax-shell syntax-bash\"><span class=\"syntax-meta syntax-function-call syntax-shell\"><span class=\"syntax-variable syntax-function syntax-shell\">adb</span></span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-shell\"> pair <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-redirection syntax-shell\">&lt;</span>ip<span class=\"syntax-keyword syntax-operator syntax-assignment syntax-redirection syntax-shell\">&gt;</span>:<span class=\"syntax-keyword syntax-operator syntax-assignment syntax-redirection syntax-shell\">&lt;</span>pairing-port<span class=\"syntax-keyword syntax-operator syntax-assignment syntax-redirection syntax-shell\">&gt;</span> <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-redirection syntax-shell\">&lt;</span>code<span class=\"syntax-keyword syntax-operator syntax-assignment syntax-redirection syntax-shell\">&gt;</span>\n</span><span class=\"syntax-meta syntax-function-call syntax-shell\"><span class=\"syntax-variable syntax-function syntax-shell\">adb</span></span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-shell\"> mdns services <span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-begin syntax-shell\">#</span></span><span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\"> Find the connect port</span><span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\">\n</span></span><span class=\"syntax-meta syntax-function-call syntax-shell\"><span class=\"syntax-variable syntax-function syntax-shell\">adb</span></span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-shell\"> connect <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-redirection syntax-shell\">&lt;</span>ip<span class=\"syntax-keyword syntax-operator syntax-assignment syntax-redirection syntax-shell\">&gt;</span>:<span class=\"syntax-keyword syntax-operator syntax-assignment syntax-redirection syntax-shell\">&lt;</span>connect-port<span class=\"syntax-keyword syntax-operator syntax-assignment syntax-redirection syntax-shell\">&gt;</span>\n</span>\n<span class=\"syntax-variable syntax-other syntax-readwrite syntax-assignment syntax-shell\">D</span><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-shell\">=</span><span class=\"syntax-string syntax-unquoted syntax-shell\">&lt;ip&gt;:&lt;connect-port&gt;</span> <span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-begin syntax-shell\">#</span></span><span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\"> Used in the commands below</span><span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\">\n</span></span></span></code></pre>\n<p>Wireless debugging only works over Wi-Fi. If your device doesn’t have it (like my Hisense TV), enable <strong>USB debugging</strong> instead and connect with <code>adb connect &lt;ip&gt;:5555</code>.</p>\n<h3>Replacing the launcher</h3>\n<p>Projectivy has an <strong>Override current launcher</strong> option, but the stock home screen still flashes before it. Instead, disable the stock launcher and the package that restores it, then set Projectivy as the home app:</p>\n<pre><code class=\"language-bash\"><span class=\"code-snippet\" data-language=\"Shell\"><span class=\"syntax-source syntax-shell syntax-bash\"><span class=\"syntax-meta syntax-function-call syntax-shell\"><span class=\"syntax-variable syntax-function syntax-shell\">adb</span></span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-shell\"><span class=\"syntax-variable syntax-parameter syntax-option syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-parameter syntax-shell\"> -</span>s</span> <span class=\"syntax-meta syntax-group syntax-expansion syntax-parameter syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-variable syntax-shell\">$</span><span class=\"syntax-variable syntax-other syntax-readwrite syntax-shell\">D</span></span> shell pm disable-user<span class=\"syntax-variable syntax-parameter syntax-option syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-parameter syntax-shell\"> --</span>user</span> 0 com.google.android.apps.tv.launcherx</span>\n<span class=\"syntax-meta syntax-function-call syntax-shell\"><span class=\"syntax-variable syntax-function syntax-shell\">adb</span></span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-shell\"><span class=\"syntax-variable syntax-parameter syntax-option syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-parameter syntax-shell\"> -</span>s</span> <span class=\"syntax-meta syntax-group syntax-expansion syntax-parameter syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-variable syntax-shell\">$</span><span class=\"syntax-variable syntax-other syntax-readwrite syntax-shell\">D</span></span> shell pm disable-user<span class=\"syntax-variable syntax-parameter syntax-option syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-parameter syntax-shell\"> --</span>user</span> 0 com.google.android.tungsten.setupwraith</span>\n<span class=\"syntax-meta syntax-function-call syntax-shell\"><span class=\"syntax-variable syntax-function syntax-shell\">adb</span></span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-shell\"><span class=\"syntax-variable syntax-parameter syntax-option syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-parameter syntax-shell\"> -</span>s</span> <span class=\"syntax-meta syntax-group syntax-expansion syntax-parameter syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-variable syntax-shell\">$</span><span class=\"syntax-variable syntax-other syntax-readwrite syntax-shell\">D</span></span> shell cmd package set-home-activity com.spocky.projengmenu/.ui.home.MainActivity</span>\n</span></span></code></pre>\n<p>On a TV, the stock launcher may also handle switching HDMI inputs, so check that still works afterward.</p>\n<h3>Replacing YouTube</h3>\n<p>Once SmartTube is set up, remove the official app:</p>\n<pre><code class=\"language-bash\"><span class=\"code-snippet\" data-language=\"Shell\"><span class=\"syntax-source syntax-shell syntax-bash\"><span class=\"syntax-meta syntax-function-call syntax-shell\"><span class=\"syntax-variable syntax-function syntax-shell\">adb</span></span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-shell\"><span class=\"syntax-variable syntax-parameter syntax-option syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-parameter syntax-shell\"> -</span>s</span> <span class=\"syntax-meta syntax-group syntax-expansion syntax-parameter syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-variable syntax-shell\">$</span><span class=\"syntax-variable syntax-other syntax-readwrite syntax-shell\">D</span></span> uninstall com.google.android.youtube.tv</span>\n</span></span></code></pre>\n<p>If it’s built into the firmware (<code>DELETE_FAILED_INTERNAL_ERROR</code>), use <code>adb -s $D shell pm uninstall --user 0 com.google.android.youtube.tv</code> instead.</p>\n<h3>Remapping the remote</h3>\n<p>Button Mapper and Projectivy both need their accessibility services enabled. This replaces the whole list, so check the current one first with <code>adb -s $D shell settings get secure enabled_accessibility_services</code> and keep anything else you use:</p>\n<pre><code class=\"language-bash\"><span class=\"code-snippet\" data-language=\"Shell\"><span class=\"syntax-source syntax-shell syntax-bash\"><span class=\"syntax-meta syntax-function-call syntax-shell\"><span class=\"syntax-variable syntax-function syntax-shell\">adb</span></span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-shell\"><span class=\"syntax-variable syntax-parameter syntax-option syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-parameter syntax-shell\"> -</span>s</span> <span class=\"syntax-meta syntax-group syntax-expansion syntax-parameter syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-variable syntax-shell\">$</span><span class=\"syntax-variable syntax-other syntax-readwrite syntax-shell\">D</span></span> shell settings put secure enabled_accessibility_services <span class=\"syntax-punctuation syntax-separator syntax-continuation syntax-line syntax-shell\">\\\n</span>  <span class=\"syntax-string syntax-quoted syntax-single syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-shell\">&#39;</span>flar2.homebutton/a.i:com.spocky.projengmenu/com.spocky.projengmenu.services.ProjectivyAccessibilityService<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-shell\">&#39;</span></span></span>\n<span class=\"syntax-meta syntax-function-call syntax-shell\"><span class=\"syntax-variable syntax-function syntax-shell\">adb</span></span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-shell\"><span class=\"syntax-variable syntax-parameter syntax-option syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-parameter syntax-shell\"> -</span>s</span> <span class=\"syntax-meta syntax-group syntax-expansion syntax-parameter syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-variable syntax-shell\">$</span><span class=\"syntax-variable syntax-other syntax-readwrite syntax-shell\">D</span></span> shell settings put secure accessibility_enabled 1</span>\n</span></span></code></pre>\n<blockquote>\n<p>Use Projectivy’s full component name, as above. With the short form (<code>com.spocky.projengmenu/.services...</code>), Projectivy shows <strong>Enabled: No</strong> even though the service is running.</p>\n</blockquote>\n<p>Android sometimes turns accessibility services off. Granting Button Mapper <code>WRITE_SECURE_SETTINGS</code> lets it turn itself back on, and exempting it from battery optimization keeps it responsive:</p>\n<pre><code class=\"language-bash\"><span class=\"code-snippet\" data-language=\"Shell\"><span class=\"syntax-source syntax-shell syntax-bash\"><span class=\"syntax-meta syntax-function-call syntax-shell\"><span class=\"syntax-variable syntax-function syntax-shell\">adb</span></span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-shell\"><span class=\"syntax-variable syntax-parameter syntax-option syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-parameter syntax-shell\"> -</span>s</span> <span class=\"syntax-meta syntax-group syntax-expansion syntax-parameter syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-variable syntax-shell\">$</span><span class=\"syntax-variable syntax-other syntax-readwrite syntax-shell\">D</span></span> shell pm grant flar2.homebutton android.permission.WRITE_SECURE_SETTINGS</span>\n<span class=\"syntax-meta syntax-function-call syntax-shell\"><span class=\"syntax-variable syntax-function syntax-shell\">adb</span></span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-shell\"><span class=\"syntax-variable syntax-parameter syntax-option syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-parameter syntax-shell\"> -</span>s</span> <span class=\"syntax-meta syntax-group syntax-expansion syntax-parameter syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-variable syntax-shell\">$</span><span class=\"syntax-variable syntax-other syntax-readwrite syntax-shell\">D</span></span> shell dumpsys deviceidle whitelist +flar2.homebutton</span>\n</span></span></code></pre>\n<p>Then, in Button Mapper, map the YouTube button to SmartTube.</p>\n<h3>Cleaning up</h3>\n<p>While you’re connected, speed up animations and disable some Google apps you probably won’t use:</p>\n<pre><code class=\"language-bash\"><span class=\"code-snippet\" data-language=\"Shell\"><span class=\"syntax-source syntax-shell syntax-bash\"><span class=\"syntax-keyword syntax-control syntax-for syntax-shell\">for</span><span class=\"syntax-meta syntax-group syntax-for syntax-shell\"> k <span class=\"syntax-keyword syntax-control syntax-in syntax-shell\">in</span> window_animation_scale transition_animation_scale animator_duration_scale</span><span class=\"syntax-keyword syntax-operator syntax-logical syntax-continue syntax-shell\">;</span> <span class=\"syntax-keyword syntax-control syntax-do syntax-shell\">do</span>\n  <span class=\"syntax-meta syntax-function-call syntax-shell\"><span class=\"syntax-variable syntax-function syntax-shell\">adb</span></span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-shell\"><span class=\"syntax-variable syntax-parameter syntax-option syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-parameter syntax-shell\"> -</span>s</span> <span class=\"syntax-meta syntax-group syntax-expansion syntax-parameter syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-variable syntax-shell\">$</span><span class=\"syntax-variable syntax-other syntax-readwrite syntax-shell\">D</span></span> shell settings put global <span class=\"syntax-meta syntax-group syntax-expansion syntax-parameter syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-variable syntax-shell\">$</span><span class=\"syntax-variable syntax-other syntax-readwrite syntax-shell\">k</span></span> 0.75</span>\n<span class=\"syntax-keyword syntax-control syntax-done syntax-shell\">done</span>\n\n<span class=\"syntax-keyword syntax-control syntax-for syntax-shell\">for</span><span class=\"syntax-meta syntax-group syntax-for syntax-shell\"> p <span class=\"syntax-keyword syntax-control syntax-in syntax-shell\">in</span> com.google.android.videos com.google.android.play.games <span class=\"syntax-punctuation syntax-separator syntax-continuation syntax-line syntax-shell\">\\\n</span>         com.google.android.feedback com.google.android.partnersetup</span><span class=\"syntax-keyword syntax-operator syntax-logical syntax-continue syntax-shell\">;</span> <span class=\"syntax-keyword syntax-control syntax-do syntax-shell\">do</span>\n  <span class=\"syntax-meta syntax-function-call syntax-shell\"><span class=\"syntax-variable syntax-function syntax-shell\">adb</span></span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-shell\"><span class=\"syntax-variable syntax-parameter syntax-option syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-parameter syntax-shell\"> -</span>s</span> <span class=\"syntax-meta syntax-group syntax-expansion syntax-parameter syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-variable syntax-shell\">$</span><span class=\"syntax-variable syntax-other syntax-readwrite syntax-shell\">D</span></span> shell pm disable-user<span class=\"syntax-variable syntax-parameter syntax-option syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-parameter syntax-shell\"> --</span>user</span> 0 <span class=\"syntax-meta syntax-group syntax-expansion syntax-parameter syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-variable syntax-shell\">$</span><span class=\"syntax-variable syntax-other syntax-readwrite syntax-shell\">p</span></span></span>\n<span class=\"syntax-keyword syntax-control syntax-done syntax-shell\">done</span>\n</span></span></code></pre>\n<p>Everything can be undone with <code>adb shell pm enable &lt;package&gt;</code> (or <code>adb shell cmd package install-existing &lt;package&gt;</code> for YouTube). Turn Wireless debugging off when you’re done.</p>\n<p>That’s it: no banner, no ads, and a remote that opens the apps you actually use.</p>\n",
  "content_markdown": "I like Android TV. It runs every app I care about, it’s cheap on a [Chromecast](https://store.google.com/product/chromecast_google_tv), and it’s built into plenty of TVs. What I don’t like is ads.\n\nGoogle TV, the default interface on most Android TV devices, puts a large banner at the top of the home screen promoting whatever Google wants you to watch next. **Apps only mode** is supposed to strip the home screen down to your apps, but the banner stays. There’s no setting to change the launcher, and YouTube adds its own ads on top.\n\n![The Google TV home screen in Apps only mode, still showing a large promotional banner](https://cretezy.com/2026/ad-free-android-tv) *Before: Google TV, in Apps only mode*\n\nAfter setting up a few devices around the house, I landed on a setup with no ads at all, and a nicer interface to go with it.\n\n## The setup\n\n- [**Projectivy Launcher**](https://play.google.com/store/apps/details?id=com.spocky.projengmenu) replaces the home screen. It shows your apps and nothing else, and it’s very customizable.\n- [**SmartTube**](https://github.com/yuliskov/SmartTube) replaces YouTube, with no ads, a better interface, and [SponsorBlock](https://sponsor.ajay.app/) built in. I still pay for YouTube Premium to support creators, but I vastly prefer SmartTube to the official app.\n- [**Wholphin**](https://play.google.com/store/apps/details?id=com.github.damontecres.wholphin) is my preferred [Jellyfin](https://jellyfin.org/) client, for its UI and customization options.\n- [**Button Mapper**](https://play.google.com/store/apps/details?id=flar2.homebutton) remaps the remote, so the YouTube button opens SmartTube.\n\n![My Projectivy Launcher home screen, with just my apps](https://cretezy.com/2026/ad-free-android-tv) *After: Projectivy Launcher*\n\n![The SmartTube home screen](https://cretezy.com/2026/ad-free-android-tv) *SmartTube, blurred*\n\nI’ve set this up on two Chromecasts with Google TV and a Hisense TV, and it should work on most Android TV devices.\n\n## Tutorial\n\n> **Tip:** Hand this article to an AI agent (like [Claude Code](https://claude.com/claude-code)) and have it guide you through the setup. It can run the ADB commands for you and adapt them to your device.\n\nInstall the apps first. Projectivy, Wholphin, and Button Mapper are on the Play Store, and SmartTube can be sideloaded with [Downloader](https://play.google.com/store/apps/details?id=com.esaba.downloader). The rest needs [ADB](https://developer.android.com/tools/adb).\n\n### Connecting ADB\n\nEnable Developer options by clicking **Settings → System → About → Android TV OS build** 7 times. Then, in **Developer options**, enable **Wireless debugging** and choose **Pair device with pairing code**:\n\n```bash\nadb pair <ip>:<pairing-port> <code>\nadb mdns services # Find the connect port\nadb connect <ip>:<connect-port>\n\nD=<ip>:<connect-port> # Used in the commands below\n```\n\nWireless debugging only works over Wi-Fi. If your device doesn’t have it (like my Hisense TV), enable **USB debugging** instead and connect with `adb connect <ip>:5555`.\n\n### Replacing the launcher\n\nProjectivy has an **Override current launcher** option, but the stock home screen still flashes before it. Instead, disable the stock launcher and the package that restores it, then set Projectivy as the home app:\n\n```bash\nadb -s $D shell pm disable-user --user 0 com.google.android.apps.tv.launcherx\nadb -s $D shell pm disable-user --user 0 com.google.android.tungsten.setupwraith\nadb -s $D shell cmd package set-home-activity com.spocky.projengmenu/.ui.home.MainActivity\n```\n\nOn a TV, the stock launcher may also handle switching HDMI inputs, so check that still works afterward.\n\n### Replacing YouTube\n\nOnce SmartTube is set up, remove the official app:\n\n```bash\nadb -s $D uninstall com.google.android.youtube.tv\n```\n\nIf it’s built into the firmware (`DELETE_FAILED_INTERNAL_ERROR`), use `adb -s $D shell pm uninstall --user 0 com.google.android.youtube.tv` instead.\n\n### Remapping the remote\n\nButton Mapper and Projectivy both need their accessibility services enabled. This replaces the whole list, so check the current one first with `adb -s $D shell settings get secure enabled_accessibility_services` and keep anything else you use:\n\n```bash\nadb -s $D shell settings put secure enabled_accessibility_services \\\n  'flar2.homebutton/a.i:com.spocky.projengmenu/com.spocky.projengmenu.services.ProjectivyAccessibilityService'\nadb -s $D shell settings put secure accessibility_enabled 1\n```\n\n> Use Projectivy’s full component name, as above. With the short form (`com.spocky.projengmenu/.services...`), Projectivy shows **Enabled: No** even though the service is running.\n\nAndroid sometimes turns accessibility services off. Granting Button Mapper `WRITE_SECURE_SETTINGS` lets it turn itself back on, and exempting it from battery optimization keeps it responsive:\n\n```bash\nadb -s $D shell pm grant flar2.homebutton android.permission.WRITE_SECURE_SETTINGS\nadb -s $D shell dumpsys deviceidle whitelist +flar2.homebutton\n```\n\nThen, in Button Mapper, map the YouTube button to SmartTube.\n\n### Cleaning up\n\nWhile you’re connected, speed up animations and disable some Google apps you probably won’t use:\n\n```bash\nfor k in window_animation_scale transition_animation_scale animator_duration_scale; do\n  adb -s $D shell settings put global $k 0.75\ndone\n\nfor p in com.google.android.videos com.google.android.play.games \\\n         com.google.android.feedback com.google.android.partnersetup; do\n  adb -s $D shell pm disable-user --user 0 $p\ndone\n```\n\nEverything can be undone with `adb shell pm enable <package>` (or `adb shell cmd package install-existing <package>` for YouTube). Turn Wireless debugging off when you’re done.\n\nThat’s it: no banner, no ads, and a remote that opens the apps you actually use.\n",
  "dateCreated": "2026-10-20T07:25:43.733405278+00:00",
  "date_created": "2026-10-19T22:32:37+00:00",
  "date_modified": "2026-10-19T22:32:37+00:00",
  "date_published": "2026-10-19T22:32:37+00:00",
  "description": "I like Android TV. It runs every app I care about, it’s cheap on a Chromecast, and it’s built into plenty of TVs. What I don’t like is ads. Google TV, the default interface on most Android TV devices, puts a large banner at the top of the…",
  "external_url": "https://cretezy.com/2026/ad-free-android-tv",
  "git": {
    "commit": "ebb0941c5c06a2ab2377342d607535262a3e969e",
    "path": "items/hnrss-org/2026/10/2026-10-19-an-ad-free-android-tv.md",
    "permalink": "https://github.com/aymericbeaumet/aggr-instance/blob/ebb0941c5c06a2ab2377342d607535262a3e969e/items/hnrss-org/2026/10/2026-10-19-an-ad-free-android-tv.md"
  },
  "id": "urn:aggr:item:bf352986dd5813c385420e52f1f92b72045d0eb3",
  "isBasedOn": {
    "@id": "https://cretezy.com/2026/ad-free-android-tv"
  },
  "mainEntity": {
    "@id": "https://cretezy.com/2026/ad-free-android-tv",
    "@type": "CreativeWork",
    "archivedAt": {
      "@id": "https://aggr.aymericbeaumet.com/items/hnrss-org/2026-10-19-an-ad-free-android-tv/#webpage"
    },
    "author": [
      {
        "@type": "Person",
        "name": "CraftThatBlock"
      }
    ],
    "dateModified": "2026-10-19T22:32:37+00:00",
    "datePublished": "2026-10-19T22:32:37+00:00",
    "headline": "An ad-free Android TV",
    "image": {
      "@type": "ImageObject",
      "caption": "The Google TV home screen in Apps only mode, still showing a large promotional banner",
      "height": 90,
      "url": "https://cretezy.com/_astro/google-tv-home.DjqU9jQc_Z14wlzx.webp",
      "width": 160
    },
    "timeRequired": "PT4M",
    "url": "https://cretezy.com/2026/ad-free-android-tv",
    "wordCount": 722
  },
  "name": "Archived snapshot: An ad-free Android TV",
  "preview": {
    "alt": "The Google TV home screen in Apps only mode, still showing a large promotional banner",
    "color": null,
    "height": 90,
    "placeholder": {
      "data_url": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNk+A8AAQUBAScY42YAAAAASUVORK5CYII=",
      "hash": ""
    },
    "url": "https://cretezy.com/_astro/google-tv-home.DjqU9jQc_Z14wlzx.webp",
    "width": 160
  },
  "reading_minutes": 4,
  "replicated_at": null,
  "source": "hnrss-org",
  "source_name": "Hacker News: Front Page",
  "summary": null,
  "tags": [],
  "temporalCoverage": "2026-10-20T07:25:43.733405278+00:00",
  "title": "An ad-free Android TV",
  "url": "https://aggr.aymericbeaumet.com/items/hnrss-org/2026-10-19-an-ad-free-android-tv/",
  "word_count": 722
}