base on free online AI resume editor <div align="center">
# ✨ Magic Resume ✨
[](https://opensource.org/licenses/Apache-2.0)


简体中文 | [English](./README.en-US.md)
</div>
Magic Resume 是一个现代化的在线简历编辑器,让创建专业简历变得简单有趣。基于 Next.js 和 Motion 构建,支持实时预览和自定义主题。
## 📸 项目截图

## ✨ 特性
- 🚀 基于 Next.js 14+ 构建
- 💫 流畅的动画效果 (Motion)
- 🎨 自定义主题支持
- 🌙 深色模式
- 📤 导出为 PDF
- 🔄 实时预览
- 💾 自动保存
- 🔒 硬盘级存储
## 🛠️ 技术栈
- Next.js 14+
- TypeScript
- Motion
- Tiptap
- Tailwind CSS
- Zustand
- Shadcn/ui
- Lucide Icons
## 🚀 快速开始
1. 克隆项目
```bash
git clone
[email protected]:JOYCEQL/magic-resume.git
cd magic-resume
```
2. 安装依赖
```bash
pnpm install
```
3. 启动开发服务器
```bash
pnpm dev
```
4. 打开浏览器访问 `http://localhost:3000`
## 📦 构建打包
```bash
pnpm build
```
## ⚡ Vercel 部署
你可以一键部署自己的 Magic Resume 实例:
[](https://vercel.com/new/clone?repository-url=https%3A%2F%2Fgithub.com%2FJOYCEQL%2Fmagic-resume)
## 🐳 Docker 部署
### Docker Compose
1. 确保你已经安装了 Docker 和 Docker Compose
2. 在项目根目录运行:
```bash
docker compose up -d
```
这将会:
- 自动构建应用镜像
- 在后台启动容器
### Docker Hub
最新版本的 Magic Resume 已经发布在 Docker Hub:
[Docker Hub](https://hub.docker.com/r/siyueqingchen/magic-resume/)
```bash
docker pull siyueqingchen/magic-resume:main
```
## 📝 开源协议
本项目采用 Apache 2.0 协议,但有一些自定义的部分 - 查看 [LICENSE](LICENSE) 了解详情
## 🗺️ 路线图
- [x] AI 辅助编写
- [x] 多语言支持
- [ ] 支持更多简历模板
- [ ] 更多格式导出
- [ ] 自定义模型
- [ ] 智能一页
- [ ] 导入 PDF, Markdown 等
- [ ] 在线简历托管
## 📞 联系方式
可以通过以下方式关注最新动态:
- 作者:SiYue
- X: @GuangzhouY81070
- Discord: 欢迎加入群组 https://discord.gg/9mWgZrW3VN
- 用户群:加微信 qingchensiyue
- 邮箱:
[email protected]
- 项目主页:https://github.com/JOYCEQL/magic-resume
## 🌟 支持项目
如果这个项目对你有帮助,欢迎点个 star ⭐️
", Assign "at most 3 tags" to the expected json: {"id":"13077","tags":[]} "only from the tags list I provide: [{"id":77,"name":"3d"},{"id":89,"name":"agent"},{"id":17,"name":"ai"},{"id":54,"name":"algorithm"},{"id":24,"name":"api"},{"id":44,"name":"authentication"},{"id":3,"name":"aws"},{"id":27,"name":"backend"},{"id":60,"name":"benchmark"},{"id":72,"name":"best-practices"},{"id":39,"name":"bitcoin"},{"id":37,"name":"blockchain"},{"id":1,"name":"blog"},{"id":45,"name":"bundler"},{"id":58,"name":"cache"},{"id":21,"name":"chat"},{"id":49,"name":"cicd"},{"id":4,"name":"cli"},{"id":64,"name":"cloud-native"},{"id":48,"name":"cms"},{"id":61,"name":"compiler"},{"id":68,"name":"containerization"},{"id":92,"name":"crm"},{"id":34,"name":"data"},{"id":47,"name":"database"},{"id":8,"name":"declarative-gui "},{"id":9,"name":"deploy-tool"},{"id":53,"name":"desktop-app"},{"id":6,"name":"dev-exp-lib"},{"id":59,"name":"dev-tool"},{"id":13,"name":"ecommerce"},{"id":26,"name":"editor"},{"id":66,"name":"emulator"},{"id":62,"name":"filesystem"},{"id":80,"name":"finance"},{"id":15,"name":"firmware"},{"id":73,"name":"for-fun"},{"id":2,"name":"framework"},{"id":11,"name":"frontend"},{"id":22,"name":"game"},{"id":81,"name":"game-engine "},{"id":23,"name":"graphql"},{"id":84,"name":"gui"},{"id":91,"name":"http"},{"id":5,"name":"http-client"},{"id":51,"name":"iac"},{"id":30,"name":"ide"},{"id":78,"name":"iot"},{"id":40,"name":"json"},{"id":83,"name":"julian"},{"id":38,"name":"k8s"},{"id":31,"name":"language"},{"id":10,"name":"learning-resource"},{"id":33,"name":"lib"},{"id":41,"name":"linter"},{"id":28,"name":"lms"},{"id":16,"name":"logging"},{"id":76,"name":"low-code"},{"id":90,"name":"message-queue"},{"id":42,"name":"mobile-app"},{"id":18,"name":"monitoring"},{"id":36,"name":"networking"},{"id":7,"name":"node-version"},{"id":55,"name":"nosql"},{"id":57,"name":"observability"},{"id":46,"name":"orm"},{"id":52,"name":"os"},{"id":14,"name":"parser"},{"id":74,"name":"react"},{"id":82,"name":"real-time"},{"id":56,"name":"robot"},{"id":65,"name":"runtime"},{"id":32,"name":"sdk"},{"id":71,"name":"search"},{"id":63,"name":"secrets"},{"id":25,"name":"security"},{"id":85,"name":"server"},{"id":86,"name":"serverless"},{"id":70,"name":"storage"},{"id":75,"name":"system-design"},{"id":79,"name":"terminal"},{"id":29,"name":"testing"},{"id":12,"name":"ui"},{"id":50,"name":"ux"},{"id":88,"name":"video"},{"id":20,"name":"web-app"},{"id":35,"name":"web-server"},{"id":43,"name":"webassembly"},{"id":69,"name":"workflow"},{"id":87,"name":"yaml"}]" returns me the "expected json"