{"id":51884789,"url":"https://github.com/tianjiangqiji/nova-image-studio","last_synced_at":"2026-07-25T19:01:35.745Z","repository":{"id":366304762,"uuid":"1275718468","full_name":"tianjiangqiji/nova-image-studio","owner":"tianjiangqiji","description":"自托管的 AI 图像生成工作台 · 自定义模型 · 多模式 · PWA · 实时任务 支持Agent模式，工作台模式，无限画布，反推提示词，提示词广场，GIF生成。前后端任务机制轻量后端；三端兼容 UI：桌面端、平板端、移动端自适应布局","archived":false,"fork":false,"pushed_at":"2026-07-20T12:15:29.000Z","size":10795,"stargazers_count":228,"open_issues_count":1,"forks_count":57,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-07-20T13:21:42.381Z","etag":null,"topics":["banana","gpt-image","gpt-image-2","image-editing","image-generation","nano-banana","openai","react","tailwindcss","typescript","vite"],"latest_commit_sha":null,"homepage":"https://image.ccode.vip","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"agpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/tianjiangqiji.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-06-21T03:50:26.000Z","updated_at":"2026-07-20T12:53:28.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/tianjiangqiji/nova-image-studio","commit_stats":null,"previous_names":["tianjiangqiji/nova-image-studio"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/tianjiangqiji/nova-image-studio","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tianjiangqiji%2Fnova-image-studio","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tianjiangqiji%2Fnova-image-studio/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tianjiangqiji%2Fnova-image-studio/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tianjiangqiji%2Fnova-image-studio/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/tianjiangqiji","download_url":"https://codeload.github.com/tianjiangqiji/nova-image-studio/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tianjiangqiji%2Fnova-image-studio/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35889141,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-07-20T02:08:10.276Z","status":"online","status_checked_at":"2026-07-25T02:00:06.922Z","response_time":64,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["banana","gpt-image","gpt-image-2","image-editing","image-generation","nano-banana","openai","react","tailwindcss","typescript","vite"],"created_at":"2026-07-25T19:01:35.017Z","updated_at":"2026-07-25T19:01:35.724Z","avatar_url":"https://github.com/tianjiangqiji.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Nova Image Studio\n\n\u003cdiv align=\"center\"\u003e\n\n**自托管的 AI 图像生成工作台 · 自定义模型 · 多模式 · PWA · 实时任务**\n\n[![Version](https://img.shields.io/badge/version-v3.1.2-blue.svg)](https://github.com)\n[![License](https://img.shields.io/badge/license-AGPL--3.0-green.svg)](LICENSE)\n[![Node](https://img.shields.io/badge/node-%3E%3D20-brightgreen.svg)](https://nodejs.org)\n[![Next.js](https://img.shields.io/badge/Next.js-16-black.svg)](https://nextjs.org)\n[![React](https://img.shields.io/badge/React-19-61DAFB.svg)](https://react.dev)\n\n\u003c/div\u003e\n\n---\n\n## 📖 简介\n\nNova Image Studio（简称 Nova Image）是一个面向个人/团队的 AI 图像生成工作台。前端使用 Next.js 16 + React 19 静态导出（PWA），后端是轻量 Node.js 服务（`server.js` + SQLite + WebSocket），统一调度任务并代理图像生成 API。\n\n**开源版特性：**\n- 支持分别配置图片模型与文本模型，模型级独立保存 API Key 与 Base URL\n- 用户自定义模型列表和 API 端点，后端按协议路由并透传已配置参数\n- 所有配置存储在浏览器 localStorage\n- 文字模型支持 Google（generateContent）和 OpenAI（Response 协议）\n\n\u003e 当前版本：**v3.1.2**\n\n## 💎 赞助商\n\n期待您的赞助\n\n---\n\n## 🖼️ UI 预览\n\n### 生图工作台\n\n| 宽屏 | 窄屏 | 手机版 |\n|:---:|:---:|:---:|\n| ![生图工作台宽屏](doc/生图工作台宽屏.png) | ![生图工作台窄屏](doc/生图工作台窄屏.png) | ![生图工作台手机版](doc/生图工作台手机版.png) |\n\n### Agent 模式\n\n| 询问 | 生成 |\n|:---:|:---:|\n| ![Agent模式询问](doc/Agent模式询问.png) | ![Agent模式生成](doc/Agent模式生成.png) |\n\n### GIF 生成\n\n| 生成 | 微调 |\n|:---:|:---:|\n| ![GIF生成](doc/GIF生成.png) | ![GIF微调](doc/GIF微调.png) |\n\n### 无限画布\n\n| 预览 | 编辑 |\n|:---:|:---:|\n| ![无限画布预览](doc/无限画布预览.png) | ![无限画布编辑](doc/无限画布编辑.png) |\n\n### 其他功能\n\n| 反推提示词 | 提示词广场 | 我的素材 | 设置 |\n|:---:|:---:|:---:|:---:|\n| ![反推提示词](doc/反推提示词.png) | ![提示词广场](doc/提示词广场.png) | ![我的素材](doc/我的素材.png) | ![设置](doc/设置.png) |\n\n---\n\n## ✨ 功能特性\n\n### 五大工作模式\n\n| 模式 | 入口 | 简介 |\n| --- | --- | --- |\n| 🎨 文本生图 | `TextToImageForm` | 纯文字提示词生成图像，支持多图并行 |\n| 🖼️ 图生图 | `ImageToImageForm` | 上传参考图，编辑/转换/风格化 |\n| 🤖 Agent 智能体 | `AgentChatWorkspace` | 多轮对话式生成：聊天 → 方案 → 出图，支持 vision 描述、联网搜索、reasoning |\n| 🔍 反推提示词 | `ReversePromptForm` | 上传图片流式反推提示词（支持所有已配置的文字模型） |\n| 🎬 动图生成 | `GifGenerationWorkspace` | 多帧生图 + 网格拼合，浏览器端编码 GIF（`gifenc`） |\n\n### 提示词广场\n\n`PROMPT_GALLERY_MODE` 三种工作方式：\n\n- `1` 常驻：Tab 始终显示\n- `2` 私密：需要密码验证（密码来自后端环境变量 `PROMPT_GALLERY_PASSWORD`）\n- `3` 关闭：完全不显示\n\n提示词内容由后端 `backend/prompts.json` 维护，支持敏感词过滤（`backend/blacklist.json`）。\n\n### 模型系统\n\nNova Image 采用**用户自定义模型**架构：\n\n- **模型级配置**：每个图片模型和文本模型都独立保存协议、显示名称、模型 ID、API Key 与 Base URL\n- **图像模型**：用户自由添加、编辑、删除，支持设置协议、显示名称、模型 ID、最大参考图数量、最大分辨率\n- **Image 2 额外参数**：仅 OpenAI 图片模型显示，透明背景、质量、风格控件默认开启，用户可手动关闭\n- **文字模型**：支持自定义扩展，兼容 Gemini 和 OpenAI Response\n- **默认模型**：可为文本生图、图生图、反推提示词、Agent 等任务分别设置默认模型\n\n### 任务系统\n\n- 提交后入队，服务端并发处理（默认上限 50，可通过 `NOVA_TASK_CONCURRENCY` 调整）\n- 浏览器通过 **WebSocket** 实时接收任务/队列状态，断线自动重连，失败 5 次后回退 **HTTP 轮询**（30 秒间隔）\n- 任务结果本地落盘（默认 `backend/data/nova-images/`，可用 `NOVA_IMAGE_DIR` 调整），HTTP 路由 `/api/nova/images/:taskId/:index` 直接提供\n- 任务 TTL 12 小时，过期自动清理（5 分钟一次）\n- 服务重启时把残留\"处理中\"任务标记为失败并删除产物，避免幽灵任务\n\n### 体验与工程化\n\n- PWA（`next-pwa`），可安装到桌面\n- 三端兼容 UI：桌面端、平板端、移动端自适应布局，提供一致的用户体验\n- 暗色 / 亮色主题切换\n- 宽屏 / 窄屏自适应布局（左侧垂直 Tab + 右侧内容）\n- 历史任务持久化（IndexedDB / localStorage）\n- 一键备份 / 恢复（`JSZip` 打包 localStorage + IndexedDB，支持跳过不兼容旧配置并恢复其余数据）\n- 历史图片懒加载（`@tanstack/react-virtual`）\n- 随机图、Toast 通知、确认对话框\n\n---\n\n## 📁 项目结构\n\n```text\nnova-image-studio/\n├── frontend/                 # Next.js 前端（React 19 + TS）\n│   ├── src/\n│   │   ├── app/              # 根页面 layout.tsx / page.tsx\n│   │   ├── components/       # 业务组件 + shadcn/ui 基础组件\n│   │   │   ├── workspace/    # 主工作台壳、Tab、Header、结果区\n│   │   │   ├── agent/        # Agent 模式相关组件\n│   │   │   └── ui/           # shadcn 风格 UI 基础件\n│   │   ├── hooks/            # useQueueStatus / useAgentChat / useGifWorkflow / ...\n│   │   ├── lib/              # 客户端工具、API 客户端、WebSocket、备份\n│   │   └── test/             # vitest 配置与用例\n│   ├── public/               # PWA 图标、静态资源\n│   ├── next.config.ts        # 静态导出 + next-pwa 配置\n│   ├── package.json\n│   └── vitest.config.ts\n├── backend/\n│   ├── server.js             # Node 服务（HTTP + WS + SQLite + 任务队列）\n│   ├── prompts.json          # 提示词广场内容\n│   ├── blacklist.json        # 敏感词\n│   ├── .env.example\n│   └── package.json\n├── scripts/\n│   ├── pack.js               # 打包：build + 汇总到 out.zip\n│   └── generate-icons.js     # 生成 PWA 图标\n├── package.json              # npm workspaces 根\n├── LICENSE                   # AGPL-3.0 许可证\n└── README.md\n```\n\n\u003e 生产构建会输出到 `frontend/out/`，由后端 `server.js` 静态托管。\n\n---\n\n## 🚀 部署指南\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003e🐳 Docker Compose 部署\u003c/strong\u003e\u003c/summary\u003e\n\n### 前置要求\n\n- Docker 20.10+\n- Docker Compose v2\n\n### 快速启动\n\n```bash\n# 0. clone 仓库\ngit clone https://github.com/tianjiangqiji/nova-image-studio.git\ncd nova-image-studio\n\n# 1. 复制 Docker 专用环境变量到项目根目录（挂载为 /app/.env）\ncp backend/.env.docker.example .env\n# 按需编辑 .env（限流、广场密码等）\n\n# 2. 复制配置文件到根目录（compose 会挂到容器内）\ncp backend/blacklist.json blacklist.json\ncp backend/prompts.json prompts.json\n# 若仓库里没有这两份文件：touch blacklist.json prompts.json 后自行填写\n\n# 3. 创建数据目录\nmkdir -p data\n\n# 4. 启动服务\ndocker compose up -d\n\n# 运行期最少需要：\n# docker-compose.yml、.env、blacklist.json、prompts.json、data/\n```\n\n访问 \u003chttp://localhost:3000\u003e。\n\n### 环境变量\n\n通过根目录 `.env` 挂载到容器 `/app/.env` 注入（代码用 `process.cwd()/.env` 读取），无需修改镜像。\n\n修改后：\n\n- 限流 / 队列 / 广场模式等运行时配置：约 1 秒内自动生效\n- `PORT` / `HOSTNAME` / `NODE_ENV` / 数据路径：需重启\n\n```bash\ndocker compose restart\n```\n\n### 升级\n\n拉取最新镜像并重建容器：\n\n```bash\ndocker compose down\ndocker compose pull\ndocker compose up -d --force-recreate\n```\n\n### 数据持久化\n\n`docker-compose.yml` 会挂载：\n\n| 宿主机 | 容器内 | 用途 |\n| --- | --- | --- |\n| `./data` | `/app/backend/data` | 数据库 + 图片（含 WAL/SHM） |\n| `./.env` | `/app/.env` | 环境变量 |\n| `./blacklist.json` | `/app/backend/blacklist.json` | 敏感词 |\n| `./prompts.json` | `/app/backend/prompts.json` | 提示词广场 |\n\n`./data` 内实际文件（由 `NOVA_*` 路径决定）：\n\n- `nova-tasks.sqlite`（及 `-wal` / `-shm`）— 任务数据库\n- `nova-images/` — 生成的图片\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003e📦 本地部署（生产环境）\u003c/strong\u003e\u003c/summary\u003e\n\n### 环境要求\n\n- **Node.js**：20 或 22\n- **npm**：自带 workspaces 支持\n- `better-sqlite3` 是原生依赖，**生产服务器必须本地 `npm ci --omit=dev`**，不要直接复制本机 `node_modules`\n\n### 部署步骤\n\n#### 1. 在构建机\n\n```bash\nnpm ci\nnpm run build\n```\n\n产物 `frontend/out/` 已生成。\n\n#### 2. 上传以下到生产服务器\n\n```text\nfrontend/out/\nbackend/server.js\nbackend/package.json\nbackend/package-lock.json\nbackend/prompts.json\nbackend/blacklist.json\nbackend/.env          # 按生产环境调整（cwd=backend）\n```\n\n`backend/.env` 建议：\n\n```env\nNODE_ENV=production\nNOVA_TASK_DB=./data/nova-tasks.sqlite\nNOVA_IMAGE_DIR=./data/nova-images\n```\n\n#### 3. 在生产服务器\n\n在项目根目录执行（`npm start` 会 `cd backend` 再启动）：\n\n```bash\ncd backend \u0026\u0026 npm ci --omit=dev   # 必须本地装 better-sqlite3 原生模块\ncd ..\nnpm start                         # 等价于 cd backend \u0026\u0026 node server.js\n```\n\n服务会在 `backend/data/` 下自动创建数据库与图片目录。\n\n#### 4. 进程托管\n\n推荐 **PM2 / systemd / 平台自带进程管理**，确保：\n\n- 进程工作目录最终在 `backend/`（与 `npm start` 一致），或绝对路径配置 `NOVA_TASK_DB` / `NOVA_IMAGE_DIR`\n- 进程对 `backend/data/`（或你配置的路径）有读写权限\n- 反向代理（Nginx / Caddy / 云网关）将域名转到 `http://127.0.0.1:3000`\n\n#### 5. 一键打包\n\n```bash\nnpm run go\n```\n\n生成根目录 `out.zip`，解压后即可按上面 1~3 步骤部署。\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003e💻 本地开发\u003c/strong\u003e\u003c/summary\u003e\n\n### 环境要求\n\n- **Node.js**：20 或 22\n- **npm**：自带 workspaces 支持\n\n### 安装与运行\n\n```bash\n# 1. 克隆仓库\ngit clone https://github.com/tianjiangqiji/nova-image-studio.git\ncd nova-image-studio\n\n# 2. 安装依赖（自动安装根、frontend、backend）\nnpm install\n\n# 3. 复制后端环境变量（本地 cwd=backend，使用相对路径 ./data/...）\ncp backend/.env.example backend/.env\n# Windows: Copy-Item backend/.env.example backend/.env\n# 确认 backend/.env 中：\n#   NOVA_TASK_DB=./data/nova-tasks.sqlite\n#   NOVA_IMAGE_DIR=./data/nova-images\n\n# 4. 启动开发模式（等同于 build 后用 production 模式跑 server.js）\nnpm run dev\n```\n\n访问 \u003chttp://localhost:3000\u003e。\n\n本地数据落在 `backend/data/`（数据库 + `nova-images/`）。\n\n\u003e 首次启动时需要在 UI 的\"设置\"中至少完成一个图片模型和一个文本模型配置，并设置默认模型。所有前端配置均保存在浏览器 localStorage，可通过备份功能导出。\n\n### 常用开发脚本\n\n```bash\nnpm run dev:frontend   # 仅启动 Next.js dev server（HMR，不走静态导出）\nnpm run dev:backend    # 仅启动后端 server.js\nnpm run build          # 构建前端静态产物到 frontend/out/\nnpm start              # 直接跑后端 server.js\nnpm run lint           # 前端 ESLint\nnpm test               # 前端 Vitest watch\nnpm run test:run       # 前端 Vitest 单次\nnpm run go             # 打包：build + 汇总到根 out.zip\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003e🔨 Docker 镜像构建\u003c/strong\u003e\u003c/summary\u003e\n\n### 构建镜像\n\n```bash\ndocker build -t nova-image-studio:latest .\n```\n\n### 推送到仓库\n\n```bash\ndocker tag nova-image-studio:latest tianjiangqiji/nova-image-studio:latest\n\ndocker push tianjiangqiji/nova-image-studio:latest\n```\n\n\u003c/details\u003e\n\n---\n\n## ⚙️ 环境变量\n\n| 场景 | 模板 | 复制到 | 数据路径（模板已写好） |\n| --- | --- | --- | --- |\n| 本地开发 / 本地生产 | `backend/.env.example` | `backend/.env` | `./data/nova-tasks.sqlite`、`./data/nova-images` |\n| Docker Compose | `backend/.env.docker.example` | 项目根 `.env` | `backend/data/nova-tasks.sqlite`、`backend/data/nova-images` |\n\n| 变量 | 必填 | 默认 | 说明 |\n| --- | --- | --- | --- |\n| `PORT` | 否 | `3000` | 监听端口 |\n| `HOSTNAME` | 否 | `0.0.0.0` | 绑定地址，`localhost`/`127.0.0.1` 仅本机 |\n| `NODE_ENV` | **是** | `production` | **必须为 `production`**，否则会走 Next dev 模式 |\n| `NOVA_TASK_DB` | 否 | `./nova-tasks.sqlite` | SQLite 文件路径（相对 `process.cwd()`）；建议 `./data/...` 或 Docker 下 `backend/data/...` |\n| `NOVA_IMAGE_DIR` | 否 | `./nova-images`（相对 `__dirname` 即 `backend/`） | 任务产物落盘目录；建议 `./data/nova-images` 或 Docker 下 `backend/data/nova-images` |\n| `NOVA_TASK_CONCURRENCY` | 否 | `50` | 最大并发任务数（绝对上限 50） |\n| `NOVA_MAX_QUEUE_SIZE` | 否 | `200` | 全局最大待处理任务数 |\n| `NOVA_RATE_LIMIT_WINDOW_MS` | 否 | `60000` | 创建任务速率限制窗口，单位毫秒 |\n| `NOVA_RATE_LIMIT_MAX_REQUESTS_PER_IP` | 否 | `20` | 单 IP 在一个窗口内最多创建多少个任务 |\n| `NOVA_RATE_LIMIT_MAX_REQUESTS_PER_API_KEY` | 否 | `20` | 单 API Key 在一个窗口内最多创建多少个任务 |\n| `NOVA_MAX_PENDING_TASKS_PER_IP` | 否 | `20` | 单 IP 最多同时拥有多少个待处理任务 |\n| `NOVA_MAX_PENDING_TASKS_PER_API_KEY` | 否 | `10` | 单 API Key 最多同时拥有多少个待处理任务 |\n| `NOVA_RATE_LIMIT_RETRY_AFTER_SECONDS` | 否 | `30` | 队列满/限流时响应头 `Retry-After` 秒数 |\n| `PROMPT_GALLERY_MODE` | 否 | `2` | `1` 常驻 / `2` 私密密码（点七下标题） / `3` 关闭 |\n| `PROMPT_GALLERY_PASSWORD` | 否 | 空 | 提示词广场私密模式密码；为空时私密模式可直接开启 |\n\n\u003e `.env` 修改后大部分运行时配置**实时生效**（任务并发、限流、队列容量、接单开关、广场模式），无需重启；`PORT`、`HOSTNAME`、`NODE_ENV`、`NOVA_TASK_DB`、`NOVA_IMAGE_DIR` 这类启动级配置仍需重启。\n\n---\n\n## 📡 API 速览\n\n后端暴露在 `/api/nova/*` 路径下，前端在同源调用。\n\n| 方法 | 路径 | 说明 |\n| --- | --- | --- |\n| `POST` | `/api/nova/tasks` | 创建任务，返回 `{ taskId }`（202） |\n| `GET` | `/api/nova/tasks/:id` | 查询任务状态与结果 |\n| `POST` | `/api/nova/tasks/:id/ack` | 续期：把 TTL 延长 2 分钟 |\n| `GET` | `/api/nova/queue-status` | 当前并发 / 排队 / 接收状态 |\n| `GET` | `/api/nova/prompts` | 提示词广场内容 |\n| `GET` | `/api/nova/blacklist` | 敏感词列表 |\n| `GET` | `/api/nova/config` | 前端配置（如 `promptGalleryMode`） |\n| `GET` | `/api/nova/images/:taskId/:index` | 任务产物图片 |\n| `WS` | `/api/nova/ws` | 实时任务 / 队列订阅 |\n\n### 任务状态\n\n- `排队中`：等待调度\n- `processing`：正在调用上游 API\n- `completed`：成功，`result.images` 包含产物链接\n- `failed`：失败，详见 `error`\n- `expired`：超过 TTL\n\n---\n\n## ❓ 常见问题\n\n**为什么生产环境不用 `next start`？**\n项目使用 `output: 'export'`，构建产物是纯静态 `out/`。`server.js` 同时托管静态文件 + 任务 API，不再依赖 `next start`。\n\n**只部署 `out/` 能用吗？**\nUI 可以打开，但任务提交、Agent、历史同步全部依赖 `/api/nova/*`，必须运行 `server.js`。\n\n**数据库需要单独备份吗？**\n首次部署不需要，服务启动会自建。任务数据要保留就备份数据目录（本地 `backend/data/`，Docker 宿主机 `./data/`）里的 `nova-tasks.sqlite`（含 WAL/SHM）以及 `nova-images/`。重启后残留任务会被自动标记为失败并清理产物。\n\n**如何临时停止接收新任务（不停服务）？**\n编辑 `.env`：\n\n```env\nNOVA_ACCEPT_NEW_TASKS=false\n```\n\n保存即生效。等待在飞任务完成后即可重启升级。再次开启设为 `true` 或留空。\n\n**任务多久会过期？**\n创建后 12 小时；前端在拿到结果后会调用 `/ack` 续期 2 分钟，给下载留时间。超过 TTL 服务端删除数据库记录与产物图片。\n\n---\n\n## 🙏 致谢\n\n本项目的无限画布工作区功能基于 [infinite-canvas](https://github.com/basketikun/infinite-canvas) 项目开发，感谢原作者 [basketikun](https://github.com/basketikun) 的开源贡献。\n\n感谢 [Linux.do](https://linux.do/) 社区的支持。\n\n---\n\n## ☕ 赞助支持\n\u003cdiv align=\"center\"\u003e\n\n如果这个项目对你有帮助，欢迎通过爱发电赞助支持，你的每一份鼓励都是持续更新的动力！\n\n\u003cbr\u003e\n\u003cbr\u003e\n\n\u003ca href=\"https://www.ifdian.net/a/skyjee\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/%E7%88%B1%E5%8F%91%E7%94%B5-%E8%B5%9E%E5%8A%A9%E4%BD%9C%E8%80%85-946ce6?style=for-the-badge\u0026logo=data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0id2hpdGUiPjxwYXRoIGQ9Ik0xMiAyMS4zNWwtMS40NS0xLjMyQzUuNCAxNS4zNiAyIDEyLjI4IDIgOC41IDIgNS40MiA0LjQyIDMgNy41IDNjMS43NCAwIDMuNDEuODEgNC41IDIuMDlDMTMuMDkgMy44MSAxNC43NiAzIDE2LjUgMyAxOS41OCAzIDIyIDUuNDIgMjIgOC41YzAgMy43OC0zLjQgNi44Ni04LjU1IDExLjU0TDEyIDIxLjM1eiIvPjwvc3ZnPg==\u0026logoColor=white\" alt=\"爱发电赞助\" /\u003e\n\u003c/a\u003e\n\n\u003cbr\u003e\n\u003cbr\u003e\n\n\u003c/div\u003e\n---\n\n## 📬 联系方式\n\n邮箱：skyjee@linux.do\n\n---\n## Star History\n\n\u003ca href=\"https://www.star-history.com/?repos=tianjiangqiji%2Fnova-image-studio\u0026type=date\u0026legend=top-left\"\u003e\n \u003cpicture\u003e\n   \u003csource media=\"(prefers-color-scheme: dark)\" srcset=\"https://api.star-history.com/chart?repos=tianjiangqiji/nova-image-studio\u0026type=date\u0026theme=dark\u0026legend=top-left\u0026sealed_token=clnQ7NRTys9PWagU6Le0AOcbLj0kNHUcrCk0dTvejD53SO6ybvgm9oM-vA_2nqtuAEZ8jAYMNbt_4MDg47CQ44bSyP0KLltIWPudfIDvMx_eJVk32XxnDw\" /\u003e\n   \u003csource media=\"(prefers-color-scheme: light)\" srcset=\"https://api.star-history.com/chart?repos=tianjiangqiji/nova-image-studio\u0026type=date\u0026legend=top-left\u0026sealed_token=clnQ7NRTys9PWagU6Le0AOcbLj0kNHUcrCk0dTvejD53SO6ybvgm9oM-vA_2nqtuAEZ8jAYMNbt_4MDg47CQ44bSyP0KLltIWPudfIDvMx_eJVk32XxnDw\" /\u003e\n   \u003cimg alt=\"Star History Chart\" src=\"https://api.star-history.com/chart?repos=tianjiangqiji/nova-image-studio\u0026type=date\u0026legend=top-left\u0026sealed_token=clnQ7NRTys9PWagU6Le0AOcbLj0kNHUcrCk0dTvejD53SO6ybvgm9oM-vA_2nqtuAEZ8jAYMNbt_4MDg47CQ44bSyP0KLltIWPudfIDvMx_eJVk32XxnDw\" /\u003e\n \u003c/picture\u003e\n\u003c/a\u003e\n\n---\n\n## 📄 许可证\n\n本项目采用 [GNU Affero General Public License v3.0](LICENSE)（AGPL-3.0）开源许可证。\n\n这意味着：\n\n- ✅ 你可以自由使用、修改和分发本软件\n- ✅ 你可以将本软件用于商业用途\n- ⚠️ 如果你修改了本软件并通过网络提供服务，你必须公开修改后的源代码\n- ⚠️ 基于本软件的衍生作品必须使用相同的 AGPL-3.0 许可证\n\n详细条款请参阅 [LICENSE](LICENSE) 文件。\n\n---\n\n\u003cdiv align=\"center\"\u003e\n\n**[⬆ 回到顶部](#nova-image-studio)**\n\n\u003c/div\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftianjiangqiji%2Fnova-image-studio","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftianjiangqiji%2Fnova-image-studio","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftianjiangqiji%2Fnova-image-studio/lists"}