JOBLIFE
面向求职的 Typst PDF 自动化
学习目标
到本节课结束,学员应当能够:
- 通过 Claude Code 调用 Typst skill,把 Neon 里结构化的 profile 数据转成一份像素级精致、可下载的 PDF —— 一行 Typst 都不用自己写。
- 让 Neon
profile成为一个数据源,驱动两种产物 —— 作品集站和简历 / 求职信 PDF —— 证明 数据在前、文档在后 是一种资深工程师的习惯。 - 在线上作品集上交付两个按钮:一键 "Download CV",以及 "Generate cover letter for [job description]" —— 按需产生定制 PDF。
核心主题
- 一句话说 Typst:像"带超能力的 Markdown,能编译成 PDF"。这堂课的讲义就是用它编出来的。
- Claude Code 里的 Skills —— Typst skill 是一个开源 skill,我们在阶段 2 自己装上(Claude Code 不会 自动发现 skill)。装好之后,它就会教 Claude Code 如何从结构化输入生成常见文档。
- 数据驱动的文档:为什么把 CV 字段存在 Neon(而不是 Google Docs)能让它被 AI 编辑一辈子。
- 求职信是 LLM 的完美任务:结构化输入(你的 profile + JD)+ 结构化输出(格式化的 PDF)。
- Meta 时刻:学员意识到这节讲义和他们的简历是同一种工具做出来的。
工具 / 技术栈
| 工具 | 本周角色 |
|---|---|
| Typst CLI | 把 .typ 文件编译成 PDF —— 快且确定。 |
| Typst skill(Claude Code) | AI 写 .typ 模板并驱动编译。 |
| Neon Postgres + Drizzle | 你 profile 行的存放地:一个数据 源。 |
| Claude API(可选) | 根据 JD 生成定制求职信文本。 |
| Vercel serverless function | 按需跑 Typst 编译并流式返回 PDF。 |
课堂计划
| 时间 | 活动 |
|---|---|
| 0 – 15 分钟 | 回顾与 Check-in。 这周谁从班级以外的人收到了联系表单提交?(通常至少会有一条。) |
| 15 – 40 分钟 | 概念讲解。 为什么对"生成式文档"来说,Typst 比 Word / Pages / Docs 都好。为什么你的 CV 应该住在 Postgres 里。Typst skill 如何工作——你描述、它写 .typ、CLI 渲染、你验证。一个好的"求职信 system prompt"长什么样。 |
| 40 – 75 分钟 | 现场演示。 讲师通过 Claude Code 实时从自己 Neon profile 行生成 CV。然后喂一段假 JD,看着一份定制求职信在 15 秒内出现。 |
| 75 – 105 分钟 | 动手 Lab。 学员用自己的数据做同样的事。福利:定制求职信这个按钮会永远留在他们站点上,每一次真实求职都能用。 |
| 105 – 120 分钟 | Q&A + 收尾。 每位学员展示生成的 CV。友好互评一轮。 |
动手 Lab
任务。 下课时你的作品集多出两个按钮:Download CV(按 Neon profile 生成一份打磨过的一页 CV)和 Generate cover letter(粘一段 JD,拿一份定制 PDF)。两者都通过 Typst skill 编译。
阶段 1 —— 设计 profile 数据模型
PROMPTStep 1 · Say to Cursor:
在 Neon 里加一张
profile表,它将作为我 CV 数据的唯一真实数据源。帮我设计 Drizzle schema。每个用户一行 profile——也就是我会是唯一那个有数据的 row,但未来的多用户版本要支持更多。包含:
user_id(外键 → users.id,unique)—— 和 user 一对一headline(text,一行,如 "CS undergrad building AI agents")summary(text,3–5 句)phone(可空)、location_city、location_country、website、github、education(JSON:{school, degree, start, end, notes}数组)experience(JSON:{org, role, start, end, highlights: []}数组)projects(JSON:{name, url, one_liner, stack: []}数组)skills(JSON:字符串数组)updated_at(timestamp 自动更新)生成并 push 迁移。再在站点上加一个 admin-only 的
/edit-profile页,让我能用 textarea 或 JSON 编辑器改每个字段。只有登录后的我能访问这页。
VERIFYStep 2 · Verify:
- 迁移已应用;
profile表存在。 - 以我登录状态访问 localhost
/edit-profile能看到编辑器。 - 未登录 —— 或以别的用户登录 —— 重定向回首页。