My phone’s home screen has always bothered me. Launchers pile on widgets, icon packs, animations, and customization menus that I’ll open once and never touch again. The default AOSP launcher is cleaner, but still defaults to an icon grid that I find visually noisy.
What I actually want: a list of the apps I use most, a search bar that finds anything else, and my wallpaper. That’s it.
PicoLauncher is what I built.
What it is
PicoLauncher is a minimal Android home screen launcher written entirely in Kotlin. By default, the home screen shows a short list of pinned or recent apps as text — no icons. Swipe up to open the full app drawer with live search. Swipe left or right to open apps you’ve assigned to those gestures.
There’s also a “hold-to-reveal” mode where long-pressing the home screen opens a radial icon menu — useful if you want quick access to a few apps without cluttering the screen.
Why I built it
The honest answer is that I built it as a learning project. I’d been doing web and backend work for a while and wanted to go deeper on Android development. Writing a launcher turned out to be a great way to learn: you touch deep Android APIs (intent filters, package manager, home screen contracts), you have to handle lifecycle correctly because your app is always running, and the UX constraints are tight enough that every design decision is interesting.
The interesting parts
The Android launcher contract
To be recognized by Android as a launcher, your app needs the right intent filter in its manifest:
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.HOME" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
Simple enough — but there’s a lot more to handle. Back button behavior, the recents API, handling the case where the user installs or uninstalls an app while the launcher is visible, and making sure the launcher survives configuration changes (rotation, dark/light mode) without flickering.
App list and live search
Android’s PackageManager gives you all installed apps via queryIntentActivities. I cache this and update it reactively using a BroadcastReceiver that listens for ACTION_PACKAGE_ADDED, ACTION_PACKAGE_REMOVED, and ACTION_PACKAGE_REPLACED.
The live search filters by both app label and package name (useful for finding apps with opaque names), with fuzzy matching so a partial word still finds what you’re looking for.
Hold-to-reveal radial menu
This was the most visually interesting feature to build. The radial menu opens as a circular arrangement of icons around the press point. Getting the animation right — spring-based expansion from the hold point, icons arranged in a calculated arc — required more custom drawing work than I expected.
I used Canvas drawing on a transparent overlay View rather than trying to position individual ImageViews, which would have required calculating absolute screen coordinates. The draw-everything-yourself approach gave me much more control over the animation curves.
Widgets
Adding widget support late in the project turned out to be the most painful feature. Android’s widget embedding API is old and involves AppWidgetManager, AppWidgetHost, and a manual view inflation flow that’s very different from modern Compose or View-based layouts. The widget configuration intents, the resize handles, and making sure widgets survive launcher recreation all have subtle edge cases.
If I were starting over I’d design the widget slot system earlier — retrofitting it into an existing layout was awkward.
Theming
One feature I’m happy with is the independent theming for the home app list and the full app drawer. You can set different font sizes, typefaces (default, monospace, serif), and text colors for each — so your home screen can be minimal white monospace and your app drawer can be larger colored text. It’s a small thing, but it makes the launcher feel like it was designed for you specifically.
Try it
The project is on GitHub. Clone it, open in Android Studio, and run on any Android 15+ device or emulator. I use it as my daily launcher — the home screen is genuinely just my five most-used apps and a search bar, and I haven’t missed the icon grid at all.