Inspiration

We've all had the experience of picking up our phone to check the time and somehow ending up 20 minutes deep in Instagram — not because we decided to, but because our thumb already knew where the icon was. Most digital-wellbeing apps fight this by blocking access outright, which usually just gets uninstalled the first time it's inconvenient. We wanted to try something gentler: keep the app fully accessible, but break the automatic, thoughtless tap by changing where it lives.

What it does

AppMaze is a fully functional Android home screen launcher that periodically rearranges the position of apps you've marked as distracting. Nothing is blocked — every app is one tap away — but your muscle memory can't carry you there anymore, so opening it becomes a small, conscious decision instead of a reflex.

  • Smart scrambling at three intensities (Gentle, Moderate, Strong), tuned to how much movement and how often
  • On-device usage tracking that scores each app's "distraction level" based on daily screen time — nothing leaves the device
  • An intervention dialog that shows your usage for that app before you open it, with an always-available "Open Anyway" — we never wanted this to feel punitive
  • A dashboard showing today's screen time, top apps, and AppMaze's measurable impact (scrambles triggered, estimated time saved)
  • Disguise mode, so a distracting app's icon and label can be swapped for a neutral placeholder on the grid, removing the visual pull entirely while the real app still opens normally underneath
  • Essential apps (Phone, Settings, Emergency) are always protected and never scrambled or disguised

How we built it

AppMaze is a native Android launcher built in Kotlin with Jetpack Compose and Material 3. It uses PackageManager to enumerate installed apps and register as a real HOME activity, UsageStatsManager for on-device screen-time data, Room for persistence (app positions, usage events, per-app settings), and DataStore for user preferences. RevenueCat powers [describe your paywalled feature here] as an in-app purchase, letting us monetize without touching any of the on-device privacy guarantees.

Challenges we ran into

  • Getting scrambling to feel like friction, not chaos — too aggressive and it's just annoying, too subtle and it does nothing
  • Handling UsageStatsManager's permission model gracefully, since Usage Access has to be granted manually in system settings and the app needs to work sensibly before that happens
  • Making sure essential apps (dialer, settings) are never touched by scrambling or disguise, even under edge cases like zero marked apps or rapid app switching
  • Wiring a real purchase flow through RevenueCat without it feeling bolted onto an otherwise fully local, no-login app

What we learned

Building a real Android launcher taught us how much "home screen" behavior is baked into the OS — becoming the HOME activity meant handling back-button quirks, launcher-chooser edge cases, and permission flows (Usage Access has to be granted manually in system settings) that a normal app never has to think about. We had to treat "permission denied" as a first-class state rather than an edge case, since the app still needed to work sensibly without it.

The bigger surprise was behavioral, not technical: we assumed hiding or graying out distracting apps would be the stronger lever, but it turned out that breaking muscle memory through position alone was enough to insert a real moment of hesitation before opening an app. That's what pushed us to add Disguise Mode later — scrambling position wasn't always enough when an app was still instantly recognizable by its icon, so removing the visual pull entirely became a necessary companion feature rather than a nice-to-have.

We also learned how easy it is for "digital wellbeing" features to tip into feeling judgmental. Small wording choices in the intervention dialog — like framing it as "Take a Break" instead of something more shame-based — noticeably changed how the friction felt during testing, even though the underlying mechanic hadn't changed at all.

Finally, integrating RevenueCat pushed us to think carefully about monetization for a privacy-first, no-login app: the goal was a paywall that felt proportionate to one specific feature, without compromising the "everything stays on-device" promise the rest of the app makes.

What's next for AppMaze

  • Home-screen widget support
  • A background service option for more consistent scrambling timing
  • iOS is architecturally impossible for a launcher, but we're exploring a companion "focus mode" for iOS using Screen Time APIs

Built With

  • android
  • android-datastore
  • coroutines
  • jetpack-compose
  • kotlin
  • material-design-3
  • revenuecat
  • room
  • stateflow
Share this project:

Updates

Submission history