every screen time app i tried had the same hole in it. you set a limit, the limit arrives, a polite sheet appears, you tap “ignore for 15 minutes”, and nothing has happened. no cost. no friction. just a small negotiation you win every single time.
so screenfine has a cost. cross your limit and you get fined. a small amount, not a punishment you feel in your rent, but a real number that leaves.
and you can earn it back. do pushups, squats or situps in front of the camera and the app counts them. or hit a step target, log a workout, log mindful minutes. or press the honor button, which is there because a system with no escape hatch just gets deleted.
$1 a week. built in expo sdk 54 and react native 0.81 with native swift modules underneath.
the whole product is one apple approval
none of this works without the familycontrols entitlement. that is the api that lets an app shield other apps at the os level, and apple does not hand it out casually. you apply, you explain the use case, you wait.
mine was approved, scoped to a user managing their own device.
everything else in screenfine is code i could write again in a month. that approval is the part i could not have engineered my way around. it is also why the app locks at the os level instead of nagging you inside a wrapper, which turned out to be the thing people liked most when it launched.
the blocklist was the wrong shape
the first version worked how you would expect. pick the apps you want blocked. cross the limit. those apps get shielded.
it did not work in practice, because the failure is never in the app you predicted. you block instagram and lose the evening to a browser tab and youtube.
so in august i inverted it. now everything locks when you breach the limit, except a small allowlist you choose. phone, maps, whatever you genuinely need.
the interesting part of that change was a constraint i had not planned for. application tokens in the familycontrols api are opaque outside the app group, so the app literally cannot display which apps you exempted. it can show a count. that is all. i had to redesign the settings screen around a number.
deleting blocked-apps.tsx and replacing getShieldSelectionInfo() with getAllowedAppsInfo() was fifteen minutes. accepting that the ui would be less informative than i wanted took longer.
strict mode, or, people delete the app
the obvious defeat is deleting screenfine. shield appears, app goes, problem gone.
strict mode is opt in and off by default. cross your daily limit with it on and the app sets denyAppRemoval until the next local day. nothing can be deleted, including screenfine.
that is a genuinely aggressive thing to ship, so it needed release paths that cannot deadlock. there are three. the device activity extension releases it at day rollover or when you drop back under the limit. a 26 hour watchdog on the host app releases it if the extension never fires. and the settings toggle, the shield clear, the jar pause and stop monitoring all release it directly.
there was also a plumbing problem. the deviceactivitymonitor extension cannot read the backend, so the strict mode flag has to be bridged into app group userdefaults for the extension to see it at all. the two halves of this app do not share a brain, and every feature has to be designed for that.
the launch
it won daily winner on daniellaunches.
what i expected people to talk about: the fines. what people actually talked about: the os level lock. the fine is the hook, the lock is the reason it works. that reordered my roadmap.
the top feature request was scheduled lock windows. a doom block. lock these hours regardless of usage, no limit breach required. that is being built.
the other thing i decided after launch is the accountability partner. the app already has a mutual partner feature and a wall. the next version lets your partner approve or deny your requests for extra screen time, and see your weekly fines and redemptions. solo mode stays exactly as it is, because most people will never invite anyone and the app has to be complete without them.
what i had wrong
i thought the differentiator was the money. it is not. plenty of apps take a deposit.
the differentiator is that getting it back costs you something physical, in front of a camera, right now. you cannot buy your way out and you cannot argue with it. that mechanic is not changing. everything since has been friction added around it, not in place of it.
the second thing i had wrong: i designed the home screen dark and severe, because the product is about punishment. it read as hostile. the redesign went the other way, light and rounded and friendly, on the theory that the app should not feel like it is angry at you. the fine does that job on its own.