Skip to content
kuroshio4396Public

About

ComfyUI 提示词归档助手 —— 纯前端本地归档工具。把 ComfyUI 生图提示词按画风 / 人物 / 动作 / 环境 / 构图五大类整理保存,支持中英对照、关键词检索、带图 XLSX 导入导出与浏览器本地持久化。数据全程留在本机,无需后端、无需账号。

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Repository files navigation

ComfyUI 提示词归档助手

把散落在无数张图里的 ComfyUI 提示词,收进一个带图、带翻译、可检索、可备份的本地档案库。

纯前端 · 无需后端 · 无需账号 · 数据全程留在本机

在线演示 React TypeScript Vite Tailwind CSS IndexedDB License


目录


项目简介

在 ComfyUI 里抽到一张满意的图之后,真正有价值的东西往往不是那张 PNG,而是那串提示词——画风用哪个 LoRA 触发词、人物怎么描述、动作和环境怎么写的、构图权重给了多少。但现实是:提示词散落在各个工作流里、随图片一起淹没在输出文件夹里,隔两周再想复现某个效果,只能靠翻相册碰运气。

ComfyUI 提示词归档助手就是为这件事做的:一个纯前端的本地档案库,把提示词连同成品预览图一起结构化存下来,并且按 画风 / 人物 / 动作 / 环境 / 构图 五大类分开中英对照记录,支持关键词检索,也支持用 Excel(带图)批量导出备份和回灌。

它刻意保持极简:

  • 无后端、无数据库服务、无账号体系。 前端静态部署即可运行,所有数据存在浏览器的 IndexedDB 里。
  • 无 AI 调用。 它不生成提示词、也不调用任何大模型 API——它只负责「存、找、导」。提示词从哪来由你自己决定(手写、从 ComfyUI PNG 元数据提取、或由外部反推流程产出)。
  • 导出即备份。 一条「导出 XLSX」就能把全部记录(含缩略图)落成一个自包含文件,换台电脑「导入 XLSX」即可恢复。

提示:仓库名 ComfyUI- 是发布时的历史遗留,项目内部名称统一为「ComfyUI 提示词归档助手」。


核心特性

特性 说明
🗂️ 五大分类结构化记录 每条记录按 画风 / 人物 / 动作 / 环境 / 构图 五个维度分别保存,每个维度都有英文原文与中文翻译两个字段,共 10 个文本域
🖼️ 图文绑定 上传成品预览图(FileReader → dataURL 存 IndexedDB),列表里直接看图对照,不用再回去翻输出目录
🔍 全字段关键词检索 输入即筛(useMemo 内存过滤),命中范围覆盖 5 类英文 + 5 类中文 + 历史遗留翻译字段,大小写不敏感
📤 带图导出 XLSX 用 ExcelJS 生成真表格,图片按 ExcelJS 原生图片锚点嵌进单元格,行高 100、缩略图 90×90,可直接在 Excel 里浏览翻查
📥 按 ID 合并导入 XLSX 复用导出的文件做「改完再导回」,按主键 ID (勿改) 更新记录;无 ID 的行会被跳过,已有记录的时间戳保持不变
🧩 列表折叠 默认只展示「画风 + 人物」两栏,其余三类收在「展开」里,长列表浏览时信息密度可控
🗑️ 行内二次确认删除 删除按钮点开变成「确定删除? 是 / 否」,不弹窗、不误删
🪶 零后端静态部署 只有静态产物,Vercel / 任意静态托管都能跑;exceljs 与 file-saver 走动态 import() 按需加载,不拖累首屏
🔒 数据不出本机 不发起任何业务网络请求,没有埋点、没有分析脚本;断网可用

界面结构

┌──────────────────────────────────────────────────────────────────────────────┐
│  ✨ ComfyUI 提示词归档      [ 导入 XLSX ] [ 导出 XLSX ] [ + 新增归档 ]        │
├──────────────────────────────────────────────────────────────────────────────┤
│  ┌──────────────────────────────────────┐                                    │
│  │  🔍 搜索分类提示词或中文翻译...      │                                    │
│  └──────────────────────────────────────┘                                    │
│                                                                              │
│  ┌────────────┬──────────────────────────────────────────────────────────┐   │
│  │            │  分类详情 (Categorized Breakdown)   [收起/展开] [编辑] [删除]│  │
│  │  预览图     │  ┌────────────────────┐ ┌────────────────────┐           │   │
│  │            │  │ 画风 (Style)        │ │ 人物 (Character)    │           │   │
│  │  (点击可    │  │  <英文原文>         │ │  <英文原文>         │           │   │
│  │   上传 /    │  │  ─────────────      │ │  ─────────────      │           │   │
│  │   悬停更换) │  │  翻译:<中文>       │ │  翻译:<中文>       │           │   │
│  │            │  └────────────────────┘ └────────────────────┘           │   │
│  │            │  ┌────────────────────┐ ┌────────────────────┐  ← 展开后   │   │
│  │            │  │ 动作 (Action)       │ │ 环境 (Environment)  │    才显示   │   │
│  │            │  ├────────────────────┤ ├────────────────────┤           │   │
│  │            │  │ 构图 (Composition)  │ │                     │           │   │
│  │            │  └────────────────────┘ └────────────────────┘           │   │
│  └────────────┴──────────────────────────────────────────────────────────┘   │
└──────────────────────────────────────────────────────────────────────────────┘

新增 / 编辑归档(模态框,宽屏三栏)
┌──────────────────────────────────────────────────────────────────────────────┐
│  新增提示词归档                                                        [ ✕ ] │
├─────────────────────┬──────────────────────────┬─────────────────────────────┤
│  预览图              │  分类提示词 (EN)          │  分类中文翻译 (CN)           │
│                     │  ┌────────────────────┐  │  ┌────────────────────┐     │
│  ┌───────────────┐  │  │ 画风 (Style)        │  │  │ 画风 (Style) 翻译   │     │
│  │               │  │  ├────────────────────┤  │  ├────────────────────┤     │
│  │  点击上传图片   │  │  │ 人物 (Character)    │  │  │ 人物 (Character)    │     │
│  │               │  │  ├────────────────────┤  │  ├────────────────────┤     │
│  │  (悬停可更换)   │  │  │ 动作 (Action)       │  │  │ 动作 (Action)       │     │
│  │               │  │  ├────────────────────┤  │  ├────────────────────┤     │
│  └───────────────┘  │  │ 环境 (Environment)  │  │  │ 环境 (Environment)  │     │
│                     │  ├────────────────────┤  │  ├────────────────────┤     │
│                     │  │ 构图 (Composition)  │  │  │ 构图 (Composition)  │     │
│                     │  └────────────────────┘  │  └────────────────────┘     │
├─────────────────────┴──────────────────────────┴─────────────────────────────┤
│                                            [ 取消 ]  [ 保存记录 ]             │
└──────────────────────────────────────────────────────────────────────────────┘

实现细节:模态框里的「保存记录」按钮在 <form id="prompt-form"> 外面,通过 HTML5 的 form="prompt-form" 属性关联提交。这是刻意的布局选择(按钮固定在弹窗底栏、不跟随表单滚动),写自动化脚本时注意别去找 #prompt-form button[type=submit]。


五大分类

分类维度固定为五种,中英文标签一一对应,是归档的主干结构:

字段 key 中文标签 典型内容
style 画风 (Style) 模型 / LoRA 触发词、画风描述、质感与光线风格(如 anime style、watercolor、cinematic lighting)
character 人物 (Character) 身份、外貌、体型、服装、配饰、表情
action 动作 (Action) 姿态、朝向、交互动作(如 sitting、looking at viewer、holding cup)
environment 环境 (Environment) 场景、背景、场景光(如 indoors、bedroom、candlelight)
composition 构图 (Composition) 景别、机位、画幅权重(如 (full body:2)、upper body、from below)

每条记录同时保存 prompts(英文原文)与 translations(中文翻译)两组同结构对象。

关于「标签分类」:这里的「分类」指上述五个固定维度,属于结构化字段,不是可自由增删的标签系统——没有自定义标签、也没有按标签筛选的 UI。检索走的是全文关键词匹配。


技术栈

层面 选型 说明
框架 React 19 函数组件 + Hooks,StrictMode 挂载
语言 TypeScript 5.8 target ES2022、moduleResolution: bundler、jsx: react-jsx;路径别名 @/* → 项目根
构建 Vite 6 @vitejs/plugin-react;开发端口 3000、--host=0.0.0.0
样式 Tailwind CSS 4 走 @tailwindcss/vite 插件(CSS-first,无 tailwind.config.js),入口仅 @import "tailwindcss";
存储 localforage 1.10 对 IndexedDB 的 Promise 化封装,自动降级
表格 ExcelJS 4.4 读写 .xlsx,生成图片锚点;浏览器端动态加载
下载 file-saver 2.0 触发浏览器「另存为」
图标 lucide-react 全部 UI 图标
其他 uuid 14、clsx + tailwind-merge 记录 ID 生成;cn() 类名合并工具

依赖说明:package.json 里还声明了 @google/genai、express、dotenv、motion,但这四个包在 src/ 中零引用——它们来自项目最初的 Google AI Studio 模板脚手架,属于历史残留(详见已知限制)。本项目的运行时依赖只有上表所列。


快速开始

环境要求

项目 要求
Node.js 18+(推荐 20 / 22 LTS;@types/node 按 22 声明)
包管理器 npm(仓库含 package-lock.json)
浏览器 任意支持 IndexedDB 的现代浏览器(Chrome / Edge / Firefox / Safari)

安装与运行

# 1. 克隆
git clone https://github.com/kuroshio4396/ComfyUI-.git
cd ComfyUI-

# 2. 安装依赖
npm install

# 3. 启动开发服务器(默认 http://localhost:3000)
npm run dev

可用脚本

命令 作用
npm run dev 启动 Vite 开发服务器,端口 3000,监听 0.0.0.0(局域网可访问)
npm run build 生产构建,产物输出到 dist/
npm run preview 本地预览构建产物
npm run lint 类型检查(tsc --noEmit,只查不产出)
npm run clean 清理 dist(⚠️ 脚本为 rm -rf,Windows cmd 下不可用,请用 Git Bash / WSL 或手动删除)

环境变量

不需要任何环境变量。 项目不调用任何外部 API。

仓库里的 .env.example 是 AI Studio 模板遗留,里面的 GEMINI_API_KEY / APP_URL 对本项目无效,无需配置(.gitignore 已忽略 .env*,仅保留 .env.example)。


数据存储(重要)

所有记录存在浏览器的 IndexedDB 里,由 localforage 挂载:

项 值
数据库名 ComfyUI_Archive
对象仓库 items
主键 id(uuid v4 字符串)
读取顺序 getAll() 后按 createdAt 倒序排列(最新在最前)

单条记录结构(定义见 src/types.ts):

interface ComfyItem {
  id: string;
  image?: string;            // dataURL,形如 data:image/png;base64,...
  prompts: {                 // 五大类英文原文
    style: string; character: string; action: string;
    environment: string; composition: string;
  };
  translations: {            // 五大类中文翻译(同结构)
    style: string; character: string; action: string;
    environment: string; composition: string;
  };
  translation?: string;      // 历史遗留:旧的单字段翻译,仅作兼容读取
  createdAt: number;         // 毫秒时间戳
  updatedAt: number;
}

⚠️ 三条必须知道的事

  1. 数据跟着「域名 + 浏览器配置」走,不跟着代码走。 http://localhost:3000、https://comfy-ui-indol.vercel.app、以及任何预览域名,各自是互相隔离的存储。在线演示站里新增的记录,本地开发环境看不到;换浏览器、换浏览器用户配置同样看不到。

  2. 清浏览器数据 = 数据全没。 「清除浏览数据 → Cookie 及其他网站数据」会连同 IndexedDB 一起清掉。无痕 / 隐私模式下关闭窗口即丢失。这个项目没有云端、没有账号、没有服务端备份——唯一可靠的备份手段就是「导出 XLSX」,建议养成定期导出、并把文件放到别处(网盘 / 移动硬盘)的习惯。

  3. 图片以 base64 存在数据库里,体积会膨胀。 base64 编码相对原始二进制约有 33% 的体积膨胀,浏览器对单站点 IndexedDB 通常给到「可用磁盘空间的一定比例」的配额。图片多、图大时可能触达配额(表现为保存静默失败或报错)。建议:归档用压缩后的预览图,原始大图仍留在输出目录里。


Excel 导入 / 导出

这是本项目最重要的数据出入口——它既是备份格式,也是批量编辑格式。

导出

点右上角「导出 XLSX」,产物文件名固定为 ComfyUI_Prompts_Archive.xlsx,工作表名 Prompts Archive。

列结构(共 12 列):

列 表头 内容
A ID (勿改) 记录主键,宽 36
B 图片 (Image) 图片锚点列(无文本值),缩略图以 90×90 嵌入此列
C / D 画风 (Style) / 画风翻译 (Style CN)
E / F 人物 (Character) / 人物翻译 (Character CN)
G / H 动作 (Action) / 动作翻译 (Action CN)
I / J 环境 (Environment) / 环境翻译 (Environment CN)
K / L 构图 (Composition) / 构图翻译 (Composition CN)

实现要点:

  • 每个数据行行高设为 100,为缩略图留出空间;
  • 图片用 worksheet.addImage() + editAs: 'oneCell' 锚定,随单元格移动缩放;
  • 图片扩展名从 dataURL 的 MIME 自动识别(png / jpeg / webp 等);
  • exceljs 与 file-saver 通过 await import() 动态加载(首次导出会有一次加载耗时,属正常)。

导入

点右上角「导入 XLSX」选择文件,处理逻辑:

  1. 读第一个工作表;
  2. 先扫描所有嵌入图片,按「图片左上角所在行」建立 行号 → base64 映射(ExcelJS 的行号是 0 基,与数据行号之间差 1,代码里已做折算);
  3. 读第 1 行表头,建立「表头文本 → 列号」映射;
  4. 校验 ID (勿改) 列是否存在,缺失直接报错:未找到 "ID (勿改)" 列,请确保导入的Excel格式正确。;
  5. 从第 2 行开始遍历:
    • ID 为空的行直接跳过(if (!id) continue;);
    • 按 ID 查库:命中则更新,未命中则新建;
    • 图片:优先用本次导入文件里的图,没有则保留库里原有的图;
    • createdAt 沿用原记录的,updatedAt 刷成当前时间(保证排序稳定);
    • 中文翻译列兼容历史表头 中文翻译(作为 画风翻译 的兜底);
  6. 完成后 alert('导入成功!') 并刷新列表;文件输入框会被重置,因此同一个文件可以连续导入两次。

导入语义:是「按 ID 合并」,不是「全量替换」

这一点最容易踩坑:

  • 导入只做 upsert,不删除。Excel 里删掉的行,库里依然存在——要删记录请在界面上点「删除」。
  • 导入不会自动创建新记录,除非你在 Excel 里手工填一个不重复的 ID。所以正确的新增姿势仍然是:在界面上点「新增归档」,让应用生成 uuid。
  • 表头文字是精确匹配的(cell.text.trim()),改列名会导致该列读成空字符串,请勿改动第 1 行。
  • translation(历史遗留的单字段翻译)不参与导出,因此老的记录在「导出 → 导入」往返后,该字段会丢失。由于现在的界面已完全改用分栏翻译,实际影响可忽略。

推荐的往返工作流

① 应用内新增记录(生成 ID)
        ↓
② 导出 XLSX  ← 这就是完整备份
        ↓
③ 在 Excel 里批量修改文本 / 调整翻译(不要改 A 列表头和 ID)
        ↓
④ 导入 XLSX  → 按 ID 覆盖更新,图片与创建时间保留

项目结构

ComfyUI-/
├── index.html                        # 入口 HTML(Vite 挂载点)
├── metadata.json                     # AI Studio 描述文件(模板遗留)
├── package.json                      # 依赖与脚本
├── package-lock.json
├── tsconfig.json                     # TS 配置(含 @/* 路径别名)
├── vite.config.ts                    # Vite 配置(react + tailwindcss 插件)
├── .env.example                      # 模板遗留,本项目无需环境变量
├── .gitignore
├── assets/
│   └── .aistudio/                    # AI Studio 产物占位目录
└── src/
    ├── main.tsx                      # 应用入口,createRoot + StrictMode
    ├── App.tsx                       # 主体:顶栏 / 搜索 / 列表 / 模态框编排 + Excel 导入导出
    ├── types.ts                      # Prompts 与 ComfyItem 类型定义
    ├── index.css                     # Tailwind 入口 + 自定义滚动条样式
    ├── lib/
    │   ├── db.ts                     # localforage 实例与 CRUD 封装
    │   └── utils.ts                  # cn() 类名合并、fileToBase64()
    └── components/
        ├── PromptRow.tsx             # 单条记录卡片(图片 + 分类详情 + 折叠/编辑/删除)
        └── PromptModal.tsx           # 新增/编辑弹窗(图片 | EN | CN 三栏)

分层约定

  • lib/db.ts 是唯一的数据访问层,组件不直接碰 localforage;换存储后端(比如接云同步)只需要改这一个文件。
  • Excel 逻辑集中在 App.tsx 的 handleExportExcel / handleImportExcel 两个函数里,没有拆出去——因为它是「读全量列表 + 写库」的应用级操作,不是某个组件的能力。
  • db.items.clear() 已实现但未接线:目前没有任何 UI 按钮会调用它(没有「清空全部」功能)。

部署

本项目构建产物是纯静态文件,可以直接丢给任何静态托管。

Vercel(推荐,也是线上演示站的部署方式)

  1. 在 Vercel 新建项目并导入本仓库;
  2. Framework Preset 选 Vite(Vercel 一般会自动识别),构建命令 npm run build,输出目录 dist;
  3. 无需配置环境变量,直接 Deploy。

仓库中没有 vercel.json——完全依赖 Vercel 对 Vite 的自动识别,不需要重写规则(应用是单页且没有前端路由)。

其他平台

Netlify / Cloudflare Pages / GitHub Pages / 任意对象存储,配置同上:构建 npm run build、发布 dist/。

⚠️ 用 GitHub Pages 之类的子路径部署时,需要在 vite.config.ts 里额外设置 base: '/<仓库名>/',否则静态资源 404。


使用技巧

  • 界面默认只看两类:列表行默认折叠,只显示「画风」和「人物」。要核对动作 / 环境 / 构图,点该行的「展开」。搜索命中时并不自动展开——命中在折叠区里时记得点一下。
  • 空分类会自动隐藏:某个分类的中英文都为空时,那一格根本不渲染,卡片会自动变紧凑。
  • 搜索是「全字段模糊匹配」:5 类英文 + 5 类中文 + 历史翻译字段拼成一个长字符串做子串匹配,所以搜 indoor 会命中环境里含 indoors 的记录,搜中文同理。没有按分类限定搜索、没有 AND / OR 逻辑。
  • 图片建议用压缩后的预览图:归档的价值在提示词与视觉对照,不在像素级复现。用压缩图能显著减小导出的 XLSX 体积和 IndexedDB 占用。
  • 弹窗里可以先只填画风:保存没有必填校验,允许留空(列表会显示「无提示词记录」)。建议至少填画风 + 人物,否则这张图在检索里几乎没有辨识度。
  • 同一张图的多版本记得分开存:比如同一张图在「短标签」和「自然语言长句」两种风格下各有一版提示词,它们是两条独立记录——分别新增即可,ID 不同,互不覆盖。
  • 定期导出 XLSX:这是唯一的持久化备份手段(见数据存储)。

常见问题

新增的记录刷新页面就没了?

先确认三件事:

  1. 是不是换了地址? localhost:3000 与线上域名是两个独立的存储空间,互不可见。
  2. 是不是无痕 / 隐私模式? 关闭窗口即清空,属于浏览器行为,非应用问题。
  3. 是不是清了浏览数据? 清除「Cookie 及其他网站数据」会一并删掉 IndexedDB。

如果三者都不是,打开 DevTools → Application → IndexedDB,看 ComfyUI_Archive → items 里有没有数据。若数据在、列表却不显示,检查 App.tsx 的 loadData() 是否报错(控制台会打印 Failed to load data)。

导入 XLSX 报「未找到 "ID (勿改)" 列」

导入用的是第 1 行表头文本的精确匹配。常见原因:

  • 表头被手动改过(比如把 ID (勿改) 改成了 ID)——改回去即可;
  • 文件是别的工具导出的、字段名不同;
  • 数据不在第一个工作表里。

请始终基于本应用「导出 XLSX」产出的文件做修改,切勿改第 1 行。

导入后 Excel 里删掉的行还在?

符合预期。导入是按 ID 合并(upsert),不做删除。要删除记录请在界面上用每行的「删除」按钮(需二次确认)。详见导入语义。

导入后图片没了 / 图片串行了?

图片是按「嵌入图片左上角所在行」映射到数据行的。如果:

  • 图片是从别的表格复制粘贴进来的,锚点可能落在非数据行(比如表头行或空白行);
  • 手动拖拽过图片、或把图片设成了「随单元格移动并调整大小」以外的锚定方式;
  • 数据行被整体上移 / 下移(插行、删行)而图片锚点没跟着走。

图片缺失时应用会保留库中原有图片,所以最坏情况是「图片没更新」而不是「图片被清空」。稳妥做法:只在导出的原文件上改文本单元格,不要动图片和数据行的相对位置。

图片上传后没反应 / 提示「图片加载失败」

handleImageUpload 用 FileReader.readAsDataURL() 读文件,失败会 alert("图片加载失败")。可能原因:

  • 文件不是浏览器能解码的图片格式;
  • 文件过大或位于异常的存储位置,读取被中断。

先用系统看图器确认图片能正常打开,再试一次。考虑到 IndexedDB 配额,不建议上传几 MB 以上的原图。

保存记录后列表没更新?

保存链路是:PromptModal 提交 → App.handleSaveItem → db.items.set() → loadData() 重新读全量并刷新。因为是写入后重读,正常情况下一定会刷新。

如果确实没变,看控制台是否有 IndexedDB 写入异常——配额超限是最常见的原因(典型场景:库里已经存了大量大图)。此时先「导出 XLSX」把数据保出来,再删掉部分记录或换用压缩图。

导出的 XLSX 打不开 / 图片显示不全?
  • 文件是标准 .xlsx(OOXML),Excel、WPS、LibreOffice、Numbers 均可打开;
  • 行高固定 100 px、图片固定 90×90,图片不会随缩放自适应;
  • 若某些记录的图片本身缺失(image 为空),那一行就只没有图,属正常。
可以把数据同步到多台设备吗?

当前版本不支持自动同步(没有云端、没有账号)。可行的方式是手动搬运:

  1. 在 A 设备「导出 XLSX」;
  2. 把文件传到 B 设备;
  3. 在 B 设备打开同一地址,「导入 XLSX」。

注意导入是合并更新,两边都新增过记录时会双向合并不了——导入只会覆盖同 ID 的记录,不会把 A 的独有记录删掉,但也不会因为 B 有而消失。稳妥做法是固定用一台设备做「主库」,只在主库上编辑。

为什么包里有 express / @google/genai 这些没用的依赖?

来自项目最初的 Google AI Studio 模板脚手架,src/ 中零引用。属历史残留,可以安全移除(见已知限制与待办)。

构建时提示 Node 版本过低?

Vite 6 需要 Node 18+,推荐 20 / 22 LTS。用 node -v 确认版本,必要时用 nvm / fnm 切换。


隐私与安全

这是本项目的一个卖点,值得单独说清:

  • 没有服务端。 数据不经过任何服务器,不存在「上传到我们这里」这一步。
  • 没有任何业务网络请求。 应用代码不调用外部 API(连 AI 调用都没有),没有统计分析、没有遥测。
  • 数据落在本机浏览器的 IndexedDB 里,路径由浏览器管理(例如 Chrome / Edge 在用户配置目录下的 IndexedDB/ 中)。
  • 唯一的对外数据出口是你主动触发的「导出 XLSX」,写入的是浏览器下载目录。

因此:

  • 断网也能完整使用;
  • 敏感提示词不会外泄,但也意味着没有团队共享能力——要分享请导出发文件;
  • 反面提醒:本机浏览器配置目录里会存在明文提示词与图片。如果这台机器是共享的,或使用了会同步浏览器数据的账号(如 Edge 同步),请自行评估。

若部署到公网域名,任何访问该域名的人都会拿到同一份前端代码,但各自看到的是自己浏览器里的数据库——前一个访客的记录不会出现在后一个访客的页面上。


已知限制与待办

以下是当前版本真实存在的问题,如实记录:

功能限制

  • 无云端同步 / 无账号:仅本机浏览器可用,换设备靠 XLSX 搬运。
  • 无「清空全部」按钮:db.items.clear() 已在 lib/db.ts 中实现,但没有任何 UI 调用它。
  • 无批量操作:不支持多选删除、批量导出选中项、批量改分类。
  • 无排序与筛选控件:列表恒按 createdAt 倒序;不能按分类筛、不能按时间范围筛。
  • 无自定义标签:只有五个固定分类字段,不支持自由标签。
  • 无必填校验:可以保存完全为空的记录。
  • 无撤销:删除后不可恢复(除从 XLSX 备份导入)。
  • 搜索无高级语法:纯子串匹配,不支持多关键词 AND/OR 或按字段限定。

工程遗留(不影响使用,但建议清理)

位置 问题 建议
index.html <title> 仍是 My Google AI Studio App,lang="en" 而界面是中文 改为 ComfyUI 提示词归档助手、lang="zh-CN";这也会改变浏览器标签页标题与线上站点标题
package.json name: "react-example"、version: "0.0.0" 改成真实项目名与初始版本号
package.json @google/genai、express、dotenv、motion 零引用 移除;@types/express 同步移除。注意 @types/exceljs@^0.5.3 版本远低于 exceljs@^4.4.0,也建议一并复查
package.json lint 仅 tsc --noEmit,无 ESLint / Prettier 如需可补
package.json clean: "rm -rf dist server.js" 引用的 server.js 并不存在;且 rm -rf 在 Windows cmd 下不可用,建议换 rimraf
.env.example 声明 GEMINI_API_KEY / APP_URL,本项目完全用不到 删除该文件或改写为说明「无需环境变量」
metadata.json 含 MAJOR_CAPABILITY_SERVER_SIDE_GEMINI_API,与实际能力不符 删除该字段
assets/.aistudio/ 模板占位空目录 可删
src/components/PromptRow.tsx PromptRowProps 里声明了 key?: React.Key,属无用字段(key 由 React 自身处理,不应出现在 props 类型里) 移除

文档

  • 仓库没有 LICENSE 文件(见下)。

许可证

当前仓库未包含 LICENSE 文件,因此按默认版权规则处理:保留所有权利(All rights reserved)。

如果你希望以开源许可证分发,推荐在仓库根目录直接添加文件:

  1. 进入仓库页 → Add file → Create new file;
  2. 文件名填 LICENSE(GitHub 会识别并提供右侧模板选择);
  3. 选择协议(如 MIT、Apache-2.0)→ 提交;
  4. 顺手把本 README 顶部与本节更新为对应协议。

在此之前,请勿将本项目代码用于再分发。


致谢

  • 感谢 ComfyUI —— 让提示词值得被归档;
  • 感谢 localforage、ExcelJS、lucide 等开源项目;
  • 项目脚手架最初由 Google AI Studio 生成,后经改造为纯本地归档工具。

图会忘,提示词不会——只要你把它存下来。

About

ComfyUI 提示词归档助手 —— 纯前端本地归档工具。把 ComfyUI 生图提示词按画风 / 人物 / 动作 / 环境 / 构图五大类整理保存,支持中英对照、关键词检索、带图 XLSX 导入导出与浏览器本地持久化。数据全程留在本机,无需后端、无需账号。

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages