Back to blog

Aerial in 2026: The Open Source Launcher That Makes Android TV Look Like Apple TV

Hello HaWkers, a project created on October 20, 2026 reached 8,188 stars on GitHub in 11 days, and it is not a framework, an AI model or a coding agent. It is a home screen for televisions. Aerial, by pengchujin, is a Kotlin launcher under the MIT license that copies the calm of Apple TV: your apps, a wallpaper and the aerial films as a screensaver, with no ads and no recommendation rows.

What caught my attention was not the look. It was the question the project answers: how does a 3 MB app, with no root and no changes to system apps, remain the home screen of a TV whose manufacturer does everything to stop it? In this article you will see what Aerial delivers, how the engineering behind it works, what the risks really cost and what this growth teaches about product.

What Aerial Is and Why It Grew So Fast

The product thesis fits in one sentence from the README itself: a calm home screen for Android TV. In practice, version v1.75, published on October 31, 2026, brings:

  • Home screen: a row of favorites on a glass shelf and all your apps right below, including system apps that usually stay hidden.
  • Organization: holding OK moves, groups into a folder, hides or uninstalls. You can pin an HDMI input with its own name and icon.
  • Phone control: you scan a QR code on the TV and drag the tiles around on your phone screen.
  • Screensaver: the 114 Apple TV aerial films, in 4K or 4K Dolby Vision when the TV supports it, plus photos, a clock and local videos.
  • Wallpaper: Bing's photo of the day, 14 ready-made images or photos sent from your phone.

The films belong to Apple and are played from its servers, as the project itself explains. Aerial also makes it clear that it is independent and has no relationship with Apple, Xiaomi or TCL.

The audience matters here

The declared target is TVs sold in China: Xiaomi, TCL, Skyworth, Sony and others. There, the manufacturer's home screen comes packed with show recommendations and subscription badges, and the system usually accepts only the brand's own launcher. This detail explains the entire architecture we are about to see, and it also limits what you should expect if you own a TV bought in Brazil.

If you have dealt with this annoyance before, you probably know another path. In the tv-vibehack guide to removing ads from Android TV with ADB, the strategy is to disable packages. Aerial goes in the opposite direction: it turns nothing off in the system, it just puts itself in front. These are different approaches to the same problem, and it is worth understanding which one makes sense for your TV.

The First Problem: Convincing the System That You Are the Home Screen

On Android, a home screen is just an Activity that declares the HOME category. On standard Android TV, that solves almost everything: you press Home, the system asks which app to use, you choose Always and you are done. The README is direct: in this scenario, nothing that comes next is necessary.

The interesting part is what happens on modified TVs. Each firmware invents its own way of firing the Home button, and Aerial's manifest has become a catalog of these variations. This is an adapted excerpt from the project's real manifest:

<!-- A single filter covers the variations of each firmware -->
<activity android:name="app.orchard.tv.MainActivity">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />

        <!-- The standard case for any Android launcher -->
        <category android:name="android.intent.category.HOME" />
        <category android:name="android.intent.category.DEFAULT" />

        <!-- CVTE firmware sends Home with this extra category -->
        <category android:name="android.intent.category.COMMON_HOME" />

        <!-- China Mobile's NEWBOX sends Home with LAUNCHER -->
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>

    <!-- Private category used by Coocaa firmware -->
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.HOME.CC" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

Notice a detail that is easy to miss: for an Intent to match a filter, every category in the Intent must be in the filter. That is why listing extra categories does not hurt the common case, and a single missing category leaves the Home button with no response. That is exactly what happened on the NEWBOX, according to the manifest comment: Home simply did nothing.

The same file holds another gem. The installation verifier on TCL firmware only lets an APK that declares HOME through if it has the same signature as the current home screen and carries a com.tcl.app.type tag. And some TVs flatly refuse to install home screen apps, which is why the project distributes, besides the standard APK, a guard variant for those cases.

The Second Problem: When the Manufacturer Will Not Accept Another Launcher

Most TVs sold in China ignore your preference. If you cannot be the official home screen, the way out is to come back to the front every time the official one appears. That is what HomeGuardService does, using an accessibility service.

The version below is my own teaching simplification to show the idea. The project's real service handles dozens of per-device cases:

import android.accessibilityservice.AccessibilityService
import android.content.Intent
import android.view.accessibility.AccessibilityEvent

class HomeGuardSimplificado : AccessibilityService() {

    // Packages of the manufacturer's home screens, discovered on connect
    private val launchersDeFabrica = setOf("com.mitv.tvhome")

    override fun onAccessibilityEvent(evento: AccessibilityEvent) {
        // We only care about which window came to the front
        if (evento.eventType != AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED) return

        val pacote = evento.packageName?.toString() ?: return
        if (pacote !in launchersDeFabrica) return

        // The manufacturer's launcher appeared: bring ours back
        val intent = packageManager
            .getLaunchIntentForPackage(packageName)
            ?.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
        startActivity(intent)
    }

    override fun onInterrupt() = Unit
}

The package name in this example is illustrative. The real code discovers the list by querying what responds to HOME, and it only acts while Aerial is not the app resolved for that Intent. When it is the default, the system itself does the work.

The most delicate point is privacy. An accessibility service is one of the most powerful permissions on Android, and the project states that it reads only which window is in front, never the screen content. Since the code is open, that is a claim you can verify, and you do not have to take it on faith.

When not even accessibility works

On older Xiaomi devices running Android 6, the PatchWall home screen fires no window change event at all. The project's solution was to query the system's usage stats once per second to find out what is in front. Polling once a second on a TV is not pretty, but it works where the elegant path does not exist.

The Third Problem: Surviving Standby

This is the part I liked the most. According to comments in the project's code, Xiaomi force-stops every third-party app when the TV enters standby. And Android, when force-stopping an app, removes its accessibility services from the enabled list. Result: you turn the TV off, turn it back on and the guardian is gone.

Aerial uses two pieces to solve this:

  1. WRITE_SECURE_SETTINGS: a development permission, granted only through ADB, that allows it to put its own service back on the enabled list.
  2. NotificationListenerService: the system keeps a notification listener's approval and rebinds that service shortly after the process dies. The project uses this rebinding only to wake up. No notification is read.

See the idea in a simplified version, again written by me for teaching purposes:

import android.provider.Settings
import android.service.notification.NotificationListenerService

class ReviverSimplificado : NotificationListenerService() {

    // The system rebinds this service after the process dies
    override fun onListenerConnected() {
        val servico = "$packageName/$packageName.HomeGuardSimplificado"
        val chave = Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES

        // Reads the current list of enabled services
        val atual = Settings.Secure.getString(contentResolver, chave).orEmpty()
        if (servico in atual) return

        // Requires WRITE_SECURE_SETTINGS, granted beforehand through ADB
        val nova = listOf(atual, servico)
            .filter { it.isNotEmpty() }
            .joinToString(":")
        Settings.Secure.putString(contentResolver, chave, nova)
    }
}

It is a creative use of an API for something it was not built to do. As survival engineering, it is brilliant. As a long-term dependency, it is fragile: a firmware update can close this door, and the project itself records models where it no longer works. On a Thunderbird TV with Android 14, the firmware clears accessibility about once a minute, and taking over the home screen is not possible.

How to Install It and How to Check the Result

First of all, enable ADB debugging on the TV. On a regular Android TV, the path is usually Settings, About, seven taps on Build and then USB Debugging in the developer options. On TVs with Android 11 or higher that only offer Wireless Debugging, you need to pair with adb pair first.

The README's manual installation is short. I commented each step so you know exactly what you are authorizing:

# Connects to the TV over the local network (replace with your TV's IP)
adb connect 192.168.1.20:5555

# Installs the APK downloaded from the project's releases page
adb install -r aerial-standard.apk

# Allows putting the accessibility service back after a force stop
adb shell pm grant app.orchard.tv android.permission.WRITE_SECURE_SETTINGS

# Authorizes the listener that only serves to revive the app
adb shell cmd notification allow_listener app.orchard.tv/app.orchard.tv.guard.RevivalListener

# Allows drawing over other apps and opens the launcher
adb shell appops set app.orchard.tv SYSTEM_ALERT_WINDOW allow
adb shell am start -n app.orchard.tv/.MainActivity

# About 5 seconds after opening, compiles to make the interface smoother
adb shell cmd package compile -m speed -f app.orchard.tv

Then check for real, instead of trusting the visual impression:

# Which app the system resolves as the home screen
adb shell "cmd package resolve-activity --brief -a android.intent.action.MAIN -c android.intent.category.HOME"

# Which accessibility services are active
adb shell settings get secure enabled_accessibility_services

# Press Home on the remote and see what is in focus: app.orchard.tv should appear
adb shell "dumpsys window | grep mCurrentFocus"

To undo it, the project offers a restore mode in the install script, which brings back the original home screen without uninstalling Aerial, and its guide lists the adb commands one by one for those who prefer to do it by hand. According to the README, nothing in the system is changed, so your apps, subscriptions and accounts stay as they were.

The Real Risks Before You Install

This is the part the "new TV in 5 minutes" videos skip. Weigh each point:

ADB turned on is an open door. With the KEEP_ADB=1 option, Aerial turns ADB back on when the TV disables it in standby, which helps with updates but keeps a debugging service reachable on the local network. If your network has guests or devices you do not trust, consider leaving it off.

curl | bash demands trust. The project offers a one-line install command. Prefer to download the script, read it and only then run it, or follow the manual steps above.

So does installing through an AI agent. The README suggests pasting a prompt into an agent that runs commands on your computer. It is practical, but you are handing a terminal to an instruction that comes from an external page. Read the guide first, and check the result with the commands above.

Side effects exist. The HomeGuardService comment records that, with the key filter on, some keys pass through the service and certain apps see a tap as a press, moving twice. That is why this filter only operates up to Android 11.

Not everything goes away. The boot ad comes from the firmware and stays there, as the README admits. And the supported TV table is largely made up of user reports on Chinese market models. I did not find specific validation for models sold in Brazil, so treat your TV as untested territory.

Aerial or Another Launcher: Which One Makes Sense

If your TV runs global market Android TV or Google TV, Aerial is not the only option:

Launcher License Strength Watch out for
Aerial MIT, open Apple TV style look and aerial films Declared focus on Chinese market TVs
Projectivy Freemium, one-time payment The most recommended in reviews Requires accessibility to force the switch and uses more resources, according to users
FLauncher Open Lightweight, good for TVs with little storage Check compatibility with your TV before installing

One caveat applies to all of them: changing the launcher changes what you see, but the original launcher stays installed and may keep running in the background. If you want to save memory, you need to combine the switch with disabling packages, and then the risks are different.

What Product Builders Can Learn From This

Even if you never install Aerial, the repository is a lesson, and these are the three takeaways I keep from it.

A specific pain beats a generic promise. The project does not say "the most customizable launcher". It says it delivers a clean screen. The comparison table at the top of the README, with the original screen next to the new one, sells more than any feature list.

Compatibility can become community. The TV table is maintained with user reports linked to public issues. The manifest comment already cites issue #983, and the device support form turns each strange TV into a field test. A solo dev would never have all these devices on the desk.

AI agents have become an installation channel. The project treats the agent as a first-class user: it has its own guide, asks for the raw command output and says what to check at the end. Installing requires ADB, an IP and permissions, which would scare off almost everyone. Outsourcing that complexity to an agent is a distribution decision, not a code decision. Whether or not you like the idea, it is a sign of where the install experience for technical tools is heading, and it brings along the risks I mentioned.

What to Expect From Here

Fast growth comes at a price. v1.74 and v1.75 shipped a few hours apart on October 31, which points to an intense pace, but also to a project still in motion and dependent on whoever maintains it. A firmware update can break the strategy on certain brands, and Android itself may tighten the permissions used here. If your TV accepts a default launcher the normal way, you are less exposed to this, because you do not need the guardian.

The bigger lesson is that the TV home screen has become ad space, and 8,188 stars in 11 days show how many people want back control of what they bought.

Let's go! 🦅

📚 Want to Keep Up With What Is Coming?

This article covered the Aerial launcher and the engineering that keeps a clean home screen on Android TV, but the ecosystem changes every week and not everything becomes an article here.

On X I share what I am testing, behind the scenes of my projects and the news that shows up before it turns into a post.

Follow Me There

👉 Follow @jeffbruchado on X

💡 Daily content about development, career and the tools I actually use

Comments (0)

This article has no comments yet 😢. Be the first! 🚀🦅

Add comments