- 负责 Chrome MV3 Side Panel 架构、浏览器集成、草稿状态生命周期、页面上下文获取、跨页面状态处理与回归测试。
- Chrome MV3 · Local-first · LLM · Python
- 2059 项测试通过
问题
Overview
一个 Local-first 的 AI 工作流:结合简历与实时岗位 JD,生成可直接使用的求职草稿。
Context
大多数 AI 求职辅助发生在独立的聊天窗口里:岗位在一个标签页,简历在另一个文件,模型又在别处。
JobMate 把助手放到岗位页面旁边,用户需要时,上下文已经就位。
Problem
用通用聊天助手处理求职,需要不断切换上下文:每个岗位都要复制 JD、粘贴结果、再手动修改。
每次往返都会丢失上下文,简历也要一次次粘贴进云端聊天。
- Job platform
- Copy JD
- ChatGPT
- Copy result
- Back to platform
- Edit
My Role
负责 Chrome MV3 Side Panel 架构、浏览器集成、草稿状态生命周期、页面上下文获取、跨页面状态处理与回归测试。
Chrome MV3 side-panel architecture, browser integration, draft-state lifecycle, page context capture, cross-page state handling and regression testing.
构建
Solution
一个 Chrome MV3 原生侧边栏,始终停靠在岗位页面旁。它读取当前岗位 JD,结合本地管理的简历生成求职草稿——例如给招聘方的打招呼消息。
JobMate 在浏览器工作流中生成并保存草稿,由用户查看、修改,并最终决定是否在招聘平台发送。
功能
- 01Chrome MV3 原生侧边栏
- 02读取当前招聘页面 JD
- 03本地简历管理
- 04简历 × JD 上下文组装
- 05AI 招呼语生成
- 06草稿生命周期管理
- 07草稿查看与复制
- 08页面切换状态保持
- 09Local-first 隐私
Architecture
- Job Page
- JD ReaderLocal Resume
- Context Assembly
- LLM
- Draft State
- User Review
侧边栏是唯一的界面入口。它在切换标签页和页面时保持存在,用户浏览其他岗位时,进行中的草稿不会丢失。
上下文由当前 JD 与本地管理的简历按请求组装,而不是作为持久化的聊天记录来维护。
- Job Page
- JD + Resume本地
- LLM
- Draft
- User Review
- 02› 读取当前岗位 JD,结合本地简历组装上下文
- 03› 生成打招呼草稿
- 04› 草稿已保存,切换页面也不会丢失
- 05… 等待用户查看、修改,由用户决定是否发送
Job Page
打开招聘页面,侧边栏停靠在旁边
JD + Resume本地
读取当前岗位 JD,结合本地简历组装上下文
LLM
生成打招呼草稿
Draft
草稿已保存,切换页面也不会丢失
User Review
等待用户查看、修改,由用户决定是否发送
Key Decisions
- 01
用侧边栏,而不是弹出窗口Native side panel, not a popup
弹出窗口在焦点移开时就会关闭。MV3 侧边栏始终停靠在页面旁,也就是用户实际工作的地方。
- 02
默认 Local-firstLocal-first by default
完整简历属于个人数据,保留在用户本机,而不是成为持久化的云端记录。
- 03
草稿是状态,不是聊天Drafts as state, not as chat
每份草稿都有生命周期。用户切换页面后可以回到草稿,而不必翻找聊天记录。
- 04
人始终在环中Human stays in the loop
JobMate 负责准备草稿;查看、修改和发送始终由用户在招聘平台上掌控。
工程
Engineering
- Python + Chrome MV3 扩展。
- 使用 pytest 测试,ruff 做代码检查。
- 页面切换状态处理与草稿生命周期均有测试覆盖,不只是正常路径。
Privacy
简历在本地管理,JobMate 避免将完整简历作为云端持久数据保存。
每次生成请求只从当前 JD 和本地管理的简历中组装所需的上下文,再交给模型。
Results
- 项测试通过 · pytest
- 2059
完成可运行的侧边栏流程:从读取当前 JD,到生成并保存草稿、由用户在浏览器中查看。
笔记
What I Learned
AI 产品最难的部分很少是 Prompt,而是状态:什么在页面切换后保留,什么是草稿,什么是最终结果。
隐私是架构决策,必须在写第一行存储代码之前做出,而不是事后补上。
Tech Stack
- Chrome MV3
- Browser Extension
- Python
- LLM
- Local-first
- pytest
- ruff