Living room · Toshiba Fire TV · October 2026

How I Took the Ads Off My TV

I turned off 37 services on my Fire TV and replaced its home screen with one I wrote myself. On the stock screen, the apps I actually use took up a few percent of the picture. Now they take up all of it.

TV Home, my replacement: the clock, the weather and my apps, with no ads Amazon's home screen colored by who each part is for: the ad banner, Amazon's picks, Amazon's menu, and my apps Amazon's home TV Home, mine
Drag the handle to compare. Left: Amazon's home screen, measured pixel by pixel from a 3840 x 2160 screenshot. The rows Amazon picked are blurred because they're built from what my household watches, and they keep going as you scroll. Right: the home screen I built.
The TV

It's a Toshiba 50LF621U19, a Fire TV Edition set: Fire OS 6.7.1.1 (Android 7.1.2 underneath) with 1.5 GB of RAM. It had gotten slow, and every press of Home opened a wall of ads.

It also has no physical remote. The only remote is the Fire TV app on my phone, which turned out to matter a lot.

The work came in two parts. First I switched off Amazon's ad, tracking and extra services, without uninstalling anything. Then I built a small Android app to replace the home screen, because Amazon draws the banner ads itself and won't let you turn that off.

Measuring the screen

Turning off 37 services didn't remove a single ad

I pulled the screenshot straight off the TV with adb exec-out screencap -p and found each region's pixel edges in a script rather than eyeballing them. The ad banner runs from row 0 to row 1032 at full width. Amazon's picks start at row 1351. My six app tiles are 290 by 162 pixels each, which is how six whole apps add up to 3.4%.

I took that screenshot after the debloat below, and that's the point: the home screen app draws the ads itself, so switching off services doesn't touch them. Getting rid of them took Part 2.

Part 1 · The debloat

Switching things off, without uninstalling anything

Every change in this part is reversible with one command, and nothing was deleted from the TV.

Fire TV is Android underneath, so it speaks ADB (Android Debug Bridge), the same tool developers use to talk to phones. You turn on Settings > Device & Software > Developer Options > ADB debugging, then connect from a laptop on the same Wi-Fi:

adb connect <tv-ip>:5555

The command that does the work is:

adb shell pm disable-user --user 0 <package>

That tells Android's package manager to switch an app off for the TV's one user. The app stays installed; it just can't run, start at boot or show up. pm enable <package> brings it back. No root, no unlocked bootloader.

Before touching anything I saved a snapshot: every installed package and its state, every system setting, and the memory numbers. Then I went in small batches, grouped by what the services do, and checked after each one that the phone remote, the Xbox input and Netflix still worked. A small script disabled each package and logged it, so a matching restore.sh could put any batch back. After the first batch the TV already felt much faster.

Line by line

The 37 things I turned off

11 were for ads, tracking and telemetry. The other 26 were Amazon extras nobody in the house used. Where a package only has a codename, I describe it the way it identified itself on the TV and say so.

  • Ads, tracking, telemetry 11
  • Extras I never used 26

Ads and tracking

7
  • com.amazon.hybridadidserviceThe advertising ID: the identifier ad networks use to recognize the device
  • com.amazon.kso.blackbirdSpecial Offers, Amazon's sponsored-content service
  • com.amazon.sneakpeekSneak Peek
  • com.amazon.cevicheAn event tracker (codename)
  • com.amazon.shoptv.clientAmazon Shopping on the TV
  • com.amazon.shoptv.firetv.clientAmazon Shopping, the Fire TV half
  • com.amazon.tv.democontent.providerStore demo content, meant for TVs on a store shelf

Telemetry

4
  • com.amazon.perfcollectionPerformance data collection
  • com.amazon.tv.fw.metricsFire TV framework metrics
  • com.amazon.wirelessmetrics.serviceWi-Fi metrics
  • com.amazon.dp.loggerA device logger

Amazon apps and extras

11
  • com.amazon.imdb.tv.android.appFreevee (formerly IMDb TV)
  • com.imdb.livingroom.firetvIMDb's TV app
  • com.amazon.minitv.android.appAmazon miniTV
  • com.amazon.bueller.musicAmazon Music
  • com.amazon.bueller.photosAmazon Photos
  • com.amazon.bueller.notificationA notification service (codename; disabled by name, see below)
  • com.amazon.gamehubGameHub
  • com.amazon.cloud9Silk, Amazon's web browser
  • com.amazon.tahoeAmazon Kids
  • com.amazon.tmm.tutorialA setup tutorial
  • com.amazon.tv.releasenotesThe "what's new" release notes tutorial

Alexa extras

9

The Alexa core (com.amazon.vizzini) stayed on, so voice search from the phone app still works. These are the pieces around it.

  • com.amazon.alexamediaplayer.runtime.ftvAlexa's media player
  • com.amazon.alexa.externalmediaplayer.fireosAlexa's external media player
  • com.amazon.tv.alexaalertsAlexa alerts
  • com.amazon.tv.alexanotificationsAlexa notifications
  • com.amazon.cardinalAlexa cards (codename)
  • com.amazon.aiondecAlexa skills (codename)
  • com.amazon.wha.mediabrowserserviceA media-browser hook for Alexa audio
  • com.amazon.spotify.mediabrowserserviceA media-browser hook for Spotify through Alexa
  • com.amazon.audiohomeAlexa's audio home (disabled by name, see below)

Screensaver

1
  • com.amazon.ftv.screensaverAmazon's screensaver. Swapped for Android's built-in color screensaver

Leftovers found in round 2

5
  • com.snei.vue.firetvPlayStation Vue, a TV service that shut down in 2020
  • com.amazon.hedwigFire TV Channels
  • com.amazon.ariaAmazon's pop-up surveys
  • com.amazon.tv.localgalleryThe USB photo viewer
  • com.android.printspoolerThe print spooler, on a TV with no printer

Two of these, the notification service and audio home, I disabled by name without first checking what they contained. If system pop-ups ever stop appearing, the notification service is the first thing to turn back on; if anything audio breaks, audio home.

Beyond the 37

Background limits, settings, and what Amazon wouldn't let me touch

Background limits, 11 apps. Several streaming apps loaded themselves at power-on and sat in memory whether anyone used them or not. This command stops that without breaking the app:

adb shell cmd appops set <package> RUN_IN_BACKGROUND ignore

The app still opens and plays normally; it just can't run while nobody is using it. I applied it to Paramount+, Hulu, Max, Peacock, Disney+, YouTube, Apple TV, TNT, Adult Swim, ABC and Fox Sports. Netflix and Prime Video, the two we use most, were left alone. Android also logs when each app last played audio, which showed some of these hadn't been opened in over a year and a few never.

Settings, 5.

SettingWasNow
screensaver_componentsAmazon's screensaverAndroid's Colors screensaver
screensaver_default_componentAmazon's screensaverAndroid's Colors screensaver
window_animation_scale1.00.5
transition_animation_scale1.00.5
animator_duration_scale1.00.5

Halving the animation scales makes every menu transition take half as long, which makes a 1.5 GB TV feel noticeably snappier.

Refused, 6. Amazon marks these as protected, and pm disable-user simply fails on them: the ad deep-linker com.amazon.ftvads.deeplinking, two metrics services com.amazon.client.metrics and com.amazon.device.metrics, the crash and log managers com.amazon.device.crashmanager and com.amazon.device.logmanager, and an analytics service, com.amazon.diode.

Amazon's home screen app (com.amazon.tv.launcher) is protected the same way, which is why the ads survived everything above. Without root, Fire OS also refuses finer-grained switches, like turning off just one app's start-at-boot hook.

Off limits

What I left alone, on purpose

The most important list in this project is the one I never touched, because one wrong disable here leaves a TV with no remote.

KeptWhy
storm.lightning.services, whisperlink.core.android, whisperplay.*, tcomm*, dialservice, ssdpservice, communication.discovery, firerestapiframework, tv.turnstileThe phone app is my only remote. These find the TV on the network, pair it (turnstile shows the pairing PIN) and carry the button presses. Break them and the TV can't be controlled at all.
com.mstar.*, franktvinput, tifobserver, tv.inputpreference.service, tv.livetv, tv.channelscan, providers.tv, tv.devicecontrol*The HDMI inputs. My Xbox is on HDMI 1.
com.amazon.vizziniAlexa's core, which voice search from the phone app needs.
com.amazon.veneziaThe Appstore, which keeps the streaming apps updated.
firebat, avodPrime Video.
impAmazon account sign-in.
prism, aca, adepProfile linking, account sync, and device security.
tv.launcher, tv.imeAmazon's home screen and the on-screen keyboard.

After the final restart I checked the phone app, the Xbox input, Netflix and Disney+ (one of the background-limited apps). All four worked.

Part 2 · TV Home

Writing my own home screen

Since Amazon draws the ads itself and won't let its home screen be disabled, I wrote a replacement: a small sideloaded Android app I call TV Home. The hard part wasn't the screen. It was getting Fire OS to show it.

On a normal Android TV you install a launcher and pick it as the default. Fire OS blocks that and every other clean way in. Here's everything I tried, all tested on this TV:

TriedResult
Set the default home app (cmd package set-home-activity)Says "Success", then keeps Amazon's home anywayRefused
Amazon's "Home pressed" broadcastLocked to Amazon-signed appsRefused
An accessibility service that watches which window is openFire OS erases the setting the instant it's writtenRefused
Android's standard "home key" broadcastNever sent on this buildRefused
Amazon's input switcher, for an Xbox tileEvery permission it needs is Amazon-onlyRefused
Usage events, Android's log of which app came to the frontSees Amazon's home appearWorks
An overlay window, the kind chat bubbles useCovers Amazon's home about a quarter second after HomeWorks
Android's TV input API, pointed at HDMI 1The Xbox tile switches to the Xbox itselfWorks

So TV Home works like this. A small background service reads the usage events every 100 ms while the screen is on. The moment Amazon's home comes to the front, it reveals an overlay with my home screen, already built and waiting, so you never see Amazon's. Android holds new apps back for about 5 seconds after Home is pressed (only system apps are exempt), so the overlay covers until the real home screen takes over.

Both permissions it needs are granted once over ADB:

adb shell cmd appops set work.clendenin.tvhome GET_USAGE_STATS allow
adb shell cmd appops set work.clendenin.tvhome SYSTEM_ALERT_WINDOW allow

What's on it, each piece picked from rendered mockups:

  • Most watched: four big tiles, ranked from the TV's own usage history over the past months
  • More: the next apps, plus All apps and Settings
  • An Xbox tile with a small On / Off pill read from the HDMI input's state
  • The clock, the date and the weather from Open-Meteo, a free API with no key, at town-level location
  • A background tint that shifts with the time of day, and nothing bright at night
  • Auto-tidy: coming home closes background apps except the one you just used and the top two
  • A calm screensaver, Aurora: slow color drifting, with no clock or data on it

I built it without Android Studio or Gradle, just the command-line tools: javac to compile, d8 to convert for Android, aapt2 to package and apksigner to sign, then adb install.

The numbers

No ads, and Netflix opens just as fast

I set one rule before building it: a version that makes Netflix open slower doesn't ship. So I timed Netflix cold starts with a script, five runs each, with and without TV Home.

RunNetflix cold start, median of 5Idle CPU on home
Amazon's home, first measurement1,768 ms8.7%
TV Home, first try (failed the rule)1,887 ms3.1%
TV Home, fixed1,842 ms3.0%
Amazon's home, measured again right after1,822 ms8.5%

The first version broke the rule: its watcher kept polling while Netflix was starting up and slowed it by about 120 ms. The fix was to have it back off for a few seconds after any app opens. After that, Netflix was within about 20 ms of plain Fire TV, while plain Fire TV itself drifted 54 ms between two runs, so the difference is noise.

Idle CPU dropped from about 8.6% to 3%, because Amazon's home is always animating its banner and mine sits still. TV Home costs about 45 MB of memory. It doesn't save memory overall, because Amazon's protected home keeps running behind mine: this was a win for ads and looks, not for RAM.

Debugging

Three bugs worth telling

The TV's clock ran ahead of itself

Pressing Home sometimes flashed Amazon's screen for a moment, and once it stayed up for 38 seconds. On this TV, the timestamps on usage events run 0.5 to 39 seconds ahead of the system clock. My app asked for "events up to now", so a fresh event stamped in the future was invisible until the clock caught up. The fix was one line: ask for events up to a time far in the future. Now about half of Home presses are covered within 50 to 100 ms, with no visible frame of Amazon's screen, and the rest in about half a second, which is Android itself recording the event late.

The screensaver used a quarter of the CPU

Aurora first drew a 640 x 360 picture and scaled it up to the 4K screen in software, 20 times a second: 25% CPU. Halving the size and dropping to 15 fps got it to 17%. The real fix was handing the scaling to the display hardware (a fixed-size SurfaceView buffer of 320 x 180, at 10 fps): about 8%, and it looks the same, because slow color drifts don't need detail.

"Most watched" put the wrong app first

Asking Android for 60 days of usage at once quietly returned coarse buckets and ranked Max first, which isn't what we watch most. Reading four weeks of weekly records, plus six months of monthly records counted at a tenth, gave the right order.

If you try this

Undoing it, and what I'd tell you first

All of it comes back with two scripts: restore.sh re-enables every package, setting and background limit from the log, and revert-home.sh puts Amazon's home screen back (and can uninstall TV Home). Any single package is just adb shell pm enable <package>.

  1. Snapshot first. Save pm list packages and the three settings list outputs before you change anything, so you know what normal was.
  2. Find out what your remote depends on. If a phone app is your remote, the services in my "left alone" table are off limits. Disabling the wrong one leaves you with no way to control the TV.
  3. Go in small batches and test between them. Remote, inputs, and the apps you actually watch, every time.
  4. Log every change, so undoing it is a script and not a memory test.
  5. Expect a Fire OS update to turn some of it back on. Compare pm list packages -d against your log and re-run.
  6. Turn ADB debugging off when you're done. Left on, anything on your Wi-Fi can try to connect to the TV.

I did this with Claude Code, an AI coding assistant: it ran the ADB commands and wrote the Android code, and I made the calls on what to cut, what the screen looked like, and tested everything on the TV.