WorryBucket · 造桶日志
2026.05 — 至今 iOS · React Native 独立开发
Build in Public

定点焦虑桶开发记录

WorryBucket(定点焦虑桶)让人把冒出来的念头先一行字丢进桶里,到自己定的时间再一次处理完。 从草图到 196 名测试者用了 16 周,10 月 15 日上架 App Store。

196内测用户
1,950使用会话
0崩溃
16周
11条反馈归档

截至 2026-09-24,数据来自 App Store Connect。测试用户由小红书和抖音招募。

产品长什么样

8 screens · 左右滑动

这八屏是完整的一轮:丢进去,等,到点打开,分类,清空,然后看见数字。 每张下面写的是它要解决什么问题。

主界面,桶是空的,文案写着 BUCKET'S EMPTY
桶是空的

空状态不催你去填。桶空着就是好事,没有待办数字,没有红点。

收集页,问 WHAT'S ON YOUR MIND,下面是快捷标签
丢进去

只问一句「在想什么」。一行字就能提交,不追问细节,不要求打分。

主界面显示 4 条焦虑等待处理,桶上有粉色计数徽标
等着

桶上的数字只是告诉你攒了多少,不是任务量。到点之前它什么都不做。

焦虑时间清单页,标题 TONIGHT'S WORRIES,下面是卡片列表
到点了

一次看完整桶,而不是零散地被打断。这是白天所有「等会儿再说」的兑现时刻。

分类页,问 IS THERE ONE STEP YOU CAN TAKE NOW
一次一件

一屏只放一条,只问一个问题:现在有没有一步能做的?不让人同时面对一整页。

分好的三个盒子:能行动、放下它、已经过去了
三个盒子

能行动、放下它、已经过去了。多数焦虑会落进后两个,而这正是要让人看见的。

清空完成页,文案 BUCKET'S CLEAR. You did well.
清空

结束语是「你做得很好」,不是「今日任务完成」。庆祝的是放下,不是完成度。

数据页,显示 73% 的焦虑自行消退
看见数字

攒够一段时间后,你会看到自己担心的事里有多大比例后来根本没发生。

原型图,Figma v7。实际界面与此一致。

产品需求定位

6 条 · 2026.05 — 07

定义「产品做成什么样」:以 Walkthrough 为骨架生成 PRD 文档,将每个功能展开为可执行的工程级规格:交互细节、边界条件、数据模型、状态定义、免费/付费归属、验收标准与优先级。它是 vibecoding(含 Superpowers「先 spec 后实现」流程)的核心输入。以下是几条动手前定下的规矩示例。

2026.05
产品结构

收集和处理,拆成两件事

人在焦虑上头的时候写不出条理。这时候要他描述感受,等于把门槛设在他最没力气的地方。

核心机制交互取舍
当时怎么想的
问题
同类工具普遍在焦虑发生的当下要求「详细描述你的感受」「给强度打分」。这个要求本身就是负担,而且它出现的时机最糟。
做法
切成两段。收集只要一行字,三秒能完成,不追问。处理才是结构化的,放到用户自己定的那个时间窗口里。
代价
收集端数据很薄,短期做不了深度分析。这个代价是认的:人得先用得下去,才谈得上分析。
2026.05
拒绝什么

不做连胜,不做红点,不做比较

习惯类 app 的标准工具箱,在焦虑产品里几乎全是反的。这三样被写进设计规范当作禁止项。

产品判断反直觉
当时怎么想的
为什么
连胜断了会内疚,而内疚正是这批用户最不缺的东西。红点本身就是一种催促。跟别人比较会让人觉得自己不正常。这三样都能提高日活,代价是把产品变成新的焦虑来源。
落地
设计规范里直接列成永不出现的文案,不是「尽量避免」:
  • 你有 4 条未处理的焦虑
  • 你的连续记录中断了
  • 你比平均水平更焦虑
后果
放弃了最常用的那套留存手段。换来的是:用户不打开 app 的那天,产品不会去戳他。
2026.06
核心流程

为什么是这三个盒子

能行动、放下它、已经过去了。分类的目的不是归档,是让人看清哪些事根本不需要他操心。

流程设计认知框架
当时怎么想的
思路
分类轴选的是「可控性」,不是「紧急/重要」那一套。焦虑最耗人的地方,是在自己动不了的事情上反复使劲,所以第一刀就切在这里。
依据
这一刀不是我拍脑袋切的。Lazarus 和 Folkman 1984 年的 goodness-of-fit 假说讲的就是:一种应对方式有没有用,取决于这件事被判断成可控还是不可控——可控的事适合去做点什么,不可控的事适合换个看法。配错了,力气就是白花的。
出处
「定点焦虑时间」这个机制本身来自 Borkovec 等人 1983 年的 stimulus control 研究:把担忧限制在固定的时间和地点,让它不再一整天到处被触发。第三个盒子对应的是 LaFreniere 和 Newman 2020 年的 Worry Outcome Journal——记下担忧,过些天回看结果。那项研究里 91.4% 的担忧最后没有发生。
边界
得说清楚:上面这些研究的对象是被诊断为广泛性焦虑障碍的人,在临床环境里做的。WorryBucket 是给普通人用的记录工具,不是临床产品,也没有做过任何效果验证。我借的是机制,不是结论。
三个盒子
能行动:有下一步,那就去做。放下它:做不了什么,承认这点本身就是一种处理。已经过去了:写下的时候还没发生,现在已经有结果了。
关键
第三个盒子是这个产品的价值所在。它把「我当时白担心了」变成一条能累计的记录,而不是一闪而过的感觉。自我安抚率就是从这儿来的——说白了,它是一份自动记的 Worry Outcome Journal。后来有个内测用户在完全没看过产品说明的情况下,自己在备忘录里做了同一件事(见下面 2026.08 那条)。
一屏一条
分类时一次只让人看一条。整页铺开,等于让人在最不适合做判断的时候面对一整片焦虑。内部说法是「收集服务边缘系统,处理服务前额叶」——这是个比喻,不是神经科学结论。它想说的事很简单:情绪上头的时候只适合记下来,要权衡的留到人稳下来再说。
2026.06
指标选择

把「后来没事」变成一个数字

产品的招牌指标是自我安抚率:已经不困扰你的,加上自己消退的,占你记下的总数多少。

核心指标后来被验证
当时怎么想的
为什么是它
多数 app 的首页数字是使用时长、连续天数、完成率,衡量的是「你有多勤快地用我」。这里换成一个衡量「你的担心有多少是白担心」的数字。
机制
每条焦虑记下的时候都带着时间。等到几周后回看,人会亲眼看到当初那些睡不着的事,后来大多没有发生。这件事口头讲没用,得让他自己看到比例。
风险
指标越重要,被污染的代价越大。这个隐患在三个月后被一位用户的提问戳中,见下面 2026.08 那条。
2026.07
交互取舍

引导,但不锁住用户自己的数据

「到点才能处理」这条规则如果严格执行,就变成了把人锁在自己的记录外面。

交互取舍P0-29
当时怎么想的
张力
机制的效果来自约束:随时都能处理,它就退化成一个普通待办清单。但硬锁会造成两个问题,一是想回看自己写过的东西却进不去,二是在最需要的时刻被产品挡在门外。
做法
用视觉层级代替权限。在时间窗口内,粉色主按钮出现在最显眼的位置;窗口外,入口还在,只是不再被强调。
原则
设计可以推着人走向更好的选择,但不该没收他对自己数据的控制权。
2026.07
通知

提醒只能安抚,不能催办

一个「到点再处理」的产品必须会提醒你到点了,否则循环闭不上。但提醒的内容被限死了。

通知策略范围调整
当时怎么想的
改过的判断
原计划首版不做通知,理由是涉及系统权限和原生构建。后来发现这是核心循环的一环:不提醒,用户就得自己记得到点了,而这恰好是产品答应替他免掉的负担。于是提到了首版。
内容的边界
通知只能是平静的邀请,不能提未处理的数量,不能在时间窗口之外出现。一条提醒如果让人在下班路上想起自己还有六条没处理,那它就做反了。
技术选择
只做本地定时通知,不做远程推送。不需要服务器,不需要账号,不产生任何数据出网。

196 个人教我的

4 条 · 2026.08 — 09

内测从 7 月底跑到现在。真正改变判断的不是数据看板,是用户具体的反馈。

2026.08
假设被推翻

固定钟点这件事本身,对一部分人就是压力

整个产品建在「每天同一个时间」上。而最需要它的那批人,作息恰恰是乱的。

用户反馈核心假设
怎么改的
设置焦虑时间这件事本身会带给我焦虑,因为 PTSD 有时候睡眠时间是混乱的。我的焦虑时段大概在醒来三四个小时后,但 app 假设每天同一作息。 内测用户,2026 年 8 月(已脱敏)
戳破了什么
我默认用户有稳定作息,于是「设一个固定时间」是件小事。对作息紊乱的人来说,这个设置动作本身就是在提醒他自己有多不规律。
更重要的一层
我原以为目标用户是「想提高效率的上班族」。这条反馈说明真正的核心用户是作息和情绪都不稳定的人——他们最需要这个产品,也最容易被这个设计挡在门外。目标人群的画像因此改了。
接下来
在做弹性时间调度:允许一天多个窗口,或者按「醒来后几小时」这类相对时间来定,而不是绑死钟点。
2026.08
指标可信度

一句「分错了能改吗」,问的其实是指标准不准

听起来是个撤销功能的请求。往下推两层,它会直接污染首页那个数字。

用户反馈优先级提到最高
怎么改的
分类分错了还能退回来吗? 内测用户,2026 年 8 月(已脱敏)
第一层
手滑了想撤销。一个普通的便利性需求,排期靠后。
第二层
被分错的那个状态是单向的,状态机里没有回退路径。所以不是「不方便」,是数据错了而且改不回来。
第三层
那个状态正好是自我安抚率的分子来源。手滑一次,首页那个比例就虚高一次。而这个比例是产品用来证明自己价值的东西——它一旦不准,用户看到的「原来大部分担心都没发生」就成了假的。
结论
这是指标可信度问题,优先级从「有空再做」提到了下一批次第一位。做法是给状态机补一个重新分类的事件,并让比例重算,配回归测试。
附带发现
会认真问这个问题,说明用户把里面的记录当回事。这个判断后来直接影响了上架时的数据迁移提示。
2026.08
假设被验证

有人已经在手动做这件事了

一位用户在没看过任何产品说明的情况下,用自己的话讲出了这个产品想证明的那件事。

用户反馈需求验证
为什么这条重要
我本来就在备忘录里记,事情发生前和发生后的感受都写下来。慢慢就有信心了,因为会看到以前焦虑过的很多事,其实都解决了。 内测用户,2026 年 8 月(已脱敏)
含义
他描述的正是自我安抚率想让人看到的体验。他不是被产品教会的,是自己发明了同一套办法,只是手动在做。
产品上的意义
这说明产品在做的事情是把一个人们已经自发在做的行为自动化,而不是创造一个新习惯。后者的成功率要低得多。
连带
它也反过来说明了上一条的严重性:如果用户来这里就是为了看那个比例,那比例失真就等于产品失效。
2026.09
上架前

别让用户在换版本的时候把自己的记录删掉

正式版发布时,最自然的动作是「删掉测试版,装正式版」。这个动作会永久抹掉他攒的所有记录。

迁移设计隐私的代价
怎么处理的
机制
测试版和正式版标识符相同,直接覆盖安装数据会保留;先删除再安装,数据永久消失。
为什么比一般 app 严重
这个产品没有云端、没有账号,导出功能还没做,所以没有任何找回路径。而丢掉的恰好是算那个比例要用的历史。重装之后看到的是空桶和 0%,产品最强的那个体验直接归零。
这是隐私承诺的另一面
「数据从不离开你的手机」可以拿来当卖点,但它的代价是没有云端兜底。该做的是把代价一起讲清楚,而不是只讲好的那半边。
动作
在测试版说明、发版通知、更新日志三处写明:不要删除,直接覆盖安装。数据导出排进下一阶段。

AI 在这个项目里的三个角色

造 · 判断 · 管

第一版里没有任何 AI 功能。这是个决定,不是还没做完。

1

用 AI 造

整个 app 是和 AI 协作写出来的

从产品文档、状态机到测试,16 周 68 次提交、60 个测试套件。这是我第一个 iOS 项目,所以这次验的不只是「AI 能不能写代码」,而是一个人在不熟的技术栈上,能不能靠 AI 把一个有真实用户的东西做到上架前。

过程中形成的工作方式被写成了规范文档和可复用的流程,包括每次改动前先写规格、红线检查、以及调试过程的归档。

2

判断什么时候不用 AI

AI 功能被排在了第一版之外

在处理页用 AI 给建议,是这个产品最显而易见的卖点。它被明确排进了付费版本,不进首版。三个理由:

一,心理健康场景里的 AI 回应必须带危机识别分支,这个不能省,而它要做对需要时间。二,调用 AI 需要把内容发到服务器,而首版最硬的一句话正是「不收集任何数据」。三,在还不清楚用户到底卡在哪的时候上 AI,多半是在解决一个没被验证过的问题。

第一版因此做到了完全不联网。App Store 的隐私标签是「未收集数据」,这反过来成了产品定位里最有力的一条。

3

管住 AI

用确定性的机制约束不确定的系统

和 AI 协作的另一面是它会犯错,而且经常是无声地犯错。所以产品红线没写成给 AI 的叮嘱,而是写成了提交前的拦截:命中就阻止写入,并说明哪一条被碰了。

# 红线 3:用户可见文案不得含医疗承诺措辞
if echo "$CONTENT" | grep -qiE '(cure your anxiety|treat your anxiety|diagnos|治愈焦虑|治疗焦虑|诊断)'; then
  echo '{"block": true, "message": "RED LINE 3: Medical-claim wording detected.
        This is a wellness tool, not a medical device."}' >&2
  exit 2
fi

项目里实际在跑的提交前钩子。同一个文件还拦客户端密钥泄露、绕过数据层的访问、以及删掉危机识别分支的改动。

这个做法的来历是一次真实的失误。项目文档里有一句继承来的结论说某条上架路径「成本约等于零」,AI 沿用了它,并且在对话里自己写下一句「这个建议你去核实一下」。实际那是一笔每年都要交的费用,还有一串前置条件,信息公开可查。

问题不在于没有信息,也不在于没有预警——那句「建议你去核实」就是预警。问题在于预警没有接到任何会自动触发的动作上。对一个概率性的系统,写一句「下次注意」没有用,因为下一个会话里那句话不存在了。所以后来把规则写成了可以当场判断的形式:当你正在写「建议你去核实」这类话、而这个事实又正被用来做决定时,那句话就是「现在自己去查」的信号。同时给所有涉及 AI 指导用户的改动加了人工审批门。

接下来

Roadmap
WorryBucket 是一款自我关怀和记录工具,不是医疗产品,不提供诊断或治疗,也不能替代专业帮助。 它的机制参考了 worry postponement(担忧延后)这一有实证研究的技巧。 本页引用的用户原话都做了脱敏,不含任何可识别信息。
WorryBucket · Build Log
2026.05 — now iOS · React Native Built solo
Build in Public

Building WorryBucket

WorryBucket lets you drop a thought into a bucket in one line, and come back to the whole bucket at a time you set. Sixteen weeks from sketch to 196 testers. It goes on the App Store on October 15.

196beta testers
1,950sessions
0crashes
16weeks
11feedback items filed

As of 2026-09-24, from App Store Connect. Testers were recruited on Xiaohongshu and Douyin.

What it looks like

8 screens · swipe

These eight screens are one full round: drop it in, wait, open it at the set time, sort, clear, then see the number. Under each one is the problem it exists to solve.

Home screen with an empty bucket, reading BUCKET'S EMPTY
The bucket is empty

An empty state that doesn't push you to fill it. An empty bucket is a good outcome — no to-do count, no red dot.

Capture screen asking WHAT'S ON YOUR MIND, with quick tags below
Drop it in

One question: what's on your mind. One line and it's in. No follow-up, no intensity rating.

Home screen showing worries waiting, with a pink count badge on the bucket
It waits

The number on the bucket tells you how much has gathered, not how much you owe. Until the time you set, it does nothing.

Worry Time screen listing tonight's worries
The time arrives

The whole bucket at once, instead of being interrupted piece by piece. Every "later" from the day gets honoured here.

Classification screen showing one worry and a single question
One at a time

One worry per screen, one question: is there a step you can take right now? Never a whole page at once.

Three sorted boxes: can take action, let it go, already over
Three boxes

Can take action, let it go, already over. Most worries land in the last two — which is exactly what this is built to show you.

Cleared state reading BUCKET'S CLEAR
Cleared

The closing line is "you did well", not "daily goal complete". What gets marked is letting go, not completion.

Insights screen showing the share of worries that eased on their own
See the number

After a few weeks you see what share of the things you worried about never happened at all.

Prototype, Figma v7. The shipping interface matches these.

Defining what to build

6 · 2026.05 — 07

A walkthrough of the product became the skeleton of a PRD, and every feature in it was expanded into an engineering-level spec: interaction detail, edge cases, data model, state definitions, free vs paid, acceptance criteria, priority. That document is the main input to working with AI — including a spec-before-implementation loop. A few of the rules fixed before any code was written:

2026.05
Structure

Capture and processing are two different jobs

Nobody writes coherently in the middle of being anxious. Asking someone to describe their feelings right then puts the barrier exactly where they have the least strength for it.

Core mechanicInteraction trade-off
The thinking at the time
Problem
Tools in this category tend to ask you to "describe how you feel in detail" and "rate the intensity" at the moment the anxiety hits. The request is a burden in itself, and the timing is the worst it could be.
Approach
Cut it in two. Capture takes one line, three seconds, no questions asked. Processing is where the structure lives, and it sits inside the window the user picked.
Cost
Capture-side data is thin, so no deep analysis any time soon. Accepted: people have to be able to use the thing before there is anything to analyse.
2026.05
What to refuse

No streaks, no red dots, no comparison

The standard habit-app toolkit is almost entirely backwards in an anxiety product. These three went into the design spec as forbidden.

Product judgementCounterintuitive
The thinking at the time
Why
A broken streak produces guilt, and guilt is the one thing this audience has no shortage of. A red dot is a nudge by definition. Comparison makes people feel abnormal. All three would lift daily actives, at the price of turning the product into a new source of anxiety.
In practice
The design spec lists these as strings that must never appear — not "avoid where possible":
  • You have 4 unprocessed worries
  • Your streak has ended
  • You are more anxious than average
Consequence
Gave up the most common retention machinery there is. What it buys: on a day you don't open the app, the app doesn't come poking at you.
2026.06
Core flow

Why these three boxes

Can take action, let it go, already over. Sorting isn't for filing. It's so you can see which things never needed you in the first place.

Flow designFraming
The thinking at the time
Axis
The sorting axis is controllability, not the urgent/important grid. What drains people most is pushing repeatedly at things they cannot move, so that's where the first cut goes.
Basis
Not a cut I made up. Lazarus and Folkman's 1984 goodness-of-fit hypothesis says exactly this: whether a coping strategy works depends on whether the situation is appraised as controllable — controllable things call for doing something, uncontrollable ones for changing how you hold them. Mismatch the pair and the effort is wasted.
Provenance
Worry Time itself comes from Borkovec et al.'s 1983 stimulus control work: confine worry to a fixed time and place so it stops getting triggered all day. The third box maps onto LaFreniere and Newman's 2020 Worry Outcome Journal — write worries down, come back later and check what happened. In that study 91.4% of worries did not come true.
Limits
To be clear: those studies were run with people diagnosed with generalised anxiety disorder, in clinical settings. WorryBucket is a journaling tool for ordinary use, not a clinical product, and it has never been tested for efficacy. What I borrowed is the mechanism, not the findings.
The boxes
Can take action: there's a next step, so take it. Let it go: nothing to do, and admitting that is itself a way of handling it. Already over: it hadn't happened when you wrote it down, and now it has an outcome.
The point
The third box is where the value of this product sits. It turns "I worried about that for nothing" into a record that accumulates, instead of a feeling that passes. That's where the self-soothing rate comes from — which, put plainly, is an automatic Worry Outcome Journal. One beta tester was already doing the same thing by hand in his notes app, having read nothing about the product (see 2026.08 below).
One at a time
Sorting shows one item per screen. A full page at once means facing a field of your own anxiety at the moment you are least equipped to judge it. The shorthand used internally is "capture serves the limbic system, processing serves the prefrontal cortex" — that's a metaphor, not a neuroscience claim. What it means is simple: when you're worked up, only writing it down fits; anything that needs weighing waits until you've settled.
2026.06
Choosing a metric

Turning "it turned out fine" into a number

The signature metric is the self-soothing rate: the ones that stopped bothering you plus the ones that faded on their own, as a share of everything you wrote down.

Core metricLater validated
The thinking at the time
Why this one
Most apps put time spent, day streaks or completion rate on the home screen — all measuring how diligently you use them. This one measures how much of your worrying was for nothing.
Mechanism
Every worry carries the time it was written. Weeks later you see with your own eyes that the things that kept you up mostly didn't happen. Being told that does nothing — you have to see the proportion yourself.
Risk
The more a metric matters, the more it costs when it gets polluted. Three months later a tester's question landed right on this. See 2026.08 below.
2026.07
Interaction trade-off

Nudge, but don't lock people out of their own data

"You can only process at the set time" — enforced strictly, that rule means locking someone out of their own records.

Interaction trade-offP0-29
The thinking at the time
Tension
The mechanism works because of the constraint: process any time and it degrades into an ordinary to-do list. But a hard lock creates two problems — you can't look back at what you wrote, and you get shut out at the moment you most need in.
Approach
Visual hierarchy instead of permissions. Inside the window the pink primary button sits in the most prominent place. Outside it, the entrance is still there, just no longer emphasised.
Principle
Design can push someone toward a better choice. It shouldn't confiscate their control over their own data.
2026.07
Notifications

A reminder may soothe; it may never chase

A "deal with it later" product has to tell you when later has arrived, or the loop never closes. But what the reminder is allowed to say is tightly bounded.

Notification policyScope change
The thinking at the time
A judgement I changed
Notifications were originally out of scope for v1, because of system permissions and native builds. Then it turned out they're part of the core loop: without a reminder the user has to remember the time themselves, which is exactly the burden the product promised to take off them. So it moved into v1.
Content boundary
A notification can only be a calm invitation. It may not mention how many items are unprocessed, and it may not appear outside the window. If a reminder makes someone remember on the commute home that they have six worries pending, it has done the opposite of its job.
Technical choice
Local scheduled notifications only, no remote push. No server, no account, nothing leaves the device.

What 196 people taught me

4 · 2026.08 — 09

Beta has been running since late July. What actually changed my mind wasn't the dashboard — it was specific things testers said.

2026.08
Assumption overturned

A fixed clock time is itself the pressure, for some people

The whole product is built on "the same time every day". The people who need it most are exactly the ones whose days aren't regular.

User feedbackCore assumption
How it changed things
Setting a worry time is itself something that makes me anxious, because with PTSD my sleep is sometimes all over the place. My anxious stretch is roughly three or four hours after I wake up, but the app assumes the same rhythm every day. Beta tester, August 2026 (anonymised)
What it exposed
I'd assumed a stable daily rhythm, which makes "pick a time" a small thing. For someone whose rhythm is disrupted, the act of setting it is a reminder of how irregular they are.
The bigger layer
I'd thought the target user was an office worker trying to be more productive. This said the real core user is someone whose sleep and mood are both unstable — the people who need this most, and the ones this design was most likely to shut out. The audience picture changed because of it.
Next
Building flexible scheduling: several windows in a day, or relative times like "a few hours after I wake up", instead of a hard clock time.
2026.08
Metric integrity

"Can I undo a wrong sort?" is really a question about the number

Sounds like a request for an undo button. Two layers down, it pollutes the number on the home screen.

User feedbackPriority raised to top
How it changed things
If I sort something into the wrong box, can I put it back? Beta tester, August 2026 (anonymised)
First layer
Fat-fingered it, wants to undo. An ordinary convenience request, scheduled late.
Second layer
The state it landed in is one-way — the state machine has no path back. So it isn't "inconvenient", it's data that's wrong and can't be corrected.
Third layer
That state is exactly the numerator of the self-soothing rate. One slip and the proportion on the home screen reads high. And that proportion is what the product uses to show its own worth — once it's untrustworthy, "most of what I worried about never happened" is a lie.
Conclusion
This is a metric-integrity problem. It went from "when there's time" to first in the next batch: a reclassify event added to the state machine, the proportion recomputed, with regression tests.
Side finding
Someone asking this carefully is treating the records inside as something that matters. That judgement went straight into how the data-migration warning was written for launch.
2026.08
Assumption validated

Someone was already doing this by hand

A tester who had read nothing about the product described, in his own words, the exact thing the product is trying to prove.

User feedbackDemand validation
Why this one matters
I was already keeping this in my notes app — how I felt before something happened and how I felt after. Over time it gave me confidence, because I could see that a lot of the things I'd been anxious about had actually worked out. Beta tester, August 2026 (anonymised)
What it means
He's describing exactly the experience the self-soothing rate is meant to produce. The product didn't teach him that — he invented the same method himself and was doing it by hand.
Product implication
It means the product automates something people already do on their own, rather than creating a new habit. The second of those succeeds far less often.
Knock-on
It also shows how serious the previous entry is: if people come here to see that proportion, a distorted proportion means the product has failed.
2026.09
Before launch

Don't let people delete their own records at upgrade time

When the public version ships, the natural move is "delete the beta, install the real one". That move erases everything they've collected, permanently.

Migration designThe cost of privacy
How it was handled
Mechanism
The beta and the public build share an identifier, so installing over the top keeps the data. Delete first, then install, and it's gone for good.
Why worse than usual
No cloud, no account, and export hadn't shipped yet, so there was no way back at all. What gets lost is exactly the history the proportion is computed from. After a reinstall you see an empty bucket and 0% — the strongest thing the product has, gone.
The other side of the promise
"Your data never leaves your phone" makes a good line, but the price is no cloud to fall back on. The right move is to state the price alongside it, not just the good half.
Action
Spelled out in three places — the beta notes, the release announcement, the changelog: don't delete, install over the top. Data export shipped in the batch after.

Three roles AI played in this project

Build · Judge · Contain

There's no AI feature in version one. That's a decision, not an unfinished item.

1

Building with AI

The whole app was written in collaboration with AI

From product docs to the state machine to the tests: 16 weeks, 68 commits, 60 test suites. This is my first iOS project, so what was being tested wasn't only "can AI write code" but whether one person, in an unfamiliar stack, can use AI to get something with real users to the edge of shipping.

The working method that came out of it was written down as specs and reusable process: a spec before each change, red-line checks, and an archive of the debugging.

2

Judging when not to use AI

The AI feature was kept out of version one

AI suggestions on the processing screen are the most obvious selling point this product has. It was put explicitly into a paid tier and kept out of v1, for three reasons.

One: AI responses in a mental-health context have to carry a crisis-detection branch, that can't be skipped, and getting it right takes time. Two: calling an AI means sending the content to a server, and the hardest line in v1 is "collects no data". Three: shipping AI before you know where users actually get stuck is usually solving a problem nobody validated.

So version one makes no network calls at all. The App Store privacy label reads Data Not Collected, and that turned out to be the strongest line in the positioning.

3

Containing AI

Constraining a probabilistic system with a deterministic one

The other side of working with AI is that it makes mistakes, often silently. So the product's red lines weren't written as instructions to the AI. They're written as a pre-commit block: hit one and the write is refused, naming the line it touched.

# RED LINE 3: user-facing copy must not contain medical-claim wording
if echo "$CONTENT" | grep -qiE '(cure your anxiety|treat your anxiety|diagnos|…)'; then
  echo '{"block": true, "message": "RED LINE 3: Medical-claim wording detected.
        This is a wellness tool, not a medical device."}' >&2
  exit 2
fi

The pre-commit hook actually running in this project. The same file also blocks client-side key leaks, data access that bypasses the repository layer, and any change that removes the crisis-detection branch.

This came out of a real mistake. A project document carried an inherited conclusion that a certain release path cost "roughly nothing". The AI reused it, and in the same conversation wrote the line "you should verify this yourself". In fact it was an annual fee with a chain of prerequisites, all publicly documented.

The problem wasn't missing information, and it wasn't a missing warning — "you should verify this" was the warning. The problem was that the warning wasn't wired to anything that fires. For a probabilistic system, writing "be careful next time" does nothing, because in the next session that sentence doesn't exist. So the rule got rewritten into something judgeable on the spot: when you're writing "you should verify this" and that fact is being used to make a decision, that sentence is the signal to go and check it now. A human approval gate was added to every change that touches AI guidance for users.

What's next

Roadmap
WorryBucket is a self-care and journaling tool. It is not a medical product, it does not diagnose or treat anything, and it is not a substitute for professional help. Its mechanism draws on worry postponement, a technique with research behind it. Every tester quote on this page is anonymised and contains no identifying information.