一个只有我看得到的仪表板:Cloudflare Worker+Apple Reminders+调度 AI
发布于
大学生的事情散在太多地方:死线、学校邮件、交换进度、学会工作,各有各的地方。我想要的是早上打开手机,一个画面就知道接下来 30 日要做什么。
于是我做了 dash.joenyc.net:一个跑在 Cloudflare Worker 上的私人仪表板,前面加一层 Cloudflare Access,只有我自己登录得到。这篇讲三件事——数据从哪里来、怎样做到几乎不用手动更新、以及几个设计上的取舍。
仪表板上有什么
| 区块 | 内容 | 数据源 |
|---|---|---|
| 未来 30 日 | 所有死线按日期排 | Apple Reminders |
| 学业 | 可按科目筛选;本周/未完成/全部 | Apple Reminders |
| 学校邮件摘要 | 每个平日早上的重点邮件 | Claude 调度任务 → Notion |
| 投资 | 每周损益与成本 | IBKR Flex 自动导出 |
| LiU 交换 | 交换流程的待办与倒数 | — |
| Campus YMCA | 内阁工作 | — |
| 个人 | 其他杂项 | Apple Reminders |
学校邮件摘要原本的位置是「实习申请」区块,后来申请季过了,换成每天真正会看的邮件摘要。

版面示意图,不是实际截屏——内容和投资数字都刻意留空。
架构:Worker+KV,从 Mac 部署
整个站是一个 Cloudflare Worker,数据存在 Workers KV,项目放在我 Mac 上,用 wrangler 部署。
整条数据流画出来是这样:
flowchart LR
R[Apple Reminders] <-->|launchd 每小時<br/>雙向同步| W
C[Claude 排程任務<br/>平日 9:00] -->|寫摘要| N[Notion<br/>「郵件總結」]
N -->|讀取| W
I[IBKR Flex 報表] -->|平日早上自動拉| W
W[Cloudflare Worker<br/>+ KV] --> A{Cloudflare Access<br/>只限本人}
A --> P[iPhone PWA/瀏覽器]
W -.每日備份 · 保留 30 日.-> B[(備份)]
用 Cloudflare Access 锁门,而不是自己写登录
仪表板上有学业、邮件和投资数据,绝对不能公开。我没有自己写登录系统,而是在 Worker 前面放 Cloudflare Access:只有我的帐号能通过,其他人连页面都看不到。
在 iPhone 上我把它加到主画面当 PWA 用,打开就像一个 App。
让它自己更新:三条自动化管道
仪表板最怕的是变成「又一个要手动维护的东西」。所以我定了一条原则:我只在原本就会用的地方输入,仪表板只负责显示。
1. Apple Reminders ⇄ 仪表板:每小时双向同步
待办我主要在 Apple Reminders 加和剔,因为 iPhone、Mac、Siri 都能直接用。Mac 上有一个 launchd 调度,每小时把 Reminders 同步到仪表板;完成状态是双向的——在仪表板剔了,Reminders 也会剔。
2. 学校邮件:Claude 调度任务 → Notion → 仪表板
每个平日早上 9 点,一个 Claude 调度任务会读学校邮件、写一份摘要到 Notion 一个叫「邮件总结」的页面,仪表板再去读那一页。
有趣的是,我自己从来不打开那个 Notion 页面——Notion 在这里纯粹是中转站,让 AI 有一个写得进去、Worker 又读得出来的地方。
3. 投资:IBKR Flex 每个平日早上自动拉
投资区块只看三样:每周损益、成本、总损益。数据用 IBKR 的 Flex 报表在平日早上自动拉回来,不用手动抄。