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

nForce Todo 是照着这两个坑做的。

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 只是个数字)

回车之前就能看见结果

输入框下方实时把解析出来的部分显示成胶囊,所以上面那几条规则不用背 —— 打一遍就懂。

一行语法与实时预览
「回复客户邮件 明天 !1 #立即做」被拆成了 明天 / P1 / 立即做 三个胶囊,同时 P1 按钮自动点亮

三条边界处理得比较克制:

  • 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 备份是为了第二条。

代码在 github.com/iamnicwu/nForce-Todo 。