StepUnlock: walk to unlock, reclaim your life

StepUnlock: a Flutter app that locks your phone until you walk

StepUnlock is a screen time app that blocks your chosen apps until you have walked a daily step goal. WebHive built it end to end: product design, a single Flutter codebase for iOS and Android, app blocking through Apple's Screen Time API, step data from Apple HealthKit and Google Health, subscriptions via Superwall, and a Laravel backend that had to hold when the app unexpectedly went viral.

Our role
Concept, design, build, scaling
Platforms
iOS & Android
Built with
Flutter
Backend
HubMachine (API, admin)

Why blocking apps on iOS is harder than it sounds

The Screen Time API started life as Family Controls on Apple, built for a parent restricting a child's device rather than an adult restricting themselves. Apple widened it during the COVID period so an app can apply limits to the device's own user, which is what makes a product like this possible at all. Access is still gated, and it is one of the more difficult permissions to ship against: you request the entitlement from Apple, justify the use case, and approval is not a formality.

One constraint shapes the entire architecture: you cannot read the names of the apps a user has chosen to block. Selection happens inside Apple's own picker, and what comes back is an opaque token. You can show the user their blocked apps through Apple's UI, but you cannot extract the name, store it, or process it on a server.

That rules out a lot of otherwise obvious features: per-app leaderboards, "you spent four hours on Instagram" emails, analytics on which apps people block most. The product has to be designed around it, with progress, streaks, and stats keyed to goals and step counts rather than to app identity.

How we built it

  • App blocking: Apple Screen Time API. Enforced by the OS through the Family Controls entitlement, so the limit holds rather than politely suggesting you stop.
  • Step tracking: Apple HealthKit and Google Health. Passive. Nothing to log, nothing to remember, no reason to distrust the number.
  • One codebase: Flutter. iOS and Android from a single build, with platform channels bridging to the native Screen Time and Health frameworks.
  • Subscriptions: Superwall. Paywall variants tested and changed without shipping a release or waiting on review.
  • Backend: Laravel on HubMachine. Accounts, entitlements, and stats the client owns outright.
  • Notifications. Push nudges toward the goal while the day is still winnable.
Onboarding screen quantifying hours lost to the phone each week
Onboarding we designed to quantify the habit before asking for commitment.
System-level lock screen shown in place of the blocked app
The Screen Time interception: what appears instead of the app.
Dashboard showing step progress per limited app, weekly chart and streak
Per-app progress from live health data, with streaks to build retention.

We designed the growth loop into the product

Marketing budget was never going to be the growth channel here, so we built the distribution into the moment the app feels best. Earning your apps back produces a card worth posting, "I walked 5,000 steps to earn my screen time", with a Share button already on it.

That decision, made at design time, is why the app spread the way it did. Users posted their unlocks, the clips found an audience, and the audience installed.

Shareable reward screen reading I walked 5,000 steps to earn my screen time
The reward screen, built to be screenshotted and posted.
The build in use, start to unlock.

20,000 signups in a week, and the servers stayed up

Around New Year the app went viral and installs arrived far faster than the infrastructure had been provisioned for. We upgraded the servers mid-surge, without downtime, during the single week that mattered most: the week everybody had just resolved to change their habits.

Shipping an app is one thing. Being available to take the call when it works is a different job, and it is the one that decides whether a viral moment becomes a business.

Viral on TikTok

Users posting their own unlocks. The loop working as designed.

Lowk hate the StepUnlock app 250k views
Lowk hate the StepUnlock app 250k views on TikTok
Block your apps with StepUnlock 32k views
Block your apps with StepUnlock 32k views on TikTok
Curse you StepUnlock 6k views
Curse you StepUnlock 6k views on TikTok

Turning installs into revenue

Growth only pays if the funnel behind it converts. We wired subscriptions through Superwall so paywall variants (trial length, monthly against annual, win-back offers) could be tested and changed without shipping a new release and waiting on review.

We also built the launch site: a deliberately silly landing page carrying the terms, privacy policy, and contact form the app stores require before they will approve a submission. Unglamorous, and the reason review passed first time.

Three subscription paywall variants: annual, monthly, and win-back offer
Paywall variants run through Superwall: annual, monthly, and a win-back offer, all tested without a release.

Stack

Flutter · Apple HealthKit · Google Health · Apple Screen Time API · Family Controls entitlement · Superwall · Push notifications · Laravel API · HubMachine

Frequently asked

Can an app block other apps on an iPhone?
Yes, through Apple's Screen Time API using the Family Controls entitlement. The block is enforced by iOS itself rather than by the app, which is what stops users simply dismissing it. The entitlement has to be requested from Apple with a justified use case.
Can you read which apps a user has blocked?
No. App selection happens inside Apple's own picker and returns an opaque token, not a name or bundle ID. You can display the user's blocked apps through Apple's UI, but you cannot extract, store, or process those names server-side, so features like per-app analytics or leaderboards are not possible.
Was the Screen Time API always available for self-restriction?
No. It began as Family Controls, intended for a parent limiting a child's device. Apple broadened it during the COVID period so an app can apply limits to the device's own user, which is what allows self-control apps like StepUnlock to exist.
Can a Flutter app use Apple's Screen Time API?
Yes. Screen Time is an iOS-native framework, so a Flutter app reaches it through a platform channel bridging to native code. StepUnlock runs one Flutter codebase across iOS and Android with native bridges for Screen Time and health data.
How do you get step data without draining the battery?
By reading it from Apple HealthKit on iOS and Google Health on Android rather than counting steps yourself. The OS is already tracking them, so the app queries an existing source instead of running its own sensor loop.

Need an app built by people who've shipped one that took off?

Health data, OS-level permissions, App Store review, subscription funnels, and infrastructure that survives a spike. We have done all of it on one project. Tell us what you're building and we'll tell you honestly what it takes.

Discuss Your App