扫码加入交流群,获取使用帮助与最新动态:
加入飞书群
- 引入语义化
--brand-*CSS token,下线全站 60+ 文件硬编码pink-* - 用户菜单新增主题色切换器,三套预设:薄荷(默认)、经典蓝、玫粉
- SSR 安全的防闪烁初始化;老版本
localStorage值自动迁移 - 简历主题编辑器新增「薄荷」预设
- 导出通道(PDF / HTML / DOCX)统一读取
src/lib/brand-constants.ts
- 模板预览及预览/分享页新增移动端底部操作栏
- 修复移动端滚动:画布/预览根节点改用
h-full - 面试报告生成稳定性提升
- 移除所有
NEXT_PUBLIC_*构建时变量,改为运行时读取
NEXT_PUBLIC_AUTH_ENABLED改为运行时变量AUTH_ENABLED
| 模板画廊 | 简历编辑器 |
|---|---|
![]() |
![]() |
| AI 填充简历 | AI 图片简历解析 |
|---|---|
![]() |
![]() |
| AI 优化 | AI 语法检查 |
|---|---|
![]() |
![]() |
| 语法一键修复 | JD 匹配分析 |
|---|---|
![]() |
![]() |
| 多格式导出 | 创建分享链接 |
|---|---|
![]() |
![]() |
| 简历分享页 | AI 职业照生成 |
|---|---|
![]() |
![]() |
| 二维码模块 |
|---|
![]() |
| 新建面试 | 模拟面试 |
|---|---|
![]() |
![]() |
| 面试列表 | 面试报告 |
|---|---|
![]() |
![]() |
在 Bilibili 观看完整部署教程:
- 拖拽编辑器 — 可视化拖拽排列简历模块与条目
- 行内编辑 — 点击任意字段,直接在画布上编辑
- 50 套专业模板 — 经典、现代、极简、创意、ATS 友好、时间线、北欧风、瑞士风等多种风格
- 主题定制 — 颜色、字体、间距、页边距实时预览调整
- 撤销 / 重做 — 完整编辑历史(最多 50 步)
- 自动保存 — 可配置保存间隔(0.3s–5s),支持手动保存
- Markdown 支持 — 在文本字段中使用 Markdown 语法排版内容(例如
**加粗**可显示粗体文字)
以下简历模块支持 Markdown 语法:
| 模块 | 支持字段 |
|---|---|
| 个人简介(Summary) | 正文内容 |
| 工作经历 | 描述、亮点(Highlights) |
| 教育背景 | 亮点(Highlights) |
| 项目经历 | 描述、亮点(Highlights) |
| 自定义模块 | 描述 |
| 语言能力 | 描述 |
| GitHub | 描述 |
支持的语法:
**加粗文字** → 粗体
`代码文字` → 行内代码
- 列表项 → 无序列表
技能、证书、个人信息等字段暂不支持 Markdown。
- AI 聊天助手 — 编辑器内集成对话式 AI,支持多会话和持久化历史
- AI 一键生成简历 — 输入职位、经验、技能,自动生成完整简历
- 简历解析 — 上传已有 PDF 或图片,AI 自动提取全部内容
- JD 匹配分析 — 对比简历与职位描述:关键词匹配、ATS 评分、改进建议
- 求职信生成 — 基于简历和 JD 的 AI 定制求职信,可选语气(正式 / 友好 / 自信)
- 语法与写作检查 — 检测弱动词、模糊描述和语法问题,返回质量评分
- 多语言翻译 — 支持 10 种语言互译,保留专业术语原文
- 灵活 AI 供应商 — 支持 OpenAI、Anthropic 及自定义 API 端点;用户在应用内自行配置密钥
- JD 岗位面试模拟 — 粘贴 JD,AI 按顺序扮演不同面试官进行模拟面试
- 6 种预设面试官 — HR 面、技术面、场景面、行为面、项目深挖、Leader 面,各有独特性格和提问风格
- 自定义面试官 — 创建自定义面试官,设定考察维度和风格
- 智能追问 — AI 根据回答质量自适应追问,回答不到位会深入追问
- 面试控制 — 跳过问题、请求提示、标记复习、暂停/继续
- 详细报告 — 逐题评分、能力雷达图、改进建议与推荐资源
- 历史对比 — 追踪评分趋势和能力维度变化
- 报告导出 — 支持 PDF 和 Markdown 格式导出
- 多格式导出 — PDF(Puppeteer + Chromium)、智能一页 PDF(自动适配单页)、DOCX、HTML、TXT、JSON
- JSON 导入 — 导入之前导出的 JSON 文件还原或创建简历;编辑器内覆盖当前简历,仪表盘创建新简历
- 链接分享 — 基于 Token 的分享链接,支持密码保护
- 浏览统计 — 追踪分享简历的查看次数
- 多简历仪表盘 — 网格和列表视图、搜索、排序(按日期、名称)
- JSON 导入创建 — 在仪表盘直接通过 JSON 文件创建新简历
- 复制与重命名 — 快捷简历管理操作
- 新手引导 — 交互式分步引导,帮助新用户快速上手
- 双语界面 — 完整的中文(zh)和英文(en)界面
- 暗色模式 — 浅色、深色、跟随系统三种主题
- 灵活认证 — Google OAuth 或浏览器指纹(零配置即用)
- 双数据库 — SQLite(默认,零配置)或 PostgreSQL
| 层级 | 技术 |
|---|---|
| 框架 | Next.js 16 (App Router, Turbopack) |
| UI | React 19, Tailwind CSS 4, shadcn/ui, Radix UI |
| 拖拽 | @dnd-kit |
| 状态管理 | Zustand |
| 数据库 | Drizzle ORM (SQLite / PostgreSQL) |
| 认证 | NextAuth.js v5 + FingerprintJS |
| AI | Vercel AI SDK v6 + OpenAI / Anthropic |
| Puppeteer Core + @sparticuz/chromium | |
| 国际化 | next-intl |
| 数据校验 | Zod v4 |
# 先生成一个密钥
openssl rand -base64 32
docker run -d -p 3000:3000 \
-e AUTH_SECRET=<你生成的密钥> \
-v jadeai-data:/app/data \
twwch/jadeai:latest打开 http://localhost:3000。首次启动自动完成数据库迁移和数据初始化。
AUTH_SECRET为必填项,用于会话加密。通过openssl rand -base64 32生成。
AI 配置: 无需服务端 AI 环境变量。每位用户在应用内的 设置 > AI 中自行配置 API Key、Base URL 和模型。
使用 PostgreSQL
docker run -d -p 3000:3000 \
-e AUTH_SECRET=<你生成的密钥> \
-e DB_TYPE=postgresql \
-e DATABASE_URL=postgresql://user:pass@host:5432/jadeai \
twwch/jadeai:latest使用 Google OAuth 登录
docker run -d -p 3000:3000 \
-e AUTH_ENABLED=true \
-e AUTH_SECRET=your-secret \
-e GOOGLE_CLIENT_ID=xxx \
-e GOOGLE_CLIENT_SECRET=xxx \
-v jadeai-data:/app/data \
twwch/jadeai:latest- Node.js 18+
- pnpm 9+
git clone https://github.com/twwch/JadeAI.git
cd JadeAI
pnpm install
cp .env.example .env.local编辑 .env.local:
# 数据库(默认 SQLite,无需额外配置)
DB_TYPE=sqlite
# 认证(默认指纹模式,无需额外配置)
AUTH_ENABLED=falseAI 配置: 无需服务端环境变量。每位用户在应用内的 设置 > AI 中自行配置 API Key、Base URL 和模型。
查看 .env.example 了解所有可用选项(Google OAuth、PostgreSQL 等)。
# 生成并执行迁移
pnpm db:generate
pnpm db:migrate
# (可选)填充示例数据
pnpm db:seed
# 启动开发服务器
pnpm dev| 变量 | 必填 | 默认值 | 说明 |
|---|---|---|---|
AUTH_SECRET |
是 | — | 会话加密密钥 |
DB_TYPE |
否 | sqlite |
数据库类型:sqlite 或 postgresql |
DATABASE_URL |
PostgreSQL 时 | — | PostgreSQL 连接字符串 |
SQLITE_PATH |
否 | ./data/jade.db |
SQLite 数据库文件路径 |
AUTH_ENABLED |
否 | false |
启用 Google OAuth(true)或使用指纹模式(false) |
GOOGLE_CLIENT_ID |
OAuth 时 | — | Google OAuth 客户端 ID |
GOOGLE_CLIENT_SECRET |
OAuth 时 | — | Google OAuth 客户端密钥 |
APP_NAME |
否 | JadeAI |
应用显示名称 |
DEFAULT_LOCALE |
否 | zh |
默认语言:zh 或 en |
| 命令 | 说明 |
|---|---|
pnpm dev |
启动开发服务器(Turbopack) |
pnpm build |
生产构建 |
pnpm start |
启动生产服务器 |
pnpm lint |
运行 ESLint 检查 |
pnpm type-check |
TypeScript 类型检查 |
pnpm db:generate |
生成 Drizzle 迁移文件(SQLite) |
pnpm db:generate:pg |
生成 Drizzle 迁移文件(PostgreSQL) |
pnpm db:migrate |
执行数据库迁移 |
pnpm db:studio |
打开 Drizzle Studio(数据库 GUI) |
pnpm db:seed |
填充示例数据 |
src/
├── app/ # Next.js App Router
│ ├── [locale]/ # 国际化路由 (/zh/..., /en/...)
│ │ ├── dashboard/ # 简历列表与管理
│ │ ├── editor/[id]/ # 简历编辑器
│ │ ├── preview/[id]/ # 全屏预览
│ │ ├── templates/ # 模板画廊
│ │ └── share/[token]/ # 公开分享简历查看
│ └── api/
│ ├── ai/ # AI 接口
│ │ ├── chat/ # 流式对话 + 工具调用
│ │ ├── generate-resume/# AI 生成简历
│ │ ├── jd-analysis/ # JD 匹配分析
│ │ ├── grammar-check/ # 语法与写作检查
│ │ ├── cover-letter/ # 求职信生成
│ │ ├── translate/ # 简历翻译
│ │ └── models/ # 可用 AI 模型列表
│ ├── resume/ # 简历 CRUD、导出、解析、分享
│ ├── share/ # 公开分享访问
│ ├── user/ # 用户信息与设置
│ └── auth/ # NextAuth 认证
├── components/
│ ├── ui/ # shadcn/ui 基础组件
│ ├── editor/ # 编辑器画布、区块、字段、弹窗
│ ├── ai/ # AI 对话面板与气泡
│ ├── preview/templates/ # 50 套简历模板
│ ├── dashboard/ # 仪表盘卡片、网格、弹窗
│ └── layout/ # 头部、主题、语言切换
├── lib/
│ ├── db/ # Schema、仓库、迁移、适配器
│ ├── auth/ # 认证配置
│ └── ai/ # AI 提示词、工具、模型配置
├── hooks/ # 自定义 React Hooks(7 个)
├── stores/ # Zustand 状态仓库(简历、编辑器、设置、UI、引导)
└── types/ # TypeScript 类型定义
JadeAI 内置 50 套专业设计模板,覆盖多种风格和行业需求:
查看全部 50 套模板
| # | 模板 | # | 模板 | # | 模板 |
|---|---|---|---|---|---|
| 1 | Classic | 18 | Clean | 35 | Material |
| 2 | Modern | 19 | Bold | 36 | Medical |
| 3 | Minimal | 20 | Timeline | 37 | Luxe |
| 4 | Professional | 21 | Nordic | 38 | Retro |
| 5 | Two-Column | 22 | Gradient | 39 | Card |
| 6 | ATS | 23 | Magazine | 40 | Rose |
| 7 | Academic | 24 | Corporate | 41 | Teacher |
| 8 | Creative | 25 | Consultant | 42 | Coder |
| 9 | Elegant | 26 | Swiss | 43 | Zigzag |
| 10 | Executive | 27 | Metro | 44 | Neon |
| 11 | Developer | 28 | Architect | 45 | Scientist |
| 12 | Designer | 29 | Japanese | 46 | Blocks |
| 13 | Startup | 30 | Artistic | 47 | Ribbon |
| 14 | Formal | 31 | Sidebar | 48 | Engineer |
| 15 | Infographic | 32 | Finance | 49 | Watercolor |
| 16 | Compact | 33 | Berlin | 50 | Mosaic |
| 17 | Euro | 34 | Legal |
查看全部 API 端点
| 方法 | 端点 | 说明 |
|---|---|---|
GET |
/api/resume |
获取当前用户的简历列表 |
POST |
/api/resume |
创建新简历 |
GET |
/api/resume/[id] |
获取简历详情(含所有模块) |
PUT |
/api/resume/[id] |
更新简历元信息或模块 |
DELETE |
/api/resume/[id] |
删除简历 |
POST |
/api/resume/[id]/duplicate |
复制简历 |
GET |
/api/resume/[id]/export |
导出简历(pdf、docx、html、txt、json) |
POST |
/api/resume/parse |
解析上传的 PDF 或图片简历 |
POST |
/api/resume/[id]/share |
创建分享链接 |
GET |
/api/resume/[id]/share |
获取分享设置 |
DELETE |
/api/resume/[id]/share |
取消分享 |
| 方法 | 端点 | 说明 |
|---|---|---|
GET |
/api/share/[token] |
访问公开分享的简历 |
| 方法 | 端点 | 说明 |
|---|---|---|
POST |
/api/ai/chat |
流式 AI 对话(带简历上下文) |
GET |
/api/ai/chat/sessions |
获取简历的对话会话列表 |
POST |
/api/ai/chat/sessions |
创建新对话会话 |
GET |
/api/ai/chat/sessions/[id] |
获取会话的分页消息 |
DELETE |
/api/ai/chat/sessions/[id] |
删除对话会话 |
POST |
/api/ai/generate-resume |
AI 生成简历 |
POST |
/api/ai/jd-analysis |
JD 匹配分析 |
POST |
/api/ai/grammar-check |
语法与写作检查 |
POST |
/api/ai/cover-letter |
生成求职信 |
POST |
/api/ai/translate |
翻译简历内容 |
GET |
/api/ai/models |
获取可用 AI 模型列表 |
| 方法 | 端点 | 说明 |
|---|---|---|
GET |
/api/user |
获取当前用户信息 |
PUT |
/api/user |
更新用户信息 |
GET |
/api/user/settings |
获取用户设置 |
PUT |
/api/user/settings |
更新用户设置 |
欢迎贡献代码!请按照以下步骤:
- Fork 本仓库
- 创建功能分支:
git checkout -b feat/your-feature - 提交更改:
git commit -m 'feat: add your feature' - 推送分支:
git push origin feat/your-feature - 提交 Pull Request
AI 配置是如何工作的?
JadeAI 不需要在服务端配置 AI API 密钥。每位用户在应用内的 设置 > AI 中自行配置 AI 供应商(OpenAI、Anthropic 或自定义端点)、API Key 和模型。API 密钥仅存储在浏览器的 localStorage 中,不会发送到服务端存储。
可以在 SQLite 和 PostgreSQL 之间切换吗?
可以。通过 DB_TYPE 环境变量设置为 sqlite 或 postgresql。SQLite 是默认选项,零配置即可使用。使用 PostgreSQL 时需额外设置 DATABASE_URL。注意:数据不会在两种数据库之间自动迁移。
不使用 OAuth 时认证如何工作?
当 AUTH_ENABLED=false(默认)时,JadeAI 使用 FingerprintJS 进行浏览器指纹识别。系统为每个浏览器生成唯一的指纹 ID 作为用户标识。无需登录界面 — 用户可以直接开始创建简历。
PDF 导出是如何实现的?
PDF 导出使用 Puppeteer Core + @sparticuz/chromium。50 套模板各有独立的服务端导出处理器,将简历渲染为高保真 PDF。同时支持 DOCX、HTML、TXT 和 JSON 格式导出。


















