用过一圈市面上的待办软件之后,我一直有个怎么都没法适应的痛点:几乎所有软件都把“任务本身”和“哪天去做”死死绑在一起。比如手头有一件开发任务,我既想让它安安静静躺在所属项目的目录里,又想把它挂在“下周三”的日程上,同时还想塞进“服务器额度重置后”这个特定事件节点里。在传统待办工具里,除了把这条任务复制粘贴三遍、改状态时再挨个去勾之外,根本没有别的办法。
为了治好这个毛病,我决定自己动手写一套能把“任务”和“排期”彻底拆开的自托管工作台。
定名 TaskDock 与离线优先同步底座
2026 年 9 月 5 日到 8 日(Commit daf0725、f0a2d40),我把早期代号叫 DevTodo 的工程正式定名为 TaskDock(仓库 IGNGserver/taskdock)。后端用 Fastify 搭配 PostgreSQL 18,默认监听非常用端口 48731;Web 前端则用 Dexie 和 IndexedDB 实现了一套原子 Outbox 离线优先同步机制——平时在页面上增删改查全是本地零延迟落盘,后台再静默把变更队列推给服务端。
最核心的设计,就是把领域模型拆成了 Task(任务本体) 和 Placement(排程位置) 两层。一条任务只有唯一的一份本体,但它可以同时拥有多个 DATE(具体日期)或 EVENT(自定义事件)排程切片。不管你在日程表还是事件列表里把勾打上,改的都是背后同一个任务。
忍不了混合壳手感,4 天后用 Kotlin 重写原生安卓端
9 月 8 日发出 v0.1.0 首发版时,为了图省事,手机端我直接套了一层 Capacitor WebView 混合壳。结果自己装在手机上用了仅仅 4 天,那种滑动时的粘滞感、软键盘顶起时的闪烁以及过渡动画的掉帧,就让我实在忍不下去了。
既然是每天都要高频打开几十次的工具,手感差一点都会让人不想点开。到了 9 月 12 日(Commit 379cea6),我干脆利落地把刚写了没几天的混合壳全部扔掉,用 Kotlin + Jetpack Compose + Room 数据库 从头重写了一套纯原生的 Android 客户端,把本地离线缓存和同步状态机原原本本搬到了原生层。