待办工具我用过不少,最后都没坚持下来。原因基本是两个:记的时候要跳出去,以及所有数据只活在一个地方。第一个让记录这件事总是拖到最后,第二个让工具一旦出问题就是灾难。
nForce Todo 是照着这两个坑做的。

弹窗是最高频的入口。记完立刻看到今天还剩几件。
四条记录路径
按「离手边多近」排,不要求你先打开某个应用:
| 方式 | 怎么操作 | 什么时候用 |
|---|---|---|
| 全局快捷键 | 任意页面按 ⌘/Ctrl+Shift+Y | 正在别的窗口干活,不想切 |
| 右键存选中文字 | 选中文字 → 右键 → 把选中的文字存为任务 | 从网页上抄一件事,顺便带上出处 |
| 右键存整个网页 | 空白处右键 → 把当前网页存为任务 | 整篇网页就是一个待办 |
| 弹窗 | 点工具栏图标 | 坐下来集中记几条 |
右键存下来的任务会带上来源链接,任务行里显示域名,点一下跳回原网页。源地址只接受 http / https,别的协议直接丢掉 —— 它最后会被渲染成 <a href>,所以在入口处就把关,而不是等到渲染时再过滤。
顺带一提,contextMenus 和 activeTab 这两个权限都不往安装提示里加字。前者只多一个右键菜单,后者只在你真的右键之后给这一次的标签页读取权,平时读不到任何页面。
一行写完一件事
弹窗和侧边栏的输入框认一套语法,日期、优先级、象限一次设好,不用再点按钮:
| 写法 | 结果 |
|---|---|
回复客户邮件 明天 !1 | 明天到期的 P1 |
整理发票 #委托做 | 放进「委托做」象限 |
评审材料 下周一 | 排到下周一 |
买咖啡 +3 | 三天后到期 |
健身 每天 20:00 | 每天 20:00 提醒(循环) |
晨会 每周一、三、五 09:30 | 周一/三/五 09:30 |
支持的写法:
- 日期:
今天明天后天大后天、周一~周日、下周X、+3、3天后、10月8日、10/8 - 优先级:
!1~!3(也认!p1,以及输入法打出来的全角!1) - 象限:
#立即做#计划做#委托做#有空做#收集箱 - 循环:
每天、每周X(可以写多个:每周一、三、五)、每月N号 - 时刻:
HH:mm,24 小时制,分钟必须写(9:00可以,9只是个数字)
回车之前就能看见结果
输入框下方实时把解析出来的部分显示成胶囊,所以上面那几条规则不用背 —— 打一遍就懂。

三条边界处理得比较克制:
- token 必须独立成词。 中文没有词分隔符,
今天很忙是一个词,整句原样当标题;只有今天 很忙才排到今天。 - 看不懂的内容不会被删。
!9会留在标题里,同时亮一枚黄色胶囊说明优先级只认!1/!2/!3—— 既不静默吞掉,也不静默留痕。 - 整行都是 token 时提示「还差一个标题」,省掉一次「按回车怎么没反应」的困惑。
优先级按钮和语法是同一件事:点 P2 就是把 !2 写进输入框,再点一次清掉。输入框里的文字是唯一的状态 —— 所以按钮亮着的时候,建出来的任务一定就是那个优先级,不可能对不上。
三块视图
侧边栏里可以切三屏,会记住你上次停在哪一屏。
今天 —— 按日期收拢的清单。今天的在上,更早没完成的分组在下面,勾选、双击改标题、拖动改象限都在这里。

四象限 —— 重要紧急那套。按 #立即做 #计划做 #委托做 #有空做 分四格,剩下的进「收集箱」。

看板 —— 三列对应任务的生命周期:
| 列 | 收哪些任务 |
|---|---|
| 待办 | 所有未开始的(含逾期,不会因为日期过了就消失) |
| 进行中 | 所有标记为进行中的 |
| 已完成 | 只收今天完成的 |
「已完成」只收当天是有意的。看板反映的是当前这一轮,把历史上完成过的全部堆进一列,会把刚做完的埋在底下。更早完成的会在列底注明条数,所以不会出现「任务去哪了」的困惑。
卡片可以拖拽跨列,也可以用卡片上的下拉框移动 —— 拖拽只对有鼠标的人友好,下拉框对键盘和触屏同样可用。

循环任务与到点提醒
循环与否由每条任务自己决定,不是全局开关:同一天里可以既有「每天喝水」,也有一条只做一次的「交材料」。
设重复有两条路,但是同一条路 —— 在输入框里直接写 token,或者点下方「重复」面板点选。面板上每一次点击都会改写输入框里的 token,预览随之重新解析。所以面板显示的东西和最终建出来的任务不可能对不上。

到点之后提醒分三层,都不打断你:
| 层 | 表现 | 默认 |
|---|---|---|
| 图标徽章 | 有任务到点时,徽章从「今天还剩几件」收窄成「几件到点了」,颜色从主题青变玫红 | 开 |
| 插件内提醒条 | 弹窗和侧边栏顶部出现一条,最多列两条,更多的折成「还有 N 项在下面」 | 开 |
| 系统通知 | 一条原生通知,点开看到是哪件事 | 关,在设置页里拨开 |

提醒条故意没有「忽略」按钮:一条还成立的提醒被静音,正是徽章和提醒条开始互相矛盾的方式 —— 前者说 2 件到点,后者被你关掉了。让它消失的办法是完成它。
系统通知默认关,是因为 notifications 是少数会往安装提示里加一行字的权限。它被放进可选权限,只有你在设置页拨开那个开关的那一刻才申请。不给它,上面两层照常工作。
打勾一条循环任务 ≠ 完成它
而是原地推进到下一次:
| 什么时候打勾 | 下一次落在 |
|---|---|
| 提前打完(09:00 的任务,08:00 就做完) | 明天的 09:00 —— 不会把今天的坑位重新武装一遍 |
| 到期后拖了几天才打勾 | 从现在算起的下一次,绝不会算出一个已经过去的时刻 |
所以循环任务永远停在「待办」列:不进「已完成」、不计入完成率。它是一条一直在的规矩,不是一件做完的事。
还有一处容易做错的地方:逾期未完成的循环任务不会被「顺延到今天」扫走。那会把昨天错过的坑位变成今天的,提醒时间就指向了规则从没选过的一天。它会留在错过的那个日期上,显示为已到期。
闹钟是按 chrome.alarms 精确设到那一刻的,不是每分钟轮询 —— MV3 的 worker 空闲 30 秒就被回收,每分钟叫醒一次等于每天重启 1440 次。浏览器关着的时候闹钟不会响,所以下次启动会补一次检查,错过的那条还是会出现在徽章和提醒条里。
数据存哪:本机 + ima
默认所有任务存在浏览器本地。够用,但有两个隐患:清缓存会丢,换电脑要导出导入。
所以做了 ima 备份。连上之后,一天一篇 Markdown 笔记,当天的改动按时间往下追加。
ima 的开放接口只能新建笔记和追加内容,不能修改也不能删除 —— 所以不是「同步」而是「追加快照」。当天第一次改动新建一篇,之后每次改动往同一篇末尾追加一节,跨天自动开新的。每一节都是当时任务状态的完整快照,单独看也能还原:
# TODO 快照 · 2026-10-01 周四
## 09:12 · 9 项任务
> 共 9 项任务 · 待办 6 项 · 进行中 1 项 · 已完成 2 项
> 今天 5 项,已完成 2 项(40%)
### 今天 · 10月1日 周四
- [ ] 整理本周的项目周报 · P1
- [ ] 准备下周评审会的材料 · 进行中 · P2
- [x] 把设计稿同步给前端
### 更早未完成 · 3 项
- [ ] 补上昨天的会议纪要 · P1
- [ ] 整理发票报销 · 每天 09:00
内容没变就跳过,网络抖动会自动重试。连接步骤:去 ima 的第三方接入页拿 Client ID 和 API Key,填进扩展设置页,点「授权并测试连接」,然后允许一次 ima.qq.com 的域名授权。
扩展默认不申请任何网站权限,只有在你点连接的时候才按需申请这一个域名 —— 所以安装时不会出现「读取你在所有网站上的数据」这种吓人的提示。

深色模式是跟着系统的,也能在标题栏手动切。

安装
git clone https://github.com/iamnicwu/nForce-Todo.git
然后 chrome://extensions/ → 开发者模式 → 加载已解压的扩展程序 → 选仓库根目录(就是有 manifest.json 的那一层)。
要 Chrome 114 以上,侧边栏 API 的最低版本。
这里有个我特意压平的结构:扩展根 == 仓库根,全仓只有一份生效的 manifest.json,没有 src/。因为误选子目录时 Chrome 只会甩一句 Manifest file is missing or unreadable,不告诉你要选哪一层 —— 与其写文档让人猜,不如把目录结构做成只有一个答案。不确定就跑 npm run check,它会直接把该选的路径打出来。
npm run build 是可选的打包步骤,产出 dist/ 用于分发。日常开发用仓库根就好,改完点一下扩展页的刷新键,不用构建。
几个实现上的取舍
零构建也能跑。 源码树本身就是一份可以直接加载的完整扩展,克隆下来就能用。打包只是给分发用的,不是运行的前提。少一个构建步骤,就少一类「为什么我的改动没生效」的问题。
「必须发生」的状态落库不放 UI 页面里。 这条是踩出来的:一开始把「录制/编辑」类的持久化逻辑写在了页面脚本里,结果页面一关数据就丢。现在凡是必须落盘的事情都在 Service Worker 里做,页面只负责展示和消费。
备份用追加而不是覆盖。 因为 ima 的接口不支持修改,反而逼出一个更好的设计 —— 快照序列本身就是历史记录,翻上去能看到某一天上午和下午任务状态的变化。
已知限制
- 不连 ima 就纯粹是本地数据,换浏览器不会同步。
- ima 侧只增不减,笔记会随时间变长;重装或者想清理得去 ima 里手动处理。
- 系统通知需要单独授权;不给也能用,只是少一层提醒。
- 浏览器完全关闭时闹钟不会响,靠下次启动补检查。
小结
这大概是四款扩展里我自己每天真正在用的一个 —— 因为它解决的是我自己的问题:记的时候不要有摩擦,存的时候不要只有一个副本。一行语法是为了第一条,ima 备份是为了第二条。