Pistochia
即将上线一款面向 ADHD 人群的 iPhone 应用。把脑子里想的事说出来或打出来,它会返回一个个足够小、能让你开始动手的步骤,并按你当天的精力排好顺序。
- 我的角色
- 独立完成设计与开发
- 年份
- 2026
- 使用技术
- Expo · React Native · SQLite · Supabase Edge Functions · Claude · Whisper · RevenueCat
横向滚动可以看到完整的图。
问题
对 ADHD 人群来说,难的往往不是记住,而是开始。一个把整座任务大山都存起来的待办应用,最后会变成一张让人内疚的清单。工作单元必须缩小到开始变得轻松为止,而且应用必须一打开就能用。
实现方式
一个离线优先的 Expo 应用,数据存在本地 SQLite 里,迁移有版本管理。身份用的是 Supabase 匿名认证,所以在出现任何注册页面之前,用户就能先把脑子里的想法倒出来。每一次 AI 调用都要经过一个按操作工作的边缘函数:应用只发送操作名和参数,从不发送 prompt,也从不发送密钥。函数会用白名单校验操作,并执行按 IP 的限流、按安装的每日配额,以及一个紧急开关。Claude 负责拆解任务,Whisper 在同一个代理后面处理语音。付费墙由 RevenueCat 负责,数据分析在用户同意之前一直关闭。
关键决策
应用不持有 API 密钥
进来的是操作名,出去的是结构化结果。API 密钥放在边缘函数里,前面有紧急开关,还有出错时默认拒绝的配额和限制。
离线优先
任务存在手机上的 SQLite 里,有正经的迁移机制。一个面向 ADHD 的工具,如果要联网才能显示你的下一步,就辜负了它本来要帮助的人。
首次使用前不需要注册
匿名认证会在后台悄悄创建一个身份。账号页面要等应用派上用场之后才出现。
仓库里的代码
// The legacy free-relay surface: any request still carrying these is either
// an outdated client or an abuse probe — reject outright.
const FORBIDDEN_KEYS = ['system', 'model', 'messages', 'maxTokens'] as const;1
// …
const paused = Deno.env.get('AI_PAUSED');2
if (paused === 'true' || paused === '1') {
return jsonResponse({ error: 'ai_paused' }, 503);
}
// …
for (const key of FORBIDDEN_KEYS) {
if (key in body) {
return jsonResponse({ error: 'invalid_request' }, 400);
}
}
const op = body.op;
if (typeof op !== 'string' || !(op in OPS)) {3
return jsonResponse({ error: 'invalid_op' }, 400);
}
const config = OPS[op]!;
第 3 行. 应用无法发送 prompt、模型或 token 上限。这些都放在服务端,应用只能指定白名单上的某个操作。
第 6 行. AI_PAUSED 就是紧急开关:只需一个环境变量,不用重新部署就能停掉所有 AI 开销。
第 19 行. 未知操作会被拒绝。API 密钥从不出现在应用包的任何地方。
目前进展
App Store 上架材料、上线检查清单、EAS 构建、宣传视频,以及带候补名单的 pistochia.com 都已准备好。先做 iPhone 版,下一步就是在 App Store 上架。