ARTICLE · 1213713
别再海投了:5 万星 AI 求职助手,一条命令定制简历
去年底,作者 Mads 被公司裁员。他是地球物理学家出身,转行 AI 之后不想再靠手搓简历海投,于是写了一套跑在自己机器上的求职工作流,每周雷打不动地跑:搜岗位、打分、定制简历、写求职信、模拟面试。
结果:69 份定制申请,20 个一面,2026 年 6 月签约 AI 工程师。他把这套流程开源了出来,10 月 18 日还单日涨了 1300 多星,现在 5.3 万星、1.7 万 fork,MIT 协议。
一句话讲清:这是一个基于 Claude Code 的 AI 求职框架,fork 到你自己仓库,填好个人档案,之后每投一个岗位都是一条命令的事——评估匹配度、定制简历、写求职信、准备面试,全流程本地跑。
MadsLorentzen/ai-job-search
它和"AI 简历生成器"的根本区别
市面上的简历工具大多是"一次性生成器":你粘 JD,它吐一份简历,完事。这个项目是"工作流":
- /setup 建档
:三种方式录入你的经历——扔一堆文档进 documents/文件夹让它交叉读取、直接粘一份简历、或者跟它面谈一轮。产出是完整的候选人档案:教育、经历、技能、行为画像、STAR 案例库。 - /scrape 搜岗
:按你的档案去招聘站抓匹配的岗位,去重后按匹配度排序呈现。 - /apply 一条命令开投
:先评估匹配度并问你要不要继续,然后起草简历和求职信(LaTeX 排版),再派第二个 agent 当评审员挑刺,修改后交给你终审。 - /interview 备战
:按面试轮次准备,拿你真实投过的材料(HR 实际看到的那份简历和求职信)做题库,缺的经验给"诚实版衔接话术",不编造经历。 - /outcome 复盘
:记录每次投递的结果,10 天没动静的申请会提醒你跟进——只起草跟进信,不替你发送。
注意一个关键设计:起草和评审是两个独立的 agent。自己写完自己审,等于没审。
动手前:四样东西缺一不可
lualatex 编译,求职信用 xelatex(模板里的 cover.cls 依赖 fontspec,必须用 xelatex)。TinyTeX 这类精简版要按 SETUP.md 补装 moderncv、fontawesome5 等十几个包 |
四步跑起来
第一步,克隆仓库。注意:别直接 fork——原因下一节细讲,用私有仓库方案。
第二步,装岗位搜索工具,一条命令:
python3 tools/install_portal_clis.py它会自动发现 .agents/skills 下所有 portal CLI 并逐个装依赖。
第三步,进 Claude Code 跑 /setup,按提示把档案建起来。档案越深,后面所有产出越准——README 里专门有一节叫"Profile depth matters",不是客套话。
第四步,/scrape 搜岗,挑中意的直接 /apply,后面跟岗位链接就行;链接抓不到的网站,直接把 JD 全文粘进去也行:
/apply https://jobindex.dk/job/1234567编译产出的简历和求职信:
cd cv && lualatex main_公司_岗位.tex && cd ..cd cover_letters && xelatex cover_公司_岗位.tex && cd ..国内用户必看的三条
第一,默认岗位库是丹麦的。内置的四个岗位搜索技能对接的是 Jobindex、Jobnet 这些丹麦招聘站。跨国通用的是 linkedin-search 和 freehire-search 两个技能。想接国内招聘站,用 /add-portal 自己搭——它会按同一套 CLI 结构生成脚手架并实测一条真实查询;或者去社区 fork 里"借"别人写好的。
第二,别直接 fork 公开仓库。GitHub 的 fork 永远是公开的,而 /setup 会把你的姓名、电话、工作经历、薪资期望写进被 git 追踪的文件里。正确姿势:建私有仓库,把原仓库设为 upstream(SETUP.md 第 8 节有两分钟配方)。另外 gh repo fork --clone 之后,一定要跑 gh repo set-default 指向你自己的仓库,否则以后 gh issue create 会静默发到上游的公开 Issue 区——Issue #389 里有人已经中过招。
第三,LaTeX 编译有两个坑。简历必须用 lualatex(pdflatex 在新版 MiKTeX 上会报 fontawesome5 字体展开错误);求职信必须用 xelatex。Windows 用户记得把 MiKTeX 的"缺包弹窗安装"改成静默自动安装,不然 Claude Code 的终端会被 GUI 弹窗卡住:
initexmf --admin --set-config-value=[MPM]AutoInstall=1initexmf --set-config-value=[MPM]AutoInstall=1Issue 区正在吵的三个真问题
搜索词进了 portal CLI 就失灵(#536)。search-queries.md 里配好的搜索语句,原样丢给 portal CLI 可能不生效——两边的查询语法不是一套。搜不到预期岗位时,先检查这一层。
freehire-search 的 --region us 返回空(#616)。文档里写着支持 us,实际跑出来是空集。跨国技能也有水土不服,用之前先实测一条。
Windows 下 PDF 校验被跳过(#655)。verify_layout.py 取 PATH 里第一个 pdftotext,Windows 上 Git 自带的 xpdf 会截胡,导致 ATS 可解析性检查静默跳过。/apply 里的 ATS 检查(用 pypdf 或 pdftotext 读 PDF 文字层,模拟招聘系统视角验联系方式、阅读顺序和关键词覆盖)是防"排版很好看、机器读不懂"的关键一步,装完先确认它真的在跑。
跑顺之后,这几个命令值得开
- /rank
: /scrape抓回来一堆岗位没精力细看时,批量打分排序,deal-breaker 直接否决,过期岗位标出来。 - /upskill
:分析你的档案和已搜岗位之间的技能差距,输出差距热力图和带时间估算的学习计划——求职间隙做职业规划用。 - /html-report
:从投递记录生成离线看板,纯本地 HTML,双击即开。 - /gmail-sync
和 /notion-sync:前者读 Gmail 抓面试邀约、拒信等状态信号,每条变更先列出来等你批准再写;后者把 pipeline 同步到 Notion 看板。注意 #597 提过,过期岗位在 Notion 上不会自动标 expired,得手动处理。
最后一句大实话
这个工具解决的是"定制"的体力活,不解决"你是谁"的问题。作者 69 投 20 面的漏斗,背后是每周雷打不动地跑流程,外加一份足够深的个人档案。简历工具最大的谎言是"一键",最大的实话是:档案越深,产出越准。
另外提醒一句:SECURITY.md 里写明,岗位描述被视为不可信输入——工作流不会执行 JD 里藏的指令,也不会去抓 JD 正文里的链接。让 agent 替你投简历之前,先确认它只听你的,不听 JD 的。















































































