乐于分享
好东西不私藏

一个 Codex 插件两天 1700 Star:Cowart 为什么会火?(附代码思路拆解)

一个 Codex 插件两天 1700 Star:Cowart 为什么会火?(附代码思路拆解)
大家好,我是 Leo。

这两天有个 Codex 插件突然火了。

项目叫 Cowart。

GitHub 地址是:

https://github.com/zhongerxin/Cowart

作者是 钟二信。

项目 README 和插件信息里署名为 ZHONG XIN,GitHub 账号是 zhongerxin,显示名是 Twox。

他的 X 账号也是 @zhongerxin,个人简介写着:

现豆包桌面端产品经理;前 Teambition、飞书智能伙伴设计师、ChatGPT 插件 Pluginpedia 作者。

这个背景挺关键。

因为 Cowart 不是一个纯后端开发者突然做了个画布 demo。

从公开信息看,它更像是一个长期接触产品、设计工具和插件生态的人,把过去对“视觉工作台”的理解,接到了 Codex 插件体系里。

截至 2026 年 6 月 22 日晚,它已经到了 1739 stars、138 forks。

更夸张的是,它不是一个已经打磨很久的老项目。

从 GitHub 信息看,这个仓库创建于 2026 年 6 月 18 日 16:08 UTC,也就是北京时间 6 月 19 日 00:08。

从提交记录看,它的节奏也很密集:

  • 6 月 19 日,first commit
  • 6 月 19 日,加入本地磁盘持久化画布
  • 6 月 20 日,补齐整套绘图和 AI 编辑能力
  • 6 月 21 日,连续更新插件元数据、skills、标注工具、MCP 图片插入、安装文档
  • 同一天,开始合入外部贡献者的 PR

也就是说,它不是那种“发出来大家点个 Star 就散了”的项目。

它很快进入了下一阶段:

有人装,有人用,有人踩坑,有人提 issue,有人交 PR。

这件事比 Star 数本身更重要。

因为对于一个 Codex 插件来说,真正难的不是“看起来很酷”,而是用户真的能装起来、跑起来、用起来,然后愿意帮你修。

Cowart 这次刚好做到了。


Cowart 到底是什么?

一句话说:

Cowart 是一个给 Codex 用的本地无限画布插件。

它基于 tldraw 做了一个网页画布。

你可以在 Codex 里打开它,然后做几件事:

  • 在画布里画图、贴图、写字、放形状
  • 创建一个 “AI 图片” 占位框
  • 让 Codex 根据你的描述生成图片,并插入到这个占位框里
  • 在图片上用标注箭头写修改意见
  • 把标注截图发给 Codex,让它生成一张干净的新图,再放到原图旁边

                                    注:图片来自原作者X推文

听起来像一个小白板。

但它的关键不是“白板”。

关键是:

这块白板不是孤立的。它和 Codex 接上了。

普通白板只能让你自己画。

Cowart 这块画布,可以被 Codex 读到选区,可以被 Codex 写入图片,也可以通过 MCP 工具把生成结果真正落到画布状态里。

这就让它从一个“可视化 UI”,变成了一个“Agent 可以操作的工作空间”。

这个差别很大。


为什么它会突然火?

我觉得有三个原因。

第一个原因是时机。

Codex 插件这件事,本身就在一个非常早的窗口期。

大家都知道 Codex 能写代码。

但“Codex 插件到底能做什么”,很多人其实还没有形成具体想象。

这时候最容易传播的,不是抽象框架,也不是复杂协议,而是一个能马上看懂的例子。

Cowart 就是这种例子。

你一看截图就知道:

哦,原来 Codex 不只是能在终端里改文件,它还可以打开一个本地工具,在里面和我一起做视觉创作。

这就是典型的生态早期样板间。

不是把所有能力都做满,而是让大家第一次看到:

原来这个方向可以这么用。

第二个原因是场景很直观。

很多 Agent 工具很难传播,因为你需要解释一大堆:

它怎么调工具?

怎么读上下文?

怎么管理状态?

怎么跟外部服务交互?

听起来都对,但用户没有画面。

Cowart 不一样。

它的传播图像非常简单:

Codex + 一块画布 + AI 生图 + 标注修改。

这个组合天然适合截图。

也天然适合在社交平台传播。

因为所有人都能马上理解它在干什么。

第三个原因是它不是 demo,而是闭环。

很多项目看起来很酷,但只停在演示层:

打开一个页面,点一个按钮,生成一张图,然后结束。

Cowart 做得更进一步。

它把本地持久化、选区读取、图片资源保存、画布状态更新、插件安装、skills 指令、MCP 工具都串起来了。

这意味着用户不是只能看作者演示。

用户自己也可以把它装进 Codex,然后在自己的项目目录里生成 canvas/ 数据。

这对开源项目很重要。

能跑起来,才会有人帮你修。

从 GitHub PR 看,6 月 21 日已经有外部贡献者开始修安装、依赖、粘贴图片刷新竞态等问题。

这说明它已经越过了“围观”阶段,进入了“真实使用”阶段。


它火的过程,其实很像一次产品冷启动

如果只看 Star 数,很容易把 Cowart 的火理解成一次流量事件。

但从提交历史看,我觉得它更像一次典型的小产品冷启动。

第一步,先做出最小可用形态。

6 月 19 日,它先把 tldraw 画布跑起来,并且把画布数据保存到本地项目目录。

这一步非常关键。

因为 Codex 插件不是普通 SaaS。

用户会关心:

我的画布数据放在哪里?

会不会被存到插件仓库里?

换项目之后会不会串数据?

Cowart 的答案很明确:

数据默认保存在当前用户项目的 canvas/ 目录。

这一步解决的是信任感。

第二步,补上 AI 工作流。

6 月 20 日,它加入整套绘图和 AI 编辑功能。

也就是不只是“打开画布”,而是让 Codex 可以围绕画布做事。

这里最核心的是两个场景:

一个是 AI 图片占位框。

用户在画布上放一个 “AI 图片” holder,Codex 读取它的尺寸和位置,再把生成图片放进去。

另一个是标注式编辑。

用户在图上用箭头和文字写修改意见,Codex 根据标注生成新图,再放到旁边,保留原图和标注。

这两个场景都很适合 Agent。

因为它们把人的意图变成了视觉上下文。

第三步,补上插件包装。

6 月 21 日凌晨,它开始大量完善 .codex-plugin/plugin.json、skills 和 README。

这一步决定了它能不能从“本地项目”变成“Codex 插件”。

你会看到它不是只写了一段安装命令,而是把三类能力拆成了三个 skill:

  • cowart-open-canvas:
    打开本地画布
  • cowart-image-gen:
    生成图片并插入画布
  • cowart-image-edit:
    根据标注截图生成修订图

这其实很聪明。

它没有把所有逻辑塞进一个万能 prompt。

而是把用户任务拆成三个入口。

这对 Codex 来说更好理解,也更容易稳定执行。

第四步,社区开始补坑。

外部 PR 很快出现。

有贡献者修 Codex MCP 安装后的启动问题。

有贡献者修粘贴图片后被旧快照覆盖的问题。

还有贡献者补缺失依赖、移除 hardcoded path。

这很像一个产品真正跑起来之后必然经历的阶段:

作者解决核心想法,真实用户暴露边角问题,社区开始把它推向可用。

所以 Cowart 的火,不只是“发了一个项目”。

而是它在很短时间内完成了一个小产品的四步:

可用原型 -> AI 闭环 -> 插件包装 -> 社区修补。


代码核心实现:Cowart 是怎么把 Codex 和画布接起来的

下面讲代码。

我尽量不讲太细的源码,而是讲它的架构。

更有意思的是,Cowart 基本踩中了 OpenAI 官方 Codex 插件文档里推荐的结构。

官方文档里说,如果只是个人工作流,可以先做 local skill;但如果要把 workflow 分享出去,或者要打包 MCP 配置、app integration、hooks,就应该做成 plugin。

Cowart 正好就是这个形态:

.codex-plugin/plugin.json 负责声明插件。

skills/ 负责告诉 Codex 每类任务怎么做。

.mcp.json 和 mcp/server.mjs 负责把“读选区、插入图片”变成 Codex 可以调用的工具。

所以它不是一个随手拼出来的 demo,而是一个非常标准的 Codex 插件样板。

Cowart 的实现可以拆成三层:

Codex 插件层    ↓本地画布服务层    ↓MCP 操作层

这三层合在一起,才是 Cowart 真正的核心。


第一层:Codex 插件层

入口是:

.codex-plugin/plugin.json

这个文件告诉 Codex:

这是一个插件。

它叫什么。

它有哪些 skills。

它有哪些 MCP server。

它在插件界面里怎么展示。

Cowart 的插件描述里写得很直接:

它是一个本地无限画布,用于 visual thinking、image generation 和 annotation-driven edits。

注意这里有两个东西很关键。

第一个是:

skills": "./skills/"

这代表 Cowart 把使用方式写成了 Codex 可以加载的 skill。

第二个是:

mcpServers": "./.mcp.json"

这代表它不是只靠自然语言提示 Codex。

它还给 Codex 提供了真正可以调用的工具。

这就是 Codex 插件最有意思的地方:

skill 负责告诉 Agent 怎么做,MCP 负责给 Agent 一双手。

没有 skill,Agent 不知道流程。

没有 MCP,Agent 只能讲,不能稳稳地改画布状态。

Cowart 把这两个都补上了。


第二层:本地画布服务层

画布本身在 src/App.jsx。

技术栈很简单:

  • React
  • Vite
  • tldraw

但它在 tldraw 上做了几件自己的事情。

第一件事,是加了一个 AI 图片 holder。

在代码里,这个 holder 本质上是一个 tldraw frame。

它的 meta 里会带上:

{"cowartAiImageHolder":true}

这就像给普通 shape 贴了一个标签。

用户看到的是一个 “AI 图片” 框。

Codex 看到的是:

这里有一个可以被填充的目标位置。

这个设计很小,但很关键。

因为 AI 生图最大的问题之一是:

生成出来之后放哪里?

尺寸是多少?

要不要覆盖原图?

有没有 anchor?

AI 图片 holder 把这些问题提前变成了画布上的一个对象。

用户用视觉方式定义位置,Agent 用结构化信息读取位置。

第二件事,是加了一个标注工具。

Cowart 自己实现了一个 CowartAnnotationTool。

用户拖动时,它会创建一条带箭头的 tldraw arrow,并且自动进入文字编辑状态。

默认颜色是红色。

标签位置会被固定。

这看起来像一个小交互,但它背后解决的是另一个核心问题:

让用户用最自然的方式告诉 AI:改这里。

不用写很长 prompt。

不用描述“左上角那个物体旁边第三个区域”。

直接画箭头,写一句话。

这就是标注式编辑的价值。

第三件事,是保存画布状态。

Cowart 不是只把画布存在浏览器内存里。

它会把画布 snapshot 保存到当前项目的:

canvas/pages/<page-id>/cowart-canvas.json

图片资源保存到:

canvas/pages/<page-id>/assets/

同时还会保存选区状态:

canvas/cowart-selection.json

以及视图状态:

canvas/cowart-view-state.json

这几个文件非常重要。

因为它们让画布从一个临时网页,变成了项目的一部分。

你的画布数据跟着当前项目走。

你的图片资源也跟着当前项目走。

这对 Codex 这种本地工作流来说很自然。

第四件事,是通过 Vite 插件层提供 API。

vite.config.js 里做了很多本地服务工作。

比如:

  • GET /api/canvas
     读取画布
  • PUT /api/canvas
     保存画布
  • GET /api/selection
     读取选区
  • PUT /api/selection
     保存选区
  • GET /api/view-state
     读取视图状态
  • PUT /api/view-state
     保存视图状态
  • /page-assets/
     负责暴露页面级图片资源
  • /api/canvas-events
     用 SSE 通知画布变化

这说明 Cowart 不是只在前端里玩 tldraw。

它还做了一个很轻量的本地状态服务。

这个服务的作用就是:

让浏览器、文件系统和 Agent 之间有一个共同的状态入口。


第三层:MCP 操作层

真正让 Cowart 变成 Codex 工具的,是 mcp/server.mjs。

这个 MCP server 暴露了两个工具。

第一个是:

get_cowart_selection

它负责读取当前画布选中的 shape。

比如选中的是不是 AI 图片 holder。

它的尺寸是多少。

它有没有图片 asset。

它的 meta 是什么。

第二个是:

insert_cowart_image

它负责把一张本地图片插入画布。

这个工具做的事情比名字听起来复杂:

  • 读取当前画布 snapshot
  • 找到选中的 anchor shape
  • 判断目标 page
  • 读取图片尺寸
  • 把图片复制到 page-local assets 目录
  • 创建 tldraw image asset
  • 创建 tldraw image shape
  • 计算 shape 的 fractional index
  • 尽量把新图放在 anchor 旁边,避免覆盖已有内容
  • 通过 Cowart 本地 API 保存新的 canvas snapshot

也就是说,当 Codex 生成一张图之后,不需要手写一堆脆弱的 tldraw 记录。

它可以调用 MCP 工具:

把这张图放到当前画布里。

这一步非常关键。

因为 Agent 最怕的就是:

你让它直接改一个复杂 JSON。

能改,但容易错。

Cowart 把“插入图片”封装成了一个工具。

这就把不稳定的自然语言执行,变成了更稳定的结构化操作。

所以我前面说,Cowart 的核心不是画布,而是这套连接结构。

画布只是用户看到的表面。

真正有价值的是:

它让 Codex 可以通过 skill 理解任务,通过 MCP 调用工具,通过本地 API 写回画布。

这就是一个完整的 Agent 工作流闭环。


为什么这个实现值得看?

因为它给 Codex 插件开发者提供了一个很好的样板。

很多人做 AI 工具,会一上来想做很大的东西:

我要做一个新的 IDE。

我要做一个新的设计工具。

我要做一个新的 Agent 平台。

但 Cowart 的路线更轻。

它没有重新发明画布。

它直接用 tldraw。

它没有重新发明 Agent 框架。

它接入 Codex。

它没有重新设计插件协议。

它按 Codex plugin、skill、MCP 的方式包装。

它真正做的,是把几个成熟部件接起来:

tldraw 负责画布Vite 负责本地服务文件系统负责持久化MCP 负责工具调用Codex skill 负责操作流程imagegen 负责生成图片

这就是现在很多 AI 小产品最现实的做法。

不是拼模型能力。

而是拼工作流闭环。

你能不能把一个用户任务,从输入、操作、生成、保存、复用完整接起来。

Cowart 这次火,本质上就是因为它把这个闭环做得很直观。


它现在还不完美

当然,Cowart 现在还远远不是一个成熟产品。

从 issue 和 PR 看,问题已经开始暴露。

比如有人提到,希望能调整画板参数。

也有人提到,目前生图能力主要依赖 Codex 内置 Image Gen,不一定适配其他生图方式。

还有更深层的问题:

外部 Agent 会写 canvas snapshot。

如果 snapshot 里有一条非法记录,tldraw 校验可能导致整张画布白屏。

这个问题很典型。

它说明 Cowart 现在已经碰到了真正的产品化问题:

当 Agent 也能写状态时,系统必须对坏状态有容错能力。

这不是 demo 阶段会优先处理的问题。

但只要真实用户开始使用,就一定会遇到。

所以我觉得 Cowart 接下来真正要补的,不只是功能。

而是这些东西:

  • 安装流程能不能更稳
  • 不同 Codex 环境下能不能一致启动
  • 画布 snapshot 能不能更强容错
  • 图片生成路径能不能支持更多模型
  • 多页面、多项目、多历史版本怎么管理
  • 用户误操作之后怎么恢复

这些问题听起来不酷。

但这正是一个玩具项目变成工具项目必须经历的阶段。


Cowart 给插件开发者的启发

我觉得 Cowart 最值得学的,不是它用了 tldraw。

而是它踩准了 Codex 插件生态里的三个点。

第一,插件要有一个非常直观的入口。

“给 Codex 一块无限画布”这个入口非常清楚。

用户不需要理解 MCP,不需要理解 snapshot,也不需要理解 plugin manifest。

他只需要知道:

我能打开一块画布,让 Codex 和我一起画图、生成图、改图。

第二,插件最好有一个可视化结果。

Agent 工具如果只在终端里跑,很难传播。

不是终端不好,而是传播门槛高。

Cowart 的结果是画布。

截图天然就是传播素材。

这对早期项目太重要了。

第三,插件要把流程写清楚。

Cowart 的 skill 写得很细。

什么时候打开画布。

什么时候读取选区。

什么时候生成图片。

什么时候插入 holder。

什么时候保留原图。

什么时候不应该替换标注。

这些说明看起来像文档,其实是 Agent 的操作规程。

未来做 Codex 插件,很可能不是只写代码。

你还要写一套给 Agent 看的“工作说明书”。

谁能把这套说明书写清楚,谁的插件就更容易稳定运行。


写在最后

Cowart 这次火,我觉得是一个很有意思的信号。

它说明 Codex 插件生态的早期机会,不一定在“大而全”的 IDE 级工具里。

反而可能在这种小而完整的工具里:

一个清楚的场景。

一个直观的界面。

一组可调用的 MCP 工具。

几份写清楚流程的 skills。

再加上一个能被用户马上截图理解的结果。

这就足够形成传播。

过去我们说 AI 编程,更多是在说:

AI 能不能把代码写对。

但 Cowart 让我看到另一个方向:

AI 编程工具接下来要竞争的,可能不是谁更会聊天,而是谁能给 Agent 提供更好的工作空间。

聊天框是入口。

终端是手。

文件系统是记忆。

而画布、浏览器、表格、设计稿、数据面板这些东西,会变成 Agent 的新工作台。

Cowart 只是其中一个很早的样板。

但正因为它早,所以才值得拆。

下一个机会也许不是“做一个更强的 Agent”。

而是问一句:

我的工作流里,有没有一个地方,也可以变成 Agent 能看、能改、能保存的本地工作台?

如果有,那可能就是下一个插件机会。


参考信息

  • Cowart 仓库:https://github.com/zhongerxin/Cowart
  • OpenAI Codex 插件文档:https://developers.openai.com/codex/plugins/build