Android · Free & open source · GPL‑3.0

Stall the scroll.
Keep your thumb.

ThumbStall slips a few seconds of breathing room between your thumb and the apps you doomscroll. Most opens happen on autopilot. A short pause is enough to notice, and closing is always one tap.

Download the APK
  • No INTERNET permission
  • No account
  • No analytics
  • Android 8+

Try a pause

This is what your thumb meets first.

A real recreation of the pause screen, running the same escalation rule as the app's core engine. Open the app again and watch the wait grow.

I
Instagram1st open today
ThumbStall
8breathe in

Still want to scroll?

Take one slow breath. If you open it, pick how long first.

Open for · available in 8s

You closed it instead 0 times this week

pause = min(base + 5s × repeats, 30s)

0times you closed it
1openings this hour
8snext pause

Friction, not punishment

No blocks. No locks. Just a moment to choose.

Breathing pause

A calm countdown before any app you pick. Breathe in for four seconds, out for four.

Escalating delays

Repeat opens within an hour wait five seconds longer each time, capped at thirty.

Session budget

Really need it? Grant yourself 5, 10 or 15 minutes, and that app opens freely until it runs out.

Snooze

Fifteen minutes, an hour, or until tonight. Protection switches itself back on, so you don't have to remember.

Costly override

Turning it off asks for a reason and a 24‑second wait. Enough to beat the impulse, never a trap.

Essentials allowlist

Dialer, messages and maps are never paused, even if you add them by mistake.

Positive stats

See time reclaimed and how often you closed instead. No streaks to lose, no shame metrics.

OEM battery guide

Brand‑specific steps that stop aggressive battery savers from killing protection, plus a health banner if it ever does.

Fully offline

No INTERNET permission at all. No account, no cloud, no analytics, no crash reports.

Anatomy of a pause

From a tap to a breath, in under a second.

A foreground service watches which app comes to the front. Every decision after that is made by a pure Kotlin rules engine with no Android dependencies, tested on the JVM.

  1. 01

    Notice

    UsageStatsManager is polled every 900 ms for the newest foreground app. Detection fails open.

  2. 02

    Let essentials through

    Dialer, SMS and maps always pass, even if they were picked by mistake.

  3. 03

    Respect your choices

    Not a target, snoozed, or inside a session budget? Nothing happens.

  4. 04

    Gate the overlay

    OverlayGate blocks launch loops with a monotonic 1 s cooldown per app.

  5. 05

    Escalate, then breathe

    PauseRules adds 5 s per repeat open in the hour, capped at 30 s. The pause screen appears.

0polling interval
0longest possible pause
0unit tests on the core
0network requests, ever

:core  pure Kotlin

  • PauseRules
  • OverlayGate
  • OpenTracker
  • BudgetTracker
  • SnoozeState
  • StatsWindows

:app  Android

  • MonitorService
  • ForegroundPoller
  • PauseActivity
  • Compose UI
  • Room database
  • BootReceiver

Nothing leaves your phone

The strongest privacy policy is a missing permission.

Designed to be calm

Olive, cream and a lot of quiet.

From the ThumbStall design set. Drag to spin.

Some design screens preview roadmap features such as feed filtering, which are not in v0.1 yet.

Where it's going

v0.1 is out. The reel keeps turning.

v0.1 · shipped

  • Pause screen with breathing countdown
  • App picker, escalation, session budget
  • Snooze and costly override
  • Stats dashboard
  • Onboarding flow

Get it

Two minutes to a calmer thumb.

Install the APK

  1. Download app-foss-release.apk from Releases.
  2. Allow installs from your browser or file manager.
  3. On Android 13+, open Settings → Apps → ThumbStall → ⋮ → Allow restricted settings before granting Usage Access.
Latest release

Build from source

# JDK 17+ and Android SDK 36
git clone https://github.com/suriya4code/ThumbStall.git
cd ThumbStall
./gradlew assembleFossDebug
# → app/build/outputs/apk/foss/debug/

Run the rules engine tests with ./gradlew :core:test.