<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Martin Ma</title>
    <description>The latest articles on DEV Community by Martin Ma (@jumpingma).</description>
    <link>https://dev.to/jumpingma</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4191247%2F19d019e8-a8a3-4bd0-9788-2a9fd684838b.png</url>
      <title>DEV Community: Martin Ma</title>
      <link>https://dev.to/jumpingma</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jumpingma"/>
    <language>en</language>
    <item>
      <title>Blocking apps failed for me three times. A daily budget plus a counter of every override has held for 21 days.</title>
      <dc:creator>Martin Ma</dc:creator>
      <pubDate>Wed, 21 Oct 2026 02:51:37 +0000</pubDate>
      <link>https://dev.to/jumpingma/blocking-apps-failed-for-me-three-times-a-daily-budget-plus-a-counter-of-every-override-has-held-neg</link>
      <guid>https://dev.to/jumpingma/blocking-apps-failed-for-me-three-times-a-daily-budget-plus-a-counter-of-every-override-has-held-neg</guid>
      <description>&lt;p&gt;Every screen-time app I tried in 2024 assumed the problem was access. Remove access, problem solved. It is not, and I have the logs to prove it on myself.&lt;/p&gt;

&lt;h2&gt;
  
  
  The three attempts that failed
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Full block, 9 days.&lt;/strong&gt; I blocked the four apps I used most. Day four I started using the mobile web versions. Day nine I had reinstalled two of them and turned the blocker off "temporarily", which lasted three weeks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Accountability partner, 5 weeks.&lt;/strong&gt; A friend held the passcode. I asked for it three times with increasingly creative reasons, got it twice, and stopped asking because asking felt worse than the habit.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cold turkey, 12 days.&lt;/strong&gt; Deleted everything, kept it up for twelve days, then reinstalled five apps in one evening after a bad day.&lt;/p&gt;

&lt;p&gt;The pattern: every method removed the &lt;em&gt;access&lt;/em&gt; and left the &lt;em&gt;reason&lt;/em&gt; untouched. A phone is also my map, my messages, my train ticket. "Just don't use it" is not available to me.&lt;/p&gt;

&lt;h2&gt;
  
  
  What actually changed: budget + counter
&lt;/h2&gt;

&lt;p&gt;Two mechanics replaced blocking.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A per-app daily budget.&lt;/strong&gt; Games get 20 minutes, short video 20 minutes, messaging and maps unlimited. Not one global hour, which runs out by noon and then gets ignored for the rest of the day.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A counter of overrides.&lt;/strong&gt; When a budget runs out, the app does not lock. It asks once: continue now, or do the thing you said you wanted to do first. If I continue, it records that. No punishment, no streak to protect, no guilt screen. Just a number that goes up.&lt;/p&gt;

&lt;p&gt;The counter is the part that worked, and it is the part every blocker I tried was designed &lt;em&gt;not&lt;/em&gt; to have. Blocking is binary: you are compliant or you have failed. A counter is a measurement, and measurements are harder to lie to.&lt;/p&gt;

&lt;h2&gt;
  
  
  21 days of data
&lt;/h2&gt;

&lt;p&gt;I logged every open and every override from 1 to 21 October.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sleep-adjacent phone use: 90 min/night to 12 min/night&lt;/li&gt;
&lt;li&gt;Opens per day: 41 to 19&lt;/li&gt;
&lt;li&gt;Overrides per week: 23 to 6&lt;/li&gt;
&lt;li&gt;Apps uninstalled: 0&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The 23-to-6 drop is the interesting number. I was not overriding less because I had more willpower. I was overriding less because overriding had become &lt;em&gt;visible&lt;/em&gt;. Seeing "23" next to a week made the next override feel like a choice rather than a reflex.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the "no stopping cues" framing matters
&lt;/h2&gt;

&lt;p&gt;Short video, games and social feeds share one structure: no natural end. A season never ends, a feed never refreshes to a bottom, an autoplay queue always has a next item. So the useful question is not "how do I stop" but "where do I put the stopping cue".&lt;/p&gt;

&lt;p&gt;Three cues that survived contact with a bad day:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;A budget boundary&lt;/strong&gt; — an external, pre-committed end that is not a judgement about me.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A single question at the boundary&lt;/strong&gt; — one prompt, not a wall of options.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A visible count of crossings&lt;/strong&gt; — the only feedback that changed behaviour without shame.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  What I built, and what I left out
&lt;/h2&gt;

&lt;p&gt;I got tired of stitching this together across three apps, so I built it as one: per-app budgets, one prompt at the boundary, and a plain counter of overrides, all stored on the device. It is called ChoiceField, iOS only, free.&lt;/p&gt;

&lt;p&gt;Two deliberate omissions, because I think they matter:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;No blocking mode.&lt;/strong&gt; A block that can be bypassed teaches you that rules are optional; a budget that reports does not.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No rankings or streaks.&lt;/strong&gt; Streaks punish a bad day twice: once when it happens, once when it resets.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you want to look at it: &lt;a href="https://apps.apple.com/us/app/id6769946195" rel="noopener noreferrer"&gt;App Store (US)&lt;/a&gt; or &lt;a href="https://apps.apple.com/cn/app/id6769946195" rel="noopener noreferrer"&gt;App Store (China)&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhs3ma46t3b38ozisx9vp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhs3ma46t3b38ozisx9vp.png" alt="ChoiceField download card" width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you only take one thing from this: stop trying to remove access, and start making the override visible. You can do that with a notebook for a week before you install anything.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;相关阅读 / Related&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/jumpingma/three-compulsions-one-mechanism-what-400-logged-phone-sessions-taught-me-about-stopping-27mp"&gt;Three compulsions, one mechanism: what 400 logged phone sessions taught me about stopping&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/jumpingma/the-group-chat-that-leaves-you-feeling-worse-is-a-design-problem-not-a-personality-flaw-55bm"&gt;The group chat that leaves you feeling worse is a design problem, not a personality flaw&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/jumpingma/games-short-video-and-social-feeds-share-one-loop-that-is-why-deleting-the-app-never-works-453g"&gt;Games, short video and social feeds share one loop. That is why deleting the app never works.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://jumpingmar-web.github.io/choicefield-landing/" rel="noopener noreferrer"&gt;ChoiceField — 21 天实测与方法说明（下载入口）&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>productivity</category>
      <category>health</category>
      <category>ios</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Three compulsions, one mechanism: what 400 logged phone sessions taught me about stopping</title>
      <dc:creator>Martin Ma</dc:creator>
      <pubDate>Wed, 21 Oct 2026 00:43:35 +0000</pubDate>
      <link>https://dev.to/jumpingma/three-compulsions-one-mechanism-what-400-logged-phone-sessions-taught-me-about-stopping-27mp</link>
      <guid>https://dev.to/jumpingma/three-compulsions-one-mechanism-what-400-logged-phone-sessions-taught-me-about-stopping-27mp</guid>
      <description>&lt;p&gt;I spent three weeks logging every phone session and, more usefully, the ninety seconds before each one. Four hundred sessions later I stopped believing that doomscrolling, gaming binges and compulsive pornography use are three separate problems with three separate fixes. They are the same loop wearing different clothes, and that has a practical consequence: fixes aimed at the content always fail, because the content is not the mechanism.&lt;/p&gt;

&lt;p&gt;This is not a moral argument and it is not a diagnosis. It is a description of a failure pattern I kept repeating, and what actually interrupted it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The four parts of the loop
&lt;/h2&gt;

&lt;p&gt;Every one of these behaviours delivers the same structure:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;An unpredictable payoff.&lt;/strong&gt; Not every pull gives something good, and you cannot tell in advance which pull will. A feed refresh, a match result, a new message, a thumbnail: all of them are draws from a distribution you cannot see.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A near-miss signal.&lt;/strong&gt; The almost-win is more motivating than the win, because it implies the next attempt is close. This is why "one more" is such a reliable sentence.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No stopping cue.&lt;/strong&gt; A book chapter ends. A film has credits. A podcast has an outro. Feeds removed all of them and replaced them with autoplay, preloading and "up next". The only remaining stopping point is fatigue, and fatigue arrives after forty minutes of scrolling.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cheap re-entry.&lt;/strong&gt; Reopening costs nothing, so the decision to continue never has to become conscious.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Once I could name those four parts, my own history made sense. Every fix I had tried attacked part four, and part four is the least important one.&lt;/p&gt;

&lt;h2&gt;
  
  
  What each behaviour adds
&lt;/h2&gt;

&lt;p&gt;The loop is shared, but each behaviour adds one ingredient that changes the failure mode:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Short-form video&lt;/strong&gt; adds infinite supply and zero cost per item. There is no unit of completion, so there is no natural place to stop.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Games&lt;/strong&gt; add progression: daily streaks, energy timers, seasons. These convert "I want to stop" into "I will lose something if I stop", which is a much harder feeling to argue with.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compulsive pornography use&lt;/strong&gt; adds shame and secrecy, which is the most destructive addition of the three, because shame removes the two things that would otherwise end the loop: talking about it, and being seen doing it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That last point is why "just have more willpower" is not merely unhelpful but actively counterproductive there. Willpower framed as a moral test turns a habit into an identity, and an identity is much harder to change than a habit.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why deleting the app fails
&lt;/h2&gt;

&lt;p&gt;Deleting an app attacks re-entry only. It is real progress, but it creates two new problems.&lt;/p&gt;

&lt;p&gt;First, one dramatic failure mode. One bad evening, one reinstall, and weeks of effort are gone. A limiter makes a bad evening cost twenty extra minutes instead of the whole system.&lt;/p&gt;

&lt;p&gt;Second, it does not survive substitution. Remove the game and the same loop is waiting in a feed. Remove the feed and it is waiting in a shopping app. The loop is the target, not the app.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three changes that held up
&lt;/h2&gt;

&lt;p&gt;Ordered by measured effect over those three weeks:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Charge the cost to the app, not to the day.&lt;/strong&gt; A single daily limit for the whole phone is spent by noon and then means nothing, which is exactly when the loop is strongest. Per-app budgets keep the expensive apps constrained and leave messaging and maps alone, which also removes the usual excuse for overriding: "but I need it for work."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Make every override visible.&lt;/strong&gt; When bypassing a limit was silent, I did it five or six times a week and forgot each instance. When it was counted, the number itself became the restraint. No lock, no punishment, just a tally I had to look at. This was the single highest-leverage change, and it is the one piece nothing off the shelf gave me.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Put a stopping cue back.&lt;/strong&gt; I added a four-second question before the feed loads: ten minutes or an hour? It converts an automatic reach into a decision. Most of the time the honest answer is ten, and the session ends when the number does instead of when I get bored.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhs3ma46t3b38ozisx9vp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhs3ma46t3b38ozisx9vp.png" alt="Download card for ChoiceField" width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Numbers, with the obvious caveat
&lt;/h2&gt;

&lt;p&gt;One user, three weeks, self-logged. Treat this as a case study, not evidence:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Bedtime scrolling: about 90 minutes to about 12.&lt;/li&gt;
&lt;li&gt;Sessions per day: 41 to 19.&lt;/li&gt;
&lt;li&gt;Overrides per week: 23 to 6.&lt;/li&gt;
&lt;li&gt;Nothing uninstalled; no arguments with anyone about my phone.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What this does not fix
&lt;/h2&gt;

&lt;p&gt;A limiter does not change the product's incentive. The loop exists because it works, and no timer makes it stop working. It also does not help if the behaviour is a symptom: if you are avoiding a specific task, or using a feed to manage anxiety, a timer mostly adds shame. Deal with the underlying thing first, then use the limiter for the residual habit.&lt;/p&gt;

&lt;h2&gt;
  
  
  The tool, since I built one
&lt;/h2&gt;

&lt;p&gt;I eventually built these mechanics into a small iOS app, mainly because I wanted the override counter to exist as a number I could not avoid. It is called ChoiceField, it is free, and the method does not require it: per-app Screen Time limits plus a tally of every override kept where you cannot miss it gets most of the way there.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;App Store (US): &lt;a href="https://apps.apple.com/us/app/id6769946195" rel="noopener noreferrer"&gt;https://apps.apple.com/us/app/id6769946195&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;App Store (China): &lt;a href="https://apps.apple.com/cn/app/id6769946195" rel="noopener noreferrer"&gt;https://apps.apple.com/cn/app/id6769946195&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you try the loop framing on your own logs, I would like to know which part broke first: the stopping cue, the counter, or the per-app budget. That comparison is more useful to me than agreement.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;相关阅读 / Related&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/jumpingma/blocking-apps-failed-for-me-three-times-a-daily-budget-plus-a-counter-of-every-override-has-held-neg"&gt;Blocking apps failed for me three times. A daily budget plus a counter of every override has held for 21 days.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/jumpingma/the-group-chat-that-leaves-you-feeling-worse-is-a-design-problem-not-a-personality-flaw-55bm"&gt;The group chat that leaves you feeling worse is a design problem, not a personality flaw&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/jumpingma/games-short-video-and-social-feeds-share-one-loop-that-is-why-deleting-the-app-never-works-453g"&gt;Games, short video and social feeds share one loop. That is why deleting the app never works.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://jumpingmar-web.github.io/choicefield-landing/" rel="noopener noreferrer"&gt;ChoiceField — 21 天实测与方法说明（下载入口）&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>discuss</category>
      <category>productivity</category>
      <category>health</category>
      <category>ios</category>
    </item>
    <item>
      <title>The group chat that leaves you feeling worse is a design problem, not a personality flaw</title>
      <dc:creator>Martin Ma</dc:creator>
      <pubDate>Wed, 21 Oct 2026 00:41:20 +0000</pubDate>
      <link>https://dev.to/jumpingma/the-group-chat-that-leaves-you-feeling-worse-is-a-design-problem-not-a-personality-flaw-55bm</link>
      <guid>https://dev.to/jumpingma/the-group-chat-that-leaves-you-feeling-worse-is-a-design-problem-not-a-personality-flaw-55bm</guid>
      <description>&lt;p&gt;I spent three weeks logging what happened in the ninety seconds before I opened my phone, and which sessions I regretted. The surprise was not the volume. It was which app produced the regret.&lt;/p&gt;

&lt;p&gt;Short video was the biggest time sink. But the sessions that left me feeling worse afterwards were almost always messaging and social feeds, and the mechanism was different from what I expected.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three ways a feed makes you feel worse, none of which are your fault
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Comparison with a curated sample.&lt;/strong&gt; You see forty people's best moments and compare them to your ordinary Tuesday. This is not a character flaw; it is what happens when a sample is selected for display and you treat it as representative. Nobody's feed shows the argument they had at breakfast.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ambiguous social signals.&lt;/strong&gt; A message that was read and not answered, a post with fewer reactions than expected, a group chat where the joke landed for everyone but you. These are low-information events with high emotional weight, and the feed gives you no way to resolve them. So you keep checking, which is the loop.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Obligation without boundaries.&lt;/strong&gt; Group chats have no closing time. A thread that starts at 11pm expects an answer, and the expectation is social rather than technical, so there is nothing to push back against except your own attention.&lt;/p&gt;

&lt;p&gt;Put together, the pattern is: you are not addicted to people, you are managing an inbox that never declares itself finished.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I changed, in order of effect
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;I separated messaging from feeds, and gave them different rules.&lt;/strong&gt; Messaging gets no limit, because it is genuinely useful and the cost of missing something is real. Feeds get a per-app budget. Bundling them into one daily phone limit was the mistake I made for two years: the useful app spent the budget, so the feed got the remainder, and I felt justified.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I made overrides visible.&lt;/strong&gt; When bypassing a limit was silent I did it five or six times a week and remembered none of them. Counting them changed the behaviour more than any lock. A number I have to look at is a better constraint than a wall I can climb.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I put a stopping cue before the feed, not inside it.&lt;/strong&gt; One question on the home screen: ten minutes or an hour. It takes four seconds and converts an automatic reach into a decision. Most days the honest answer is ten.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I stopped answering group chats on the app's schedule.&lt;/strong&gt; Two windows a day, and a sentence in the group explaining it. Nobody objected. The obligation was mostly in my head, which is exactly why it had no natural end.&lt;/p&gt;

&lt;h2&gt;
  
  
  The numbers
&lt;/h2&gt;

&lt;p&gt;Three weeks, one user, so treat this as a case study and not evidence:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Regretted sessions per week: 19 to 5.&lt;/li&gt;
&lt;li&gt;Night-time opens: about 90 minutes to about 12.&lt;/li&gt;
&lt;li&gt;Overrides per week: 23 to 6.&lt;/li&gt;
&lt;li&gt;Apps uninstalled: none. Arguments with friends about my phone: none.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What this does not solve
&lt;/h2&gt;

&lt;p&gt;A limiter does not make a group chat kinder, and it does not fix the comparison problem, which is upstream in the product. If the feed is where you go to avoid a specific task, a timer mostly adds shame. Deal with the task first.&lt;/p&gt;

&lt;p&gt;What it does fix is the specific pattern I kept repeating: opening for a legitimate message, then drifting into a comparison feed for forty minutes with no memory of deciding to.&lt;/p&gt;

&lt;p&gt;I built these mechanics into a small iOS app, mainly because I wanted the override counter to exist and nothing off the shelf had it. The method itself needs no app: per-app Screen Time budgets, plus a tally of every override kept somewhere you cannot avoid.&lt;/p&gt;

&lt;p&gt;If you have tried something similar, tell me which part held up and which one you dropped. I am especially interested in whether separating messaging from feeds worked for you, or whether the split just moved the problem.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;App:&lt;/strong&gt; ChoiceField, free on the App Store (iOS 17+): &lt;a href="https://apps.apple.com/us/app/id6769946195" rel="noopener noreferrer"&gt;https://apps.apple.com/us/app/id6769946195&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhs3ma46t3b38ozisx9vp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhs3ma46t3b38ozisx9vp.png" alt="ChoiceField — QR code to the App Store" width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;相关阅读 / Related&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/jumpingma/blocking-apps-failed-for-me-three-times-a-daily-budget-plus-a-counter-of-every-override-has-held-neg"&gt;Blocking apps failed for me three times. A daily budget plus a counter of every override has held for 21 days.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/jumpingma/three-compulsions-one-mechanism-what-400-logged-phone-sessions-taught-me-about-stopping-27mp"&gt;Three compulsions, one mechanism: what 400 logged phone sessions taught me about stopping&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/jumpingma/games-short-video-and-social-feeds-share-one-loop-that-is-why-deleting-the-app-never-works-453g"&gt;Games, short video and social feeds share one loop. That is why deleting the app never works.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://jumpingmar-web.github.io/choicefield-landing/" rel="noopener noreferrer"&gt;ChoiceField — 21 天实测与方法说明（下载入口）&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>discuss</category>
      <category>productivity</category>
      <category>health</category>
      <category>design</category>
    </item>
    <item>
      <title>Games, short video and social feeds share one loop. That is why deleting the app never works.</title>
      <dc:creator>Martin Ma</dc:creator>
      <pubDate>Tue, 20 Oct 2026 16:16:59 +0000</pubDate>
      <link>https://dev.to/jumpingma/games-short-video-and-social-feeds-share-one-loop-that-is-why-deleting-the-app-never-works-453g</link>
      <guid>https://dev.to/jumpingma/games-short-video-and-social-feeds-share-one-loop-that-is-why-deleting-the-app-never-works-453g</guid>
      <description>&lt;p&gt;Most advice about compulsive phone use treats three different problems as one: games, short-form video, and social feeds. They feel different, so people try different fixes for each. Underneath, they run the same loop.&lt;/p&gt;

&lt;h2&gt;
  
  
  The loop, stated plainly
&lt;/h2&gt;

&lt;p&gt;A variable-reward loop has four parts:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;An unpredictable payoff. Not every pull gives something good, and you cannot tell in advance which pull will.&lt;/li&gt;
&lt;li&gt;A near-miss signal. The almost-win is more motivating than the win, because it implies the next attempt is close.&lt;/li&gt;
&lt;li&gt;No stopping cue. Nothing in the interface says "this is a natural end". No chapter break, no credits, no outro.&lt;/li&gt;
&lt;li&gt;Cheap re-entry. Reopening costs nothing, so the decision to stop never has a chance to become conscious.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Slot machines are the cleanest example, which is why the mechanics are easy to study there. Games add progression and daily streaks. Short-form video adds autoplay and preloading. Social feeds add the audience: the payoff is other people's reactions, which are maximally unpredictable.&lt;/p&gt;

&lt;p&gt;Once I saw the loop, the reason my fixes kept failing became obvious.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why deletion fails
&lt;/h2&gt;

&lt;p&gt;Deleting an app attacks part four only. It makes re-entry expensive, which is real progress, but it leaves the other three parts intact and adds two new problems.&lt;/p&gt;

&lt;p&gt;First, it creates a single dramatic failure mode. One stressful evening, one reinstall, and weeks of effort are gone. With a limiter, a bad evening costs you twenty extra minutes, not your whole system.&lt;/p&gt;

&lt;p&gt;Second, it doesn't survive substitution. Remove a game and the same loop is waiting in a feed. The loop is the thing to design against, not the app.&lt;/p&gt;

&lt;h2&gt;
  
  
  What actually interrupts the loop
&lt;/h2&gt;

&lt;p&gt;Three changes held up over three weeks of logging, in order of effect:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Charge the cost to the app, not the day.&lt;/strong&gt; A single daily limit for the whole phone gets spent by noon and then means nothing, which is exactly when the loop is strongest. Per-app budgets keep the expensive apps constrained and leave messaging and maps alone, which removes the usual excuse for overriding.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Make the override visible.&lt;/strong&gt; When bypassing a limit was silent, I did it five or six times a week and forgot every instance. When it was counted, the count became the restraint. No lock, no punishment, just a number I had to look at. This is the single highest-leverage change I made, and it is also the one nothing off the shelf provided.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Put a stopping cue back.&lt;/strong&gt; A book ends. A film has credits. A podcast has an outro. I added the equivalent manually: one deliberate question before the feed loads, asking whether I want ten minutes or an hour. It takes four seconds, and it converts an automatic reach into a decision. Most of the time the honest answer is ten.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this does not fix
&lt;/h2&gt;

&lt;p&gt;None of this changes the incentive of the product. The loop exists because it works, and a timer cannot make it stop working. It also does not help if the behaviour is a symptom: if you are avoiding a specific task, or using the feed to manage anxiety, a limiter will mostly add shame. Deal with the underlying thing first, then use the limiter for the residual habit.&lt;/p&gt;

&lt;p&gt;What it does fix is the specific failure I kept repeating: a session that started for a legitimate reason and ended two hours later, with no memory of deciding to continue.&lt;/p&gt;

&lt;h2&gt;
  
  
  Numbers, since anecdotes are cheap
&lt;/h2&gt;

&lt;p&gt;Three weeks of logging, one user, so treat it as a case study and not evidence:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Bedtime scrolling: about 90 minutes to about 12.&lt;/li&gt;
&lt;li&gt;Sessions per day: 41 to 19.&lt;/li&gt;
&lt;li&gt;Overrides per week: 23 to 6.&lt;/li&gt;
&lt;li&gt;Nothing uninstalled, no argument with anyone about my phone.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I later built these mechanics into a small iOS app, mostly because I wanted the override counter to exist. But the method needs no app: per-app Screen Time limits plus a tally of every override, kept somewhere you cannot avoid seeing. The tally is the whole trick.&lt;/p&gt;

&lt;p&gt;If you have tried something similar, I would like to know which part held up and which one you dropped, and whether the loop framing matches what you see in your own logs.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;相关阅读 / Related&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/jumpingma/blocking-apps-failed-for-me-three-times-a-daily-budget-plus-a-counter-of-every-override-has-held-neg"&gt;Blocking apps failed for me three times. A daily budget plus a counter of every override has held for 21 days.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/jumpingma/three-compulsions-one-mechanism-what-400-logged-phone-sessions-taught-me-about-stopping-27mp"&gt;Three compulsions, one mechanism: what 400 logged phone sessions taught me about stopping&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/jumpingma/the-group-chat-that-leaves-you-feeling-worse-is-a-design-problem-not-a-personality-flaw-55bm"&gt;The group chat that leaves you feeling worse is a design problem, not a personality flaw&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://jumpingmar-web.github.io/choicefield-landing/" rel="noopener noreferrer"&gt;ChoiceField — 21 天实测与方法说明（下载入口）&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>discuss</category>
      <category>productivity</category>
      <category>health</category>
      <category>design</category>
    </item>
    <item>
      <title>Short-form video has no stopping cues - that is the whole design</title>
      <dc:creator>Martin Ma</dc:creator>
      <pubDate>Tue, 20 Oct 2026 13:46:29 +0000</pubDate>
      <link>https://dev.to/jumpingma/short-form-video-has-no-stopping-cues-that-is-the-whole-design-1aae</link>
      <guid>https://dev.to/jumpingma/short-form-video-has-no-stopping-cues-that-is-the-whole-design-1aae</guid>
      <description>&lt;p&gt;I spent three months tracking why I could not stop watching short dramas.&lt;/p&gt;

&lt;p&gt;It was not the episodes. It was that nothing in the interface ever says &lt;strong&gt;stop&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a stopping cue actually is
&lt;/h2&gt;

&lt;p&gt;A book chapter ends. A film has credits. A podcast episode has an outro. Each one is a&lt;br&gt;
built-in moment where you get to decide whether to continue. Short-form video removed all&lt;br&gt;
of them: autoplay, seamless transitions, and a feed that preloads the next clip before&lt;br&gt;
you have finished judging the current one.&lt;/p&gt;

&lt;p&gt;The result is that the only decision point left is your own fatigue - and fatigue is the&lt;br&gt;
worst possible decision-maker, because it arrives after the behaviour has already run.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three things I measured on myself
&lt;/h2&gt;

&lt;p&gt;I logged every session for three weeks, then changed one variable at a time.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Sessions start intentionally, then drift.&lt;/strong&gt; 71% of my sessions started with a&lt;br&gt;
specific reason ("check one clip", "look up that actor") and crossed the 20-minute mark.&lt;br&gt;
So the problem is not starting - it is the absence of a checkpoint afterwards.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;A single daily budget does not work.&lt;/strong&gt; With one global limit, I either blew through&lt;br&gt;
it by noon and ignored the rest, or hoarded it and felt punished. Splitting the budget&lt;br&gt;
per app changed the behaviour, because exhausting the video app no longer blocked&lt;br&gt;
messaging or maps - so there was no legitimate excuse to override it.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Invisible overrides are not limits.&lt;/strong&gt; When overriding was frictionless and unrecorded,&lt;br&gt;
I overrode it 5-6 times a week and forgot each time. When the app started showing&lt;br&gt;
"bypassed 4 times this week", the number itself became the restraint.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  What I built instead of a blocker
&lt;/h2&gt;

&lt;p&gt;I did not want another app that hard-locks the phone, because hard locks create a&lt;br&gt;
single dramatic failure mode: you disable the whole thing in a bad moment and lose&lt;br&gt;
everything.&lt;/p&gt;

&lt;p&gt;Instead I built three small mechanics:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a one-line intention prompt before the app opens (costs two seconds, no punishment)&lt;/li&gt;
&lt;li&gt;per-app budgets rather than one number for the whole device&lt;/li&gt;
&lt;li&gt;a visible count of the times you chose to override&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is the entire product. It is deliberately boring, because the mechanism that&lt;br&gt;
survives contact with a tired brain is the boring one.&lt;/p&gt;

&lt;h2&gt;
  
  
  The honest limits
&lt;/h2&gt;

&lt;p&gt;This does not fix the feed's design, and it is not therapy. If your use is a symptom of&lt;br&gt;
something larger, a timer is the wrong tool. What it does fix is the specific case of&lt;br&gt;
"the session started fine and ended three hours later".&lt;/p&gt;

&lt;p&gt;I shipped it as a small iOS app - &lt;a href="https://apps.apple.com/us/app/id6769946195" rel="noopener noreferrer"&gt;ChoiceField&lt;/a&gt; - mostly because I wanted the&lt;br&gt;
bypass counter to exist and nothing off the shelf had it. The mechanisms are easy to&lt;br&gt;
copy manually: Screen Time limits per app, plus a note where you tally every override.&lt;/p&gt;

&lt;p&gt;If you have tried something similar, I would like to know which of the three held up for&lt;br&gt;
you and which one you dropped.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhs3ma46t3b38ozisx9vp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhs3ma46t3b38ozisx9vp.png" alt="ChoiceField download card" width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fd4rmugd30gz3i05g20go.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fd4rmugd30gz3i05g20go.jpg" alt="Per-app budget screen" width="800" height="1738"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzbad1j6tp8du9vca5nhr.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzbad1j6tp8du9vca5nhr.jpg" alt="Bypass counter" width="800" height="1738"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6bm2yr4a8yqcaz6ifu0p.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6bm2yr4a8yqcaz6ifu0p.jpg" alt="Daily overview" width="800" height="1738"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;相关阅读 / Related&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/jumpingma/blocking-apps-failed-for-me-three-times-a-daily-budget-plus-a-counter-of-every-override-has-held-neg"&gt;Blocking apps failed for me three times. A daily budget plus a counter of every override has held for 21 days.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/jumpingma/three-compulsions-one-mechanism-what-400-logged-phone-sessions-taught-me-about-stopping-27mp"&gt;Three compulsions, one mechanism: what 400 logged phone sessions taught me about stopping&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/jumpingma/the-group-chat-that-leaves-you-feeling-worse-is-a-design-problem-not-a-personality-flaw-55bm"&gt;The group chat that leaves you feeling worse is a design problem, not a personality flaw&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://jumpingmar-web.github.io/choicefield-landing/" rel="noopener noreferrer"&gt;ChoiceField — 21 天实测与方法说明（下载入口）&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>discuss</category>
      <category>productivity</category>
      <category>ios</category>
      <category>mentalhealth</category>
    </item>
    <item>
      <title>Designing friction instead of blocking: what I learned building a screen-time app</title>
      <dc:creator>Martin Ma</dc:creator>
      <pubDate>Sat, 17 Oct 2026 23:45:36 +0000</pubDate>
      <link>https://dev.to/jumpingma/designing-friction-instead-of-blocking-what-i-learned-building-a-screen-time-app-4fnc</link>
      <guid>https://dev.to/jumpingma/designing-friction-instead-of-blocking-what-i-learned-building-a-screen-time-app-4fnc</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhs3ma46t3b38ozisx9vp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhs3ma46t3b38ozisx9vp.png" alt="ChoiceField — stop scrolling without locking yourself out. iOS 17+, free to start. QR: App Store (US)" width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;App Store: &lt;code&gt;https://apps.apple.com/us/app/id6769946195&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The problem with every blocker I tried
&lt;/h2&gt;

&lt;p&gt;I've tried the usual stuff on my own phone: hard limits, one-tap locks, deleting apps. They all fail the same way. The block is absolute, so the fix is absolute too — you flip the switch off, and you're back to zero. Every attempt resets to the same starting line.&lt;/p&gt;

&lt;p&gt;My wife had the same pattern, worse: down at eleven, still awake at two, half of it short video and half of it shopping. So instead of another lock, I tried the opposite: keep access, add a small pause.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three rules we committed to
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Never make it impossible.&lt;/strong&gt; If the user can't get back in, they'll remove the app — and then there's no signal left to work with.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Make the exit visible.&lt;/strong&gt; Every bypass is counted and shown back to you. Hiding friction removes the feedback loop that changes behaviour.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Never go around the system.&lt;/strong&gt; No MDM profiles, no fake network tricks. Use the platform's own Screen Time stack.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  What that looks like on iOS
&lt;/h2&gt;

&lt;p&gt;Under the hood it's the Screen Time APIs (Family Controls authorization, &lt;code&gt;DeviceActivity&lt;/code&gt; for monitoring, &lt;code&gt;ManagedSettings&lt;/code&gt; for shields). The interesting part isn't the API calls — it's the choices on top of them:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6bm2yr4a8yqcaz6ifu0p.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6bm2yr4a8yqcaz6ifu0p.jpg" alt="Per-app daily allowance, set once" width="800" height="1738"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Per-app allowance instead of one global limit.&lt;/strong&gt; A single 60-minute budget for the whole phone gets spent in ten minutes. Per-app budgets spread out.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A pause screen, not a wall.&lt;/strong&gt; When the allowance runs out you get a sentence and a way back in: wait a bit, or use one of a small number of unlocks you chose in advance.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Unlocks are logged, not blocked.&lt;/strong&gt; The point isn't prevention at all costs: it's seeing the pattern (three unlocks at 1am is information, not failure).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Friend Freeze.&lt;/strong&gt; A trusted person can freeze apps for you for a set window. Accountability without surveillance.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fd4rmugd30gz3i05g20go.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fd4rmugd30gz3i05g20go.jpg" alt="Setting a daily plan" width="800" height="1738"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What changed, measured
&lt;/h2&gt;

&lt;p&gt;Before: phone in hand until 2am, screen time after midnight ~50 minutes. After six weeks: down to about 20 minutes, and the useful part — it didn't feel like a fight. The unlock count went from 5–6 a night to 0–1.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzbad1j6tp8du9vca5nhr.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzbad1j6tp8du9vca5nhr.jpg" alt="Reviewing the week" width="800" height="1738"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  If you want to try it
&lt;/h2&gt;

&lt;p&gt;ChoiceField is free to start on iOS 17+. No account, everything on-device.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;https://apps.apple.com/us/app/id6769946195&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;If you're building something similar and want to compare notes on the Screen Time APIs — especially the entitlement review process — happy to share what we hit.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;相关阅读 / Related&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/jumpingma/blocking-apps-failed-for-me-three-times-a-daily-budget-plus-a-counter-of-every-override-has-held-neg"&gt;Blocking apps failed for me three times. A daily budget plus a counter of every override has held for 21 days.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/jumpingma/three-compulsions-one-mechanism-what-400-logged-phone-sessions-taught-me-about-stopping-27mp"&gt;Three compulsions, one mechanism: what 400 logged phone sessions taught me about stopping&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/jumpingma/the-group-chat-that-leaves-you-feeling-worse-is-a-design-problem-not-a-personality-flaw-55bm"&gt;The group chat that leaves you feeling worse is a design problem, not a personality flaw&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://jumpingmar-web.github.io/choicefield-landing/" rel="noopener noreferrer"&gt;ChoiceField — 21 天实测与方法说明（下载入口）&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ios</category>
      <category>swiftui</category>
      <category>productivity</category>
      <category>design</category>
    </item>
  </channel>
</rss>
