JadeAI
AI-Powered Smart Resume Builder — 50+ professional templates, PDF/image parsing, AI optimization, JD match analysis, multi-format export. Open source & free, one-click Docker deployment.
# JadeAI
**AI-Powered Smart Resume Builder**
Build professional resumes with drag-and-drop editing, real-time AI optimization, 50 templates, and multi-format export.
[](LICENSE)
[](https://nextjs.org/)
[](https://react.dev/)
[](https://www.typescriptlang.org/)
[](https://hub.docker.com/r/twwch/jadeai)
[中文文档](./README.zh-CN.md)
---
## Screenshots
| Template Gallery | Resume Editor |
|:---:|:---:|
|  |  |
| AI Resume Generation | AI Resume Parsing (Image) |
|:---:|:---:|
|  |  |
| AI Optimization | Grammar Check |
|:---:|:---:|
|  |  |
| Grammar Auto-Fix | JD Match Analysis |
|:---:|:---:|
|  |  |
| Multi-Format Export | Share Link |
|:---:|:---:|
|  |  |
| Shared Resume Page |
|:---:|
|  |
## Features
### Resume Editing
- **Drag & Drop Editor** — Visually arrange and reorder resume sections and items
- **Inline Editing** — Click any field to edit directly on the canvas
- **50 Professional Templates** — Classic, Modern, Minimal, Creative, ATS-Friendly, Timeline, Nordic, Swiss, and more
- **Theme Customization** — Colors, fonts, spacing, and margins with live preview
- **Undo / Redo** — Full edit history (up to 50 steps)
- **Auto Save** — Configurable interval (0.3s–5s), with manual save option
### AI Capabilities
- **AI Chat Assistant** — Conversational AI integrated in the editor, with multi-session support and persistent history
- **AI Resume Generation** — Generate a complete resume from job title, experience, and skills
- **Resume Parsing** — Upload an existing PDF or image, AI extracts all content automatically
- **JD Match Analysis** — Compare resume against a job description: keyword matching, ATS score, and improvement suggestions
- **Cover Letter Generation** — AI-tailored cover letter based on resume and JD, with tone selection (formal / friendly / confident)
- **Grammar & Writing Check** — Detect weak verbs, vague descriptions, and grammar issues; returns a quality score
- **Translation** — Translate resume content across 10 languages while preserving technical terms
- **Flexible AI Provider** — Supports OpenAI, Anthropic, and custom API endpoints; each user configures their own key in-app
### Export & Sharing
- **Multi-Format Export** — PDF (Puppeteer + Chromium), Smart One-Page PDF (auto-fit to single page), DOCX, HTML, TXT, JSON
- **JSON Import** — Import a previously exported JSON file to restore or create a resume; supported both in the editor (overwrite current) and on the dashboard (create new)
- **Link Sharing** — Token-based shareable links with optional password protection
- **View Counter** — Track how many times a shared resume has been viewed
### Management
- **Multi-Resume Dashboard** — Grid and list views, search, sort (by date, name)
- **Import from JSON** — Create a new resume from a JSON export directly on the dashboard
- **Duplicate & Rename** — Quick resume management actions
- **Interactive Tours** — Step-by-step onboarding for first-time users
### Other
- **Bilingual UI** — Full Chinese (zh) and English (en) interface
- **Dark Mode** — Light, dark, and system theme support
- **Flexible Auth** — Google OAuth or browser fingerprint (zero-config)
- **Dual Database** — SQLite (default, zero-config) or PostgreSQL
## Tech Stack
| Layer | Technology |
|-------|-----------|
| Framework | Next.js 16 (App Router, Turbopack) |
| UI | React 19, Tailwind CSS 4, shadcn/ui, Radix UI |
| Drag & Drop | @dnd-kit |
| State | Zustand |
| Database | Drizzle ORM (SQLite / PostgreSQL) |
| Auth | NextAuth.js v5 + FingerprintJS |
| AI | Vercel AI SDK v6 + OpenAI / Anthropic |
| PDF | Puppeteer Core + @sparticuz/chromium |
| i18n | next-intl |
| Validation | Zod v4 |
## Getting Started
### Docker (Recommended)
```bash
# Generate a secret key first
openssl rand -base64 32
docker run -d -p 3000:3000 \
-e AUTH_SECRET= \
-v jadeai-data:/app/data \
twwch/jadeai:latest
```
Open [http://localhost:3000](http://localhost:3000). Database auto-migrates and seeds on first start.
> **`AUTH_SECRET`** is required for session encryption. Generate one with `openssl rand -base64 32`.
> **AI Configuration:** No server-side AI env vars needed. Each user configures their own API Key, Base URL, and Model in **Settings > AI** within the app.
With PostgreSQL
```bash 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 ```With Google OAuth
```bash docker run -d -p 3000:3000 \ -e NEXT_PUBLIC_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 ```View all 50 templates
| # | Template | # | Template | # | Template | |---|----------|---|----------|---|----------| | 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 | | |View all API endpoints
### Resume | Method | Endpoint | Description | |--------|----------|-------------| | `GET` | `/api/resume` | List all resumes for current user | | `POST` | `/api/resume` | Create a new resume | | `GET` | `/api/resume/[id]` | Get resume detail with all sections | | `PUT` | `/api/resume/[id]` | Update resume metadata or sections | | `DELETE` | `/api/resume/[id]` | Delete a resume | | `POST` | `/api/resume/[id]/duplicate` | Duplicate a resume | | `GET` | `/api/resume/[id]/export` | Export resume (pdf, docx, html, txt, json) | | `POST` | `/api/resume/parse` | Parse resume from PDF or image upload | | `POST` | `/api/resume/[id]/share` | Create share link | | `GET` | `/api/resume/[id]/share` | Get share settings | | `DELETE` | `/api/resume/[id]/share` | Remove share link | ### Share | Method | Endpoint | Description | |--------|----------|-------------| | `GET` | `/api/share/[token]` | Access a publicly shared resume | ### AI | Method | Endpoint | Description | |--------|----------|-------------| | `POST` | `/api/ai/chat` | Stream chat messages with resume context | | `GET` | `/api/ai/chat/sessions` | List chat sessions for a resume | | `POST` | `/api/ai/chat/sessions` | Create a new chat session | | `GET` | `/api/ai/chat/sessions/[id]` | Get paginated messages for a session | | `DELETE` | `/api/ai/chat/sessions/[id]` | Delete a chat session | | `POST` | `/api/ai/generate-resume` | Generate resume from job title & experience | | `POST` | `/api/ai/jd-analysis` | Analyze resume against a job description | | `POST` | `/api/ai/grammar-check` | Check grammar and writing quality | | `POST` | `/api/ai/cover-letter` | Generate a tailored cover letter | | `POST` | `/api/ai/translate` | Translate resume content | | `GET` | `/api/ai/models` | List available AI models | ### User | Method | Endpoint | Description | |--------|----------|-------------| | `GET` | `/api/user` | Get current user profile | | `PUT` | `/api/user` | Update user profile | | `GET` | `/api/user/settings` | Get user settings | | `PUT` | `/api/user/settings` | Update user settings |
|
|
## FAQ
How does AI configuration work?
JadeAI does not require server-side AI API keys. Each user configures their own AI provider (OpenAI, Anthropic, or custom endpoint), API key, and model in **Settings > AI** within the app. API keys are stored in the browser's local storage and are never sent to the server for storage.Can I switch between SQLite and PostgreSQL?
Yes. Set the `DB_TYPE` environment variable to `sqlite` or `postgresql`. SQLite is the default and requires zero configuration. For PostgreSQL, also set `DATABASE_URL`. Note that data is not automatically migrated between database types.How does authentication work without OAuth?
When `NEXT_PUBLIC_AUTH_ENABLED=false` (default), JadeAI uses browser fingerprinting via FingerprintJS. A unique fingerprint ID is generated for each browser and used as the user identifier. No login screen is shown — users can start building resumes immediately.How is PDF export implemented?
PDF export uses Puppeteer Core with @sparticuz/chromium. Each of the 50 templates has a dedicated server-side export handler that renders the resume to high-fidelity PDF. DOCX, HTML, TXT, and JSON exports are also supported.Classified in
Comments, support and feedback
About this launch
JadeAI by chenhao Will be launched December 14th 2027.




