起因是我发现自己一天要点开小红书几十次,有时候是为了查个东西,查完就开始刷短视频;有时就是手指的惯性:锁屏、解锁、手指自己走到那个图标上去了。
One Sec 那个 App 我用过,思路很对:不封锁,只是在你打开 App 之前塞进去十秒钟的呼吸。这十秒不是惩罚,是让你有机会意识到:我刚才为什么要点这个。有效,但它还需要下载 App ,并且只能控制一个 App 。想要多配置 App 就需要订阅。他的原理也是利用 iphone 自己的快捷方式来实现跳转,那既然原理了解了,我完全可以利用 iphone 自有的机制来实现同样的功能,甚至可以灵活自定义。
利用闲余时间 vibe coding 了一下,并且部署到了 Cloudflare 可以提供给大家免费使用:
在线用(公开实例,免费,什么都不用部署): https://yixi-app.pages.dev
仓库( MIT ,中英双 README ): https://github.com/Defiabell/yixi
====== 怎么做到不用装 App 的 ======
靠 iOS 自带的「快捷指令」。系统里有个「打开 App 时」的自动化触发器,你点小红书的那一刻它会先跑一段快捷指令。那段快捷指令做的事只有一件:向服务器 GET 一下,问「这次该不该拦」。
服务器回一行纯文本。回 pass ,快捷指令直接结束,App 正常打开,你几乎没感觉;回一个网址,快捷指令就跳到那个网址去——那就是呼吸页。
所以整个东西是:一个网页 + 一条系统自带的自动化。不用装 App ,不用越狱,不用 MDM 描述文件,不用给任何东西辅助功能权限。
后端是一个 Cloudflare Worker 加一个 D1 数据库,跑在免费额度里,我这个实例目前成本是零。
====== 几个我觉得值得说的设计 ======
1 )倒计时期间一个按钮都没有。十秒走完之后,先出现的是「算了」,一个实心的大按钮;再过 800 毫秒才出现「继续打开」,一行小号下划线文字。
这个不对称是刻意的。如果把「放下」和「进去」做成两个一样大的按钮,那这十秒就只是一道验证码,肌肉记忆两周就能穿过去。默认路径应该是放下手机。
2 )坏了就放行。服务器挂了、你在地铁里没信号、Cloudflare 抽风——快捷指令拿不到回应就直接开 App 。
一个自律工具最不该干的事,是在自己宕机的时候把用户锁在手机外面。这条是我在设计文档里写死的第一条。
3 )放行之后有 90 秒的免打扰窗口,而且这个状态必须记在服务端。
原因不显然:你选了「继续」,页面跳回小红书,而「打开 App 时」这条自动化会在那一刻再次触发——于是又被拦住,又跳到呼吸页,无限循环。所以服务端必须记得「这个人刚刚放行过」,并且要能区分「这是一次真实的冲动」和「这是自动化自己撞回来的噪音」,否则统计数字全是假的。
4 )它是摩擦,不是墙。那条自动化在设置里两下就能关掉,我没有也不打算去防这件事。真想进去的人一定进得去;这个工具的作用域只是「让惯性那一下变得需要一点意识」。
===== 它记什么 =====
时间、哪个 App 、你那次是继续了还是放下了。就这三样。不记内容、不记位置、不记你在里面待了多久。
过一阵你能看到自己一周被拦了多少次、其中多少次真的没进去。
===== 预判几个大家会问的 =====
-
自律靠软件没用,忍不住还是会点继续」——对,会。但我关心的不是把 100 次压到 0 次,是那 100 次里有多少本来就是无意识的。实际用下来这个比例比我想的高。
-
iOS 自带的屏幕使用时间/专注模式不够吗?那两个是限额和封锁,到点了给你一堵墙,然后大部分人点 忽略限制。这个不设额度,每次都问一下,而且会记录你被问之后的选择,那才是我想看的数据。
-
每次开 App 都要联网?是一次 GET ,打到 Cloudflare 边缘节点。没网就是上面说的直接放行。
-
快捷指令自动化不是每次都要弹窗确认吗,——自动化里可以关掉「运行前询问」,关掉之后是零点击直接跑的,README 里有截图步骤。
-
安卓呢?没有。这个方案完全依赖 iOS 的快捷指令自动化,安卓侧我没有等价的东西可用。
欢迎拍砖,尤其是设计上的。代码在上面,issue 也开着。