【More Than Coding】一句话想让论文编辑对“ADHD”更友好 —— GrapePaper,一个葡萄藤主题的学术编辑器原型

GitHub:https://github.com/SamZebrado/GrapePaper

1. 摘要

我尝试从零做了一个叫 GrapePaper 的学术编辑器原型:段落被渲染成“石板”,批注像“葡萄叶”一样从段落边缘长出来,引用像“露水”一样附着在文本附近,和批注相关的问题则以侧边聊天面板的形式展开。

这个项目主要用 TRAE / SOLO Code 协助完成,从想法整理、竞品调研、开发计划、代码实现,到测试、重构和文档收口,基本都经历了多轮迭代;遇到疑难问题时,我也会让另一个 LLM 参与复核、验收和纠偏。

项目使用 React + TypeScript + Vite 构建,当前已实现:

  • 基础富文本编辑
  • 批注的添加 / 编辑 / 删除
  • 引用的展示与悬停预览
  • Markdown / JSON 导入导出
  • localStorage 持久化
  • 中英文界面切换
  • 60+ 测试用例

但需要提前说明:当前版本仍然是一个可运行的交互原型,而不是成熟产品。
虽然核心交互链路已经打通,但 UI 细节、视觉一致性、引用工作流、真实 AI、PDF / Zotero / docx / tex 等能力都还没有完成。包括“石板、树叶、露水”这些视觉元素,目前也只是做到了“有这个方向”,还远远没到精细打磨的程度。


2. 背景

我是一个平时需要大量读论文、写论文的博士生。虽然不是职业前端开发者,但科研工作里经常要写代码、搭工具,所以会自然地从“自己真实会不会用”这个角度去想工具。

传统论文编辑器(例如 Word、Overleaf、Google Docs)在功能上当然已经很强,但它们的视觉与交互逻辑都比较统一:白底黑字、线性文档、层层菜单。这些设计本身没有问题,但长时间面对整页规整文本时,确实会带来一种比较直接的心理压力。对我来说,这种压力不一定来自“论文”本身,也不一定能靠换个主题就解决,但如果能把写作界面做得稍微“没那么像论文”,也许能给情绪一个更平缓的台阶。

于是我想试一个方向:

如果论文编辑器不长得像论文,而更像一个花园式的写作空间,会怎么样?

GrapePaper 就是在这个问题上做的一个原型探索。
它的目标不是证明“自然隐喻一定更好”,而是先验证:这种界面风格和交互组织方式,能不能支持一个基本可用的学术写作原型。


3. 实践过程

3.1 先做竞品调研,而不是直接开写

在真正写代码之前,我先让 SOLO Code 和其他 LLM 协助做了一轮竞品调研,重点看的是与以下方向相关的产品:

  • Gingko Writer
  • Scrintal
  • Heptabase
  • LiquidText
  • Curvenote
  • Hypothesis

调研之后比较清楚的一点是:

  • 直接竞品很少:我没有看到谁在做“葡萄藤 / 石板 / 露水”这种强自然隐喻的学术编辑器。
  • 相邻竞品不少:它们分别覆盖了树状写作、视觉知识管理、跨文档批注、科学写作、社交标注等能力。

所以 GrapePaper 的定位不应该写成“功能首创”,而应该更诚实地说:

它的独特点不在于单点功能,而在于尝试把写作、批注、引用和对话整合进一个自然隐喻驱动的界面原型里。


3.2 技术选型:优先选熟悉、稳定、便于快速迭代的栈

后面定下来的技术栈大概是:

  • React 18
  • TypeScript 5.6
  • Vite 6
  • Zustand(状态管理)
  • TipTap 2(富文本编辑)
  • Framer Motion(动画)
  • CSS Modules + CSS Variables(主题与样式)
  • Vitest + Testing Library(测试)

这里有一个挺现实的点:项目最开始尝试过更新一点的构建方案,但很快在依赖和跨平台问题上踩坑,后面又退回到更稳妥的版本组合。也就是说,这个项目不是一开始就设计得很完美,而是边做边收紧、边踩坑边回退到更稳方案。


3.3 核心组件与交互原型

在原型阶段,逐步做出来的主要组件包括:

  • StoneSlab:石板段落容器
  • GrapeLeaf:批注叶片
  • DewdropCitation:露珠式引用显示
  • ChatPanel / ChatBubble:批注相关聊天面板与消息
  • VineConnector:段落间的藤蔓连接装饰
  • Sidebar:文档标题、段落导航、导入导出、状态区
  • EditorCanvas:主编辑区域

这些名字听起来挺完整,但要诚实一点说:
“组件已经实现”不等于“视觉已经打磨成熟”。
当前版本里,更可靠的部分是交互链路和工程结构;视觉层面仍有明显的原型味道。


3.4 多轮迭代:从“能跑”到“可复现”

后面的主要工作,其实不是不停加新功能,而是反复做这些事情:

  • 修构建和依赖问题
  • 把导入导出逻辑从 UI 中抽成纯函数
  • 给 localStorage 加恢复与校验
  • 加 JSON / Markdown 导入导出
  • 给批注补编辑 / 删除
  • 把 alert / confirm 之类的临时交互替换成更统一的 UI 反馈
  • 做 UIContext 重构
  • 补测试
  • 改文档
  • 清理源码包和交付物

一路做下来,项目最后形成的是一个可运行、可测试、可复现的本地原型,而不是“做完一个成熟产品”。


4. 成果展示

4.1 当前已完成的内容

截至当前版本,项目已经实现:

  • 基于 TipTap 的富文本段落编辑
  • 批注的添加、展开、编辑、删除
  • 批注相关的 mock 聊天面板
  • 引用的露珠式展示与悬停预览
  • Markdown / JSON 导入导出
  • localStorage 本地持久化
  • 中英文界面切换
  • 60+ 测试用例
  • npm install / test / typecheck / build 可通过

4.2 当前明确未完成或仅为展示的部分

这部分我想写得直接一点,因为比赛里我不想把“原型”说成“产品”:

  • AI 聊天目前是 mock,没有接真实 LLM
  • 引用目前是展示型功能
    使用硬编码示例数据,支持悬停预览,但不支持编辑、创建、删除,也没有 Zotero 集成
  • 没有 PDF 导入 / 渲染
  • 没有 docx / tex 导入
  • 没有深色主题
  • 没有移动端响应式优化
  • 视觉层仍是半成品,包括石板、树叶、露水、藤蔓等元素都还没精细打磨

4.3 截图展示(建议少放、但放关键图)

建议只放 4–6 张最有价值的图,不要堆太多:

  1. 总览图
    左侧侧边栏 + 右侧石板段落主编辑区
    【放 overview 图】

  2. 标题与正文编辑
    展示标题输入和段落编辑
    【放 title / paragraph 编辑图】

  3. 批注展开与编辑
    展示 annotation 的展开与编辑状态
    【放 annotation expanded / editing 图】

  4. 聊天面板
    展示从批注进入的 mock chat
    【放 chat panel 图】

  5. 导入导出或重置确认
    展示文档状态管理和文件进出能力
    【放 import/export 或 reset confirm 图】

如果图片数量有限,我会优先保证:

  • 总览
  • 批注编辑
  • 聊天面板
  • 导入导出 / reset
    这几张。

5. 效果与总结

5.1 SOLO 在这个项目里实际扮演了什么角色?

如果用一句话概括,我会写:

SOLO 更像一个高吞吐的实现代理,而不是“自动完成项目”的黑盒工程师。

它在这个项目里最有价值的地方,是承担了大量高频、机械、容易烦、但又确实要做的工作:

  • 把想法快速落成代码原型
  • 反复做重构和版本收口
  • 生成组件骨架、测试骨架、文档草稿
  • 在明确需求后持续推进实现
  • 把很多“人会嫌烦”的工程体力活前置吃掉

但它没有替代掉的事情也很清楚:

  • 产品判断:做多少算够,哪些应该停
  • 最终验收:源码包、版本号、文档、截图是否真的一致
  • 发布把关:旧 zip、旧截图、残留文案、状态漂移
  • 对外表述的诚实性

也就是说,这个项目不是“SOLO 一键做完”的,而是:

SOLO 负责大量实现和收口,LLM 负责辅助审阅与纠偏,而最终方向判断和验收边界仍然需要人来决定。

5.2 实际提效大概有多大?

这个我也想写得保守一点,不写那种明显不可信的数字。

如果由一个熟悉 React / TypeScript / 测试体系的人,纯手工把这个项目做到当前阶段——包括:

  • 多组件原型
  • 本地持久化
  • JSON / Markdown 导入导出
  • 批注 CRUD
  • UIContext 重构
  • 中英文切换
  • 60+ 测试
  • 文档与交付收口

我觉得保守估计,至少也要 2–4 周的集中开发与验证时间

而在这个项目里:

  • 如果只看代码实现和重构吞吐,SOLO 至少替我承担了 60%–80% 的机械实现工作量
  • 如果把“写代码 + 验证 + 纠偏 + 发布收口”一起算,整体效率提升更接近 1.5×–2.5×

这个数字我觉得更诚实。
因为项目后半段其实花了不少时间在:

  • 反复验包
  • 修版本口径
  • 修文档残留
  • 修截图脚本
  • 修展示层问题

这些工作并不会因为用了 SOLO 就自动消失。

5.3 这个项目最后说明了什么?

我觉得 GrapePaper 至少说明了一件事:

学术写作工具不一定必须长成“传统学术工具”的样子。

但当前版本还只能说明到这里。
它还不能证明:

  • 这种自然隐喻一定比传统编辑器更有效
  • 或者它已经是一个成熟产品

所以更准确的定位是:

GrapePaper 证明了这个方向值得做一个可运行原型,但还没有证明它已经是一套成熟可推广的产品方案。

这也是为什么我更愿意把当前版本叫做:

  • 可运行的概念验证
  • 交互原型
  • Phase 1 半成品

而不是“完整学术编辑器”。


6. 最后

这个作品最开始只是一个有点任性的想法:
“如果论文编辑器不长得像论文,而像一个花园,会怎么样?”

做到现在,它至少已经从一句想法,变成了一个能跑、能测、能展示、也能诚实承认自己还是半成品的原型。

我觉得这就已经很值了。

如果后面还有精力,Phase 2 可能会继续做:

  • 真实 AI 接入
  • 更成熟的引用工作流
  • PDF / Zotero
  • 更细的视觉打磨
  • 更完整的写作体验

但在当前这个阶段,我更愿意把它如实地放在这里:

一个由 SOLO Code 大量参与实现、经过多轮迭代后仍然保持半成品状态,但已经具备清晰方向和基本工程闭环的学术编辑器原型。

问(笑死,好像真的有同类产品,不过不完全一样——不知道是不是之前刷到过才给了我灵感;贴上来吧):

吐泡泡是指一个泡泡是提问一个泡泡是回答,越古老的消息的泡泡越小(小到一定程度就可以不显示文字);
虽然本质是主题,但我们可以从做一个Web应用开始;
这是一个参赛作品,请建立好git并定期更新开发日志(使用dev-workflow技能)
日志和文档中的路径记录请使用相对路径、隐去我的用户名
你提到的 Gingko Writer 是什么?可以介绍一下它的功能特性,谢谢你~

MTC答(只贴部分):

Gingko Writer 简介

Gingko Writer (gingkoapp.com) 是一个基于树状结构的写作工具,它的核心理念是:

  • 树状卡片写作:文档被组织成从左到右展开的树形结构。最左边是大纲/章节,中间是段落,最右边是具体句子。每一层都是一个"卡片",你可以逐层展开细化

  • ADHD 友好:官方明确标榜 “The ADHD Friendly Writing Tool”。核心思路是把"写一整篇论文"这个大任务分解成"填一张小卡片",降低心理负担

  • 三种视图:可以切换为 Outline(大纲)、Cards(卡片)、Columns(多列)视图

  • 学术写作:大量博士生和学术研究者使用,适合先搭建论文骨架再逐步填充内容

  • 导出:支持导出为 Markdown、HTML、DOCX、PDF 等格式

与 GrapePaper 的区别:Gingko 的视觉风格是传统的简洁白色UI,只是结构上用了树的隐喻。而 GrapePaper 是在视觉渲染层面做自然隐喻(石板、藤蔓、露水),这是完全不同的方向。

1 个赞

:sparkling_heart:节选一段LLM监制老师对MTC回复和开发进度的评估,供相同需求的朋友们参考:

我看完之后,结论很明确:

这个项目想法是好的,原型也不是空壳,但 SOLO 给的“下一步”顺序不合适
它现在最需要的不是继续接 OpenAI / Zotero / PDF,而是先把 交付物变成“别人解压就能跑、文档说法和实际一致” 的状态。

你这次本地报错不是小问题。你贴出来的日志里,vite 启动时直接因为缺少 @rolldown/binding-darwin-arm64 而失败,错误文本还明确指向 npm 的 optional dependency / lockfile 问题。 npm 官方确实有这个已知问题:当带着已有 node_modules 重新生成或传播 package-lock.json 时,平台相关的 optional dependencies 可能不会完整写进 lockfile,结果就是换一台机器后静默缺包。
另外,这个项目用的是 Vite 8,而 Vite 8 已经切到 Rolldown 作为统一 bundler,并且官方写明支持的 Node 版本是 20.19+22.12+。 你日志里是 Node 25.2.1,它虽然是 Current release,但 Node 官方对这类非 LTS 版本长期一直建议不要作为生产默认环境,至少当前这个项目不该把它当默认假设。

我对这个包本身的评价是:

  • 产品想法:强。 “自然隐喻 + 学术写作 + 批注泡泡 + 引文露水 + PDF 同风格渲染”这个组合,确实有辨识度。

  • 原型实现:中上。 我解包后看,确实有 React + TypeScript + Zustand + TipTap 的实体代码,不是纯 PPT;组件拆分也基本成型。

  • 工程交付:偏弱。 包里带了 node_modulesdist.gitREADME.md 还是默认的 Vite 模板,package.json 名字还叫 grapepaper-temp,而 STATUS.md / PLAN.md 里“已验证能启动”的说法和你现在实际跑不起来是冲突的。

  • 下一步规划:需要重排。 继续做功能当然没错,但现在直接冲功能,会把“环境问题、文档问题、真实可运行性”继续埋住。

关于它的竞品调研,我的复核意见是:

方向没完全错,但结论写得太满。
它把“没有直接竞品”说成了“市场几乎完全空白”,这个说法我不认。

更准确的说法应该是:

  • 直接竞品很少:我没有看到谁在做“葡萄藤/石板/露水”这种强视觉隐喻的论文编辑器。

  • 但相邻竞品不少,而且已经覆盖了你设想里的很多能力碎片。
    Gingko Writer 明确主打从 notes → outline → draft 的写作流,官网也有 ADHD 相关用户背书。
    Scrintal 已经在做“PDF + 笔记 + AI + infinite canvas”。
    Heptabase 也在做面向研究者的可视化知识库、块编辑和 PDF annotation。
    LiquidText 早就把“文档阅读、批注、跨页连接、从纸面阅读走向关系化研究”做成核心卖点了。
    Curvenote 则明确是 science writing,叙事、代码、公式、图和 references 在同一个编辑器里。
    Hypothesis 是成熟的 social annotation 平台。
    所以真正的独特点,不是“别人都没做学术写作 / PDF / AI / 引文”,而是 你把这些东西用一个很强的自然隐喻渲染层整合到同一体验里

也就是说,这个项目的正确定位应该是:

“不是功能绝对首创,而是组合方式和交互审美有新意。”

这会比“完全无竞品”更稳,也更利于后面写产品说明和找差异点。

关于命名,HuluPaper 我建议直接排除。Hulu 的商标防御很强,公开记录里能看到它对近似标识提过异议。
GrapePaper 可以继续当工作名,但因为 “grape paper” 在农业/包装语境里本来就有普通名词含义,SEO 纯净度一般。GourdPaper 反而更干净一些。这部分不是当前第一优先级。

所以我的总判断是:

SOLO 当前那套“先判定无竞品 → 建文件夹 → 继续堆功能”的路线,不够稳。
更合适的顺序应该是:

  1. 先修 可运行性 / 可复现性 / 包结构

  2. 再修 README / 状态文档 / 真实完成度描述

  3. 再补 最小交互闭环(至少 Import/Export 不是空按钮)

  4. 最后才是 OpenAI / Zotero / PDF 渲染 这类重功能

放一张忙碌的开发日常:joy:谢谢MTC

——当前开了三个坑,吃饭前寻思来盯一下新开的番茄复活项目,发现它还在跑,就顺势来盯一下葡萄paper这个项目了;至于guiLaTeX,技术力要求太高:joy:,周末再说吧~
祝大家比赛玩儿得开心~

1 个赞

第一版原型出来了,以后应该足够做一个不错的起点,接下来我会准备开源放到github上;感谢陪伴:joy:

1 个赞

没有那么简单:joy:截图好麻烦hhh,我再让SOLO搞一搞

1 个赞