Cowart 是一个基于 tldraw 的本地无限画布应用,运行在本地网页服务中。它把「可视化构思 → AI 生图 → 标注迭代 → 文字/图片导出」串成一条连贯的工作流,适合做设计构思、商品图生成、海报草编、文档截图转文字等场景。
画布数据默认保存在用户项目目录的 canvas/ 下,按页面分文件持久化,不会进入插件仓库。
本仓库是面向 WorkBuddy 客户端的适配版本,同时也可作为独立本地画布直接运行。
- 无限画布:基于 tldraw v5,支持自由绘制、文字、形状、箭头、框选、缩放、平移。
- 按页持久化:画布按页面拆分存储(
canvas/pages/<page-id>/cowart-canvas.json+assets/),刷新/重开不丢失。 - 小地图:右下角实时缩略图,快速定位画布位置。
- 智能排版:一键把选中图形整理为网格 / 横向 / 纵向 / 紧凑布局,并自动连线。
- 版本历史:本地快照(localStorage),可随时保存与回溯。
- 空白引导层:画布为空时居中引导卡片,提示文生图 / 绘制 / 文字等入口。
- 文生图对话框:底部工具栏「✨文生图」或选中 AI 图片框时「✨生成」唤起,支持多候选(1–4 张)择优。
- 生图需要 Key:文生图/图生图需要一个 Duomi(多米) API Key,在底部「配置」填入即可(仅存本机浏览器)。没有 Key 时,也可直接让 WorkBuddy 助手帮你生图并落到画布(走 WorkBuddy 原生图像能力,无需配置)。
- 两种生图模型(下拉切换):
- Banana:默认请求 pro 模型(Gemini
gemini-3-pro-image-preview,经 Duomigemini/nano-banana接入)。比例选项为普通人易懂的"比例 · 用途"描述(如9:16 竖版(海报 / 手机屏 / 视频封面)、16:9 横版(PPT 宽屏 / 横幅 / 壁纸)),分辨率默认 4K。 - Image2:
尺寸同样为易懂描述(如1024×1792 · 9:16 竖版(海报 / 手机屏 / 视频封面)),另支持自定义宽×高(需被 16 整除且 ≤2048),quality默认 high。
- Banana:默认请求 pro 模型(Gemini
- 参考图(图生图):提交时若画布恰好选中 1 张图片,会作为参考图传入,生成与原图相关的新图。图生图无需额外图床——参考图后端直接转 dataURI 传入,腾讯 COS 仅作可选增强。
- 自动标注线:用参考图生成的新图,落图后会自动画一条蓝色虚线箭头连回原图(带「参考图」标签),清晰体现衍生关系;连线为 tldraw 绑定,移动图形会跟随。
- 生图历史:每次生成自动留存到本地(缩略图 + prompt + 参数 + 模型,上限 50 条)。左下「🕘 生图历史」可打开侧栏,点「复用」把 prompt 与参数回填进文生图对话框,方便微调再出。
- 办公 & 电商提示词模板库:内置 14 个高价值模板,分 3 组(电商 5 / 品牌·办公 3 / 营销海报 6)。点击模板即把提示词载入文生图对话框,占位符可编辑后再提交;需要商品主图作参考的模板会自动提示先选中图片。
- 粘贴即落图:直接
Ctrl/Cmd + V粘贴或拖入图片,自动落为画布图片。 - OCR 提取文字:选中一张图片点「📷 提取文字」,用 tesseract.js 在浏览器本地识别中英文(无需服务端密钥)。内置预处理(白底铺满、智能放大、轻微对比增强)以提升准确率,识别结果生成可编辑文本块。
- 标注汇总:评审标注列表化查看,支持导出 Markdown。
- 导出:工具栏「📤导出」支持「复制为图片」(主操作,直接进剪贴板;剪贴板不可用时自动降级为下载 PNG)、「整页长图 PNG」(多页拼接成一张长图,适合贴文档/发群)、PNG、SVG(选中则导出选中,否则导出整页)。
- Windows / macOS / Linux
- Node.js 22 及以上(推荐 22.22+)
- 现代浏览器(Chrome / Edge / Firefox 最新版)
- 如需 AI 生图:一个 Duomi(多米) API Key(在「配置」填入)。没有 Key 也可让 WorkBuddy 助手代为生图。
npm install依赖包含
tesseract.js(OCR,体积较大)、cos-nodejs-sdk-v5、tldraw、react等,首次安装稍慢属正常。
npm run dev默认访问 **http://localhost:43217**;端口被占用时 vite 会自动迁移到 43218、43219……以终端输出的 Local: 实际 URL 为准。
也可使用封装脚本(自动设置项目目录、处理扩展属性兜底):
./scripts/start-canvas.sh /path/to/user/project打开画布后,点击底部工具栏的 「配置」 按钮,可填入你自己的 Duomi API Key(默认已预填公用地址与路径参数,通常只需填 Key 一项)。Key 仅保存在浏览器 localStorage,不会写入代码或上传到任何仓库。
生图需要 Duomi API Key:在底部「配置」填入即可(仅存本机浏览器)。没有 Key 时,画布编辑、OCR、标注、导出等本地功能照常可用;也可直接把生图需求发给 WorkBuddy 助手,由我用原生图像能力生成并落到画布,无需配置。配置弹窗里的「图床(腾讯 COS)」默认折叠——仅图生图需上传参考图时才需填写。
- 点击底部「✨文生图」(或选中画布上的 AI 图片框后点「✨生成」)。
- 选择生图模型与尺寸/质量参数,输入提示词,可选「数量」出多张候选。
- 点击生成,图片异步产出后自动插入画布。
- 在画布中选中 1 张图片作为参考。
- 打开文生图对话框输入提示词并提交(或对该图点「重生成」)。
- 新图生成后会落在参考图旁,并用蓝色虚线标注线连回原图。
- 点击「📋 模板库」,展开「办公 & 电商 提示词」分区。
- 选择模板,提示词自动载入文生图对话框(占位符可编辑)。
- 需要商品图的模板会提示你先选中一张图片作为参考图。
- 选中一张图片。
- 画布左下出现「📷 提取文字」按钮,点击即可识别。
- 识别结果作为可编辑文本块插入图片右侧。
- 左下「🕑 版本历史」按钮:手动保存快照、查看并回溯历史版本(存于浏览器 localStorage)。
- 左下「🕘 生图历史」按钮:查看最近 50 条生成记录(缩略图 + prompt + 参数),点「复用」回填文生图对话框微调再出,支持单条删除与一键清空。
- 左下「📝 标注」按钮:查看评审标注列表,导出为 Markdown。
- 工具栏「📤导出」:复制为图片 / 整页长图 PNG / PNG / SVG。
- 选中多个图形,使用智能排版把元素规整为网格 / 横纵 / 紧凑布局并自动连线。
cowart/
├─ src/
│ ├─ App.jsx # 主前端:画布、对话框、落图、标注线
│ ├─ styles.css
│ └─ features/ # 功能模块
│ ├─ OcrTool.jsx # OCR 提取文字(tesseract.js)
│ ├─ VersionHistory.jsx # 版本历史
│ ├─ AnnotationSummary.jsx# 标注汇总
│ ├─ TemplateLibrary.jsx # 提示词模板库
│ ├─ SmartArrange.jsx # 智能排版
│ ├─ MinimapFeature.jsx # 小地图
│ ├─ PasteToImage.jsx # 粘贴即落图
│ ├─ TaskQueue.jsx # 生图任务队列
│ └─ promptTemplates.js # 模板数据(来自 ai-hand 提取)
├─ vite.config.js # vite + 本地后端(/api/regenerate、画布资源服务)
├─ scripts/ # 安装 / 启动 / 卸载脚本
├─ docs/INSTALL-WORKBUDDY.md
└─ README.md
COWART_PORT:本地服务首选端口,默认43217(被占用自动迁移)。COWART_PROJECT_DIR:画布数据所属的用户项目目录。COWART_CANVAS_DIR:画布数据目录,默认$COWART_PROJECT_DIR/canvas。
- 前端:React 19、tldraw ^5.1.1、Vite ^7
- OCR:tesseract.js ^7(浏览器端本地识别,中英文)
- 后端:Vite 中间件(
/api/regenerate等),Node 原生 - 存储:本地文件系统(按页 JSON + 资源目录)
遵循"非关键数据损坏不得拖垮整画布、外部存储失败不得中断使用":
- 画布加载兜底:单页快照文件损坏时告警并跳过该页,其余页正常加载(不再因一页损坏导致整画布「Canvas file could not be loaded」)。
- 原子写入:画布/视图状态用 temp+rename 原子写,避免写中断产生半文件。
- localStorage 全 try/catch:配置/图床/历史等读写均容错,配额满或隐私模式不中断使用;生图历史配额满时自动回收最旧条目。
- 请求超时 + 参考图压缩:前端 6 分钟超时;后端 Duomi 请求分级超时;上传参考图压缩至 ≤1024px。
- 导出/复制降级:整页长图单页失败跳过继续;复制为图片剪贴板不可用时降级下载 PNG。
- 错误边界:自定义浮层各自用 React ErrorBoundary 隔离,单个面板渲染错误不会白屏整画布。
Cowart 的画布能力基于 tldraw/tldraw 实现。
WorkBuddy 的画布参考 morningddy/cowart-workbuddy 实现。
- 原版作者:ZHONG XIN(https://www.jiqiren.ai)
- WorkBuddy 适配:田琳 (Lynn)
本项目仅供学习与交流使用。