一个有状态的本地优先 todo 桌面应用。类 Things 的易用界面,数据是你能直接读写的 Markdown 文件,可同步到 WebDAV / GitHub Private。
当前版本 v0.1.0(M1 · inbox 日用界面,开发中)。界面已支持:默认平铺全部 todo(点日历/任务卡片筛选,再按一次取消;点右上角 home 图标回平铺)、添加 todo(输入框回车,
@唤起文件下拉把新行路由到某个任务或日期、无匹配可就地「创建任务」)、状态三态[ ]/[/]/[x](由开始/完成日期决定,点 checkbox 出日期条来设)、行内编辑(双击文字改名称;点 checkbox 展开日期条设开始/完成、并「标为完成」;换所在文件靠拖——拖到日历某天或任务卡片,整行移动)、任务卡片与任务详情、拖拽迁移(拖到日历某天即整行移动)、拖拽排序(单文件视图内、以及主页里同一来源分组内皆可拖动重排)、软删除(拖动时底部浮出垃圾箱,拖进去 = 整行移进trash/;左栏任务卡片下方的「垃圾箱」条目可查看 / 清空,把里面的行拖到日历或任务即恢复)、外部改动自动刷新(用别的编辑器改 Markdown,界面 ≤2 秒内同步);任务的归档、以及给任务加"目标"等元信息目前仍需编辑文件。
大多数 todo 应用只有"待办 / 完成"两个状态,而且数据锁在私有数据库里。the-boxes 有两个坚持:
- 有状态的 todo:
[ ]想做、[/]在做、[x]完成——三态,贴近真实做事的方式。 - 数据是你的文件:底层全是对人友好的 Markdown,不做 todo 那天,用 VS Code 或 Obsidian 也能继续用,数据永远不丢、不锁。
| 概念 | 说明 |
|---|---|
| inbox | 按"提出日期"组织的 todo 流,一天一个文件,哪天想到的记在哪天 |
| 任务 | 一组相关 todo + 一个整体目标,一任务一文件,按提出月份放在 tasks/YYYY-MM/ 下(防重名) |
| 状态 | 见下表,随文件保存 |
| 写法 | 名称 | 含义 |
|---|---|---|
[ ] |
待办 | 想做,还没开始 |
[/] |
进行中 | 正在做 |
[x] |
完成 | 做完了 |
迁移是物理移动:把 todo 拖到左侧 mini 日历的某一天,整行原样搬到那天的文件(状态、日期注记、任务归属全保留),原文件删掉该行。
数据目录默认在 ~/the-boxes/:
~/the-boxes/
├── inbox/2026-09-19.md # 当天的 todo
├── tasks/2026-09/装修.md # 一个任务一个文件,按提出月份嵌套
└── archive/ # 完结任务归档
inbox/2026-09-18.md 长这样:
# 2026-09-18
- [ ] 回复 Alice 的邮件 ^k3f9
- [/] 写 the-boxes 的 README @start:2026-09-18 ^a02x
- [x] 晨跑 30 分钟 @done:2026-09-19 ^b7q1
- [ ] 买生日礼物 @2026-09-22 ^d4n7
- [ ] 挑瓷砖 +装修 ^e5p8 # 遗留写法;新界面靠所在文件判归属一行的完整格式:- [状态] 内容 [+任务] [@start:日期] [@日期] [@done:日期] [^id]
@start:2026-09-18:开始日期,在日期条(点 checkbox 展开)设置;完成后保留@2026-09-22:意向日期(可选备注,不影响任何视图)@done:2026-09-19:完成日期,在日期条「完成」或点「标为完成(今天)」写入+装修:遗留——早先用来标归属,现在归属 = todo 所在的任务文件,新界面不再写它(放进任务靠"添加时@选/建任务"或"拖到任务卡片")^k3f9:ID,界面内部用它定位;手写不加也行
任务另有一种文件形态:tasks/<月份>/<任务名>.md,顶部 **目标** / **状态** / **提出**,下面 ## todos 放该任务的行——属于哪个任务,看它在哪个文件里。
需要 Node 18+ 与 pnpm。
# 1. 装依赖
pnpm install
# 2. 启动开发界面
pnpm dev打开 http://localhost:5173(端口以终端输出为准)。界面读取 ~/the-boxes/ 的数据:默认平铺全部 todo(按来源文件分组,任务卡片上显示提出月份),点日历某天/任务卡片进入筛选(再按一次取消),点右上角 home 图标回平铺。
第一次打开就可用:如果数据目录是空的,启动时会自动铺一份自解释的示例(一个今日 inbox + 一个示例任务,覆盖三态、起止日期、双击编辑、拖拽迁移、任务归属),照着点几下就会用;顶部「清空示例」一键清掉、从你自己的第一条开始(清空后不会再自动铺)。已有数据的目录不受影响。
| 命令 | 作用 |
|---|---|
pnpm dev |
启动开发界面(本地文件 API) |
pnpm build |
类型检查 + 构建产物到 dist/ |
BOXES_DATA_DIR=路径 pnpm dev |
用指定数据目录(优先级最高) |
添加时在输入框里敲
@,会从已有任务和日期文件里挑;没有同名任务可选中「创建任务」就地新建。直接编辑inbox/、tasks/下的 Markdown 也始终可行——保存后界面会在约 2 秒内自动刷新;给任务补「目标」等元信息目前仍需手写。
数据默认存在 ~/the-boxes/。想换地方(比如放进自己的同步盘),两种方式:
方式 A:.env 文件(推荐,无需记命令)
把 .env.example 复制为根目录的 .env,填上你的路径:
BOXES_DATA_DIR=/Users/你/我的box数据
方式 B:环境变量
BOXES_DATA_DIR=/Users/你/我的box数据 pnpm dev优先级:环境变量 > .env > 默认 ~/the-boxes。改了后 pnpm dev 会自动用新目录。
the-boxes/ # 本仓库
├── PLAN.md # 开发迭代计划(含版本规则)
├── SPEC.md # 数据格式规范
├── docs/friction-log.md # 使用摩擦日志
└── src/ # React + TS 界面
├── App.tsx # 界面
├── api.ts # 数据接口层(后续换 Tauri 实现)
└── lib/parser.ts # 行格式解析器
数据目录(~/the-boxes)与代码仓库是分开的,两者不混。
- GitHub Private:数据目录即一个 git 仓库,点"同步"= add+commit+push
- WebDAV:打包压缩上传,保留最近 N 份
- 两项都在任务路线 M3,尚未落地。当前数据只在本机,重要内容请自己再备份一份。
| 里程碑 | 内容 | 版本线 |
|---|---|---|
| M1 | inbox 可日用界面(添加/打勾/拖拽迁移) | v0.1.x |
| M2 | 任务视图 | v0.2.x |
| M3 | 备份(WebDAV / GitHub) | v0.3.x |
| M4 | 属性(所需时间/环境/领域) | v0.4.x |
| M5 | 打磨 + 发布 | v1.0.0 |
详见 PLAN.md。
MIT @ Chartreuse310 —— the-boxes 是开源软件,欢迎使用、修改、提意见。
