一个人 + 一只 AI,断断续续几个月,把
yx_mind改名叫了「汐图」。这是这段时间的一点絮语。
一、为什么又做一个思维导图
互联网上从来不缺思维导图。XMind、MindNode、幕布、Workflowy、Heptabase、Obsidian Canvas……我用过的就有七八个。
但我每次打开它们都会有一种很微妙的不适感:要么功能太重,菜单铺天盖地;要么键盘流不彻底,永远要回到鼠标点点点;要么风格审美让我觉得"还行但还差一口气"。
我想要的其实很简单:
- 打开就想用,不需要适应;
- 一只手在键盘上就能把骨架搭出来;
- 文件躺在本地,看得见摸得着,不绑账号;
- AI 是助手而不是套娃,用我自己的 Key,不抽成不代收。
这件事我以为有人做了,但翻来翻去都不够"那个味儿"。于是我自己动手了。项目代号 yx_mind,后来在 v0.1.2 那一刻才有了正式的名字——汐图。
二、走过的几个里程碑
我把开发分成了 M0 到 M5 六个阶段。回头看,每一段都有它独有的情绪。
M0 是技术验证。 那段时间我每天都在想:1000 个节点 + 拖拽 + SVG 连线,浏览器到底扛不扛得住。第一次跑出 60 FPS 那天,整个人在椅子上往后一仰,啊,原来真的可以。
M1 是 MVP。 写 core/store.ts 的时候我犯了无数次蠢错——Immer 的 produceWithPatches 配合自定义 undo/redo,文本编辑要有 800ms 合并窗口,不然每打一个字都算一次撤销。第一次按 Ctrl+Z 把一整段输入"一口气吐出来"那个瞬间,比写完功能本身还快乐。
M2 是视觉打磨。 这是我做得最慢、改得最多的阶段。字号梯度调了八版,节点 hover 时浮现的那个 "+" 按钮我反复改了 transition 曲线,配色方案做了五套(daylight / forest / ocean / sunset / mono)。MindNode 那种"克制的精致",真的不是说说而已。
M3 是导入导出。 Markdown、OPML、XMind 全部打通。.yxmind 自己的文件格式是个 ZIP 容器,里面装着 document.json 和 assets/ 目录。看着自己设计的文件被双击打开,比看一个 PR 被 merge 还有成就感。
M4 是 AI。 我没用任何官方 SDK,OpenAI 兼容协议是我手写的 SSE 流式解析。一句话生成子树、扩展分支、总结、改写——四种操作,全部走 commit() 包成 batch command,所以一键 Ctrl+Z 可以把 AI 生成的整棵子树撤掉。这个细节我打磨得最满意。
M5 是发布候选。 中英文 i18n、Tauri 2.x 接入、Windows 安装包、应用图标、博客介绍页……一项一项地划掉的时候,我感觉自己在做一件"成品",而不是"作品"。这两个词之间的距离,可能就是独立开发最难跨过的那一步。
三、踩过的坑里,最难忘的是哪些
第一个是 core/*.ts 之间的 import 必须显式写 .ts 后缀。这条我踩了至少四次。每次都是算法测试跑不起来报 ERR_MODULE_NOT_FOUND,我盯着错误信息半天,最后才反应过来:node --experimental-strip-types 不会自动补扩展名。
记忆这种东西真是不可靠的。所以我把这件事写进了 CLAUDE.md,也写进了 AI 的长期记忆。下次再踩,至少不是从零开始踩。
第二个是节点长文本截断。我用了 white-space: nowrap,结果稍长一点的文本就被吃成 ...。第一次我加了 white-space: normal,结果短文本(比如"新文档"三个字)也开始变胖;第二次我加 max-width: 250px,节点还是胖——因为 flex item 的 min-content 把它撑开了。第三次我加了 width: max-content,才终于让短文本紧凑、长文本到 250px 自动换行。
CSS 这门语言,永远在用最朴素的方式提醒你:你以为你懂了,其实你只是没踩到那个 case。
第三个是图片节点的布局刷新。图片可以拖拽 resize 改宽度,但 ResizeObserver 有 60ms 的批量 debounce,导致拖拽时画布上的连线滞后于图片实际尺寸,视觉上"飘"。我最后给 onMeasured 加了一个 immediate 参数,图片节点的测量绕开 debounce 直接同步 flush。一行参数,背后是两个小时的拧巴。
四、与 AI 协作开发是种什么体验
实话说,这个项目不是我一个人写完的——它是我和几只 Claude 接力写的。
我会写文档(01-PRODUCT.md 到 08-BLOG-DEPLOY.md,加上 CLAUDE.md),把约定、踩过的坑、技术决策全部沉淀在仓库里。AI 接手新会话时,先读这些文档,再动手。这套工作流让我意识到:
代码本身只是表层,真正的"项目"是那些约定、那些 why、那些被记下来的"上次我们为什么这么决定"。
AI 写代码很快,但 AI 不会替你做决定。是用 Electron 还是 Tauri?字体梯度要 8 阶还是 10 阶?AI 配色方案是默认的还是相对的?这些问题只能我自己拍。AI 帮我把"我决定了的事情"以更高的速度落地,仅此而已——但仅此一件事,已经把独立开发的门槛拉低了不止一个数量级。
最有意思的是,AI 偶尔会给我一些我没想过的视角。比如做 i18n 那次,我本能要装 i18next,AI 看完我的需求后建议我"50 行自研一个就够了"——后来确实够了,而且没有任何 React Context Provider 缠绕在外面。
人和 AI 之间最好的关系,不是把它当工具,也不是把它当队友,而是当一个不会累的同事——它会问"你确定要这么做吗",但你说"对,就这样",它就埋头干,干完还会写一份"为什么这么做"的复盘留给下一只 AI。
五、改名「汐图」的那一刻
yx_mind 这个代号跟了我很久。它够用,但它没有灵魂——只是 "云汐" + "mind" 的拼写。
v0.1.2 那天,我决定给它一个真正的名字。AI 帮我用 GPT Image 画了新图标:水墨线稿的月亮 + 一抹云 + 静水纹,圆角米底,黑描边,灰蓝点缀。月浪手账风。
那一刻看着新图标在 Windows 任务栏亮起来的时候,我突然意识到——
它已经不是一个我"在做的项目",它是一个独立的小东西了。
为了避免破坏老用户的本地数据,我没有动 localStorage 的 yx_mind:* 前缀,也没有改文件夹和仓库名。表层是「汐图」,骨子里还是 yx_mind。这种"内外不一致"的小别扭,反而让我觉得很真实——就像一个人的本名和笔名,并不冲突。
六、接下来呢
发布候选阶段还有几个坑没填:
- 代码签名(Windows SmartScreen 那个吓人警告)
- Tauri Updater 自动更新
- 崩溃上报
- macOS 构建
以及一些我自己用着用着想要的小功能——大概会按"哪个最烦我"的顺序一个个做下去。
这就是独立开发的节奏:没有 sprint,没有 OKR,没有产品经理拍着桌子要 feature。只有"今天我想干嘛"和"用户(也就是我自己)正在被什么烦着"。
七、写在最后
如果你也在用思维导图,欢迎来试试「汐图」。Windows 安装包在我博客的下载页,免费,不联网,文件躺在你自己电脑上。
如果你也在做独立产品,那我想说的是——最难的不是写代码,是允许自己慢一点、做得粗一点、先发出来再说。我自己也还在学。
如果你正在犹豫要不要让 AI 帮你做点什么——别犹豫了,让它帮你做一个你想了很久但一直没动手的东西吧。哪怕它不完美,做出来本身就已经赢了一半。
下一篇大概会写写 AI 协作那套工作流的细节,包括我怎么用 CLAUDE.md 和长期记忆把"上下文"沉淀下来。
——云汐 2026 年初夏

评论
0 条评论加载中...