SNDP-Design/ZeeApply
GitHub: SNDP-Design/ZeeApply
ZeeApply 是一个AI驱动的设计师求职助手,通过自动化职位聚合和评分来简化求职流程。
Stars: 0 | Forks: 0
# ZeeApply
你的私人、设计师专属、AI驱动的求职助手——以 [XGrowth](https://www.xgrowth.uno) 为蓝本构建:静态前端托管在 GitHub Pages,无服务器后端运行在 Cloudflare Workers,永久免费,始终在线,无需月度注册。
**架构**
```
┌──────────────────────────┐ ┌──────────────────────────┐
│ GitHub Pages (static) │ │ Cloudflare Worker (JS) │
│ │ │ │
│ / landing │ │ /fetch-jobs sources │
│ /app/ the app │ ───▶ │ /score Gemini │
│ │ │ /cover-letter Gemini │
│ Firebase Auth + store │ │ │
└──────────────────────────┘ └──────────────────────────┘
│ │
▼ ▼
Per-user Firestore Public job APIs +
(your profile, jobs, Google Gemini
cover letters) (with 4-model fallback)
```
**功能说明**
1. **聚合** 来自 8 个免费公开来源的设计师职位:Greenhouse(15+ 家公司)、Lever(Palantir, Mistral)、RemoteOK、Remotive、Arbeitnow、Jobicy、WeWorkRemotely(设计类 RSS)、Working Nomads。
2. 在信息触达你的存储之前,**过滤**出符合你目标职位头衔(如 `ui designer`, `product designer` 等)的结果。
3. 当你身处美国境外时,**自动排除**仅限美国的职位(涉及公民身份、安全许可、ITAR、无赞助说明等)。
4. 使用 Gemini **评分**每个职位(0-100分),并对照你的简历生成一句“原因”说明。
5. 为高分职位按需**起草**定制的180字求职信。
6. 通过你私有的 Firestore 数据库**追踪**每个职位的完整状态:`新建 → 感兴趣 → 已投递 / 已跳过`。
**隐私:** 你的简历和求职流水线存储在你 Google 账户下的 Firestore 中,不使用共享数据库。简历仅在触发评分调用时离开浏览器(通过 Worker 发送至 Gemini,且不存储)。
**成本:** 0美元/月。GitHub Pages + Cloudflare Workers + Firebase Spark + Gemini 免费层组合,足以应对每天数千个职位的处理量。
## 本地开发
```
# 后端(Cloudflare Worker)— 终端 1
cd worker
npm install
npx wrangler dev --port 8787 --local
# 前端 — 终端 2
cd ..
python3 -m http.server 8000
# 打开 http://localhost:8000
```
应用会自动检测 `localhost` 并指向本地 Worker(`http://127.0.0.1:8787`)。要使本地评分和求职信生成功能正常工作,请设置密钥:
```
cd worker
npx wrangler secret put GEMINI_API_KEY # paste your AIza... key
```
在 https://aistudio.google.com/apikey 获取免费的 Gemini 密钥。
## 部署(一次性,约25分钟)
### 1. Firebase 项目(约10分钟)
1. 打开 https://console.firebase.google.com → **添加项目** → 命名为 `zeeapply`(或其他名称)。为简化操作,可禁用 Google Analytics。
2. 左侧边栏 → **Authentication** → **开始使用** → 启用 **Google** 作为登录提供方。
3. 左侧边栏 → **Firestore Database** → **创建数据库** → 选择 **生产模式** 开始 → 选择一个靠近你的区域。
4. Firestore → **规则** → 粘贴以下内容并 **发布**:
```
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
// 父级用户文档(个人资料)
match /users/{userId} {
allow read, write: if request.auth != null && request.auth.uid == userId;
}
// 所有子集合(职位等)
match /users/{userId}/{document=**} {
allow read, write: if request.auth != null && request.auth.uid == userId;
}
}
}
```
这确保每个用户的数据——包括父级个人资料文档及所有子集合文档——仅对自身可访问。
5. **项目设置**(齿轮图标)→ 滚动到 **你的应用** → 点击 `>` 网页 → 注册应用(名称:`ZeeApply`)。
6. 复制 Firebase 显示的 `firebaseConfig` 对象。
7. 打开 `app/index.html`,在底部附近找到 `const firebaseConfig = { … }` 代码块,粘贴你的值。
8. 项目设置 → **授权域名** → 添加 `sndp-design.github.io`(或你的自定义域名),以便 Google 登录在生产环境中正常工作。
### 2. Cloudflare Worker(约5分钟)
```
cd worker
npx wrangler login # opens browser; sign in / sign up with Cloudflare (free)
npx wrangler secret put GEMINI_API_KEY # paste your Gemini key
npx wrangler deploy
```
Wrangler 会输出 Worker URL —— 格式类似 `https://zeeapply-api..workers.dev`。复制它。
### 3. 将前端连接到生产 Worker
打开 `app/index.html`,找到:
```
const API_BASE = (location.hostname === 'localhost' || …)
? 'http://127.0.0.1:8787'
: 'https://zeeapply-api.YOUR_SUBDOMAIN.workers.dev';
```
将 `YOUR_SUBDOMAIN` 替换为 Wrangler 提供的值。
同时打开 `worker/src/index.js`,找到 `ALLOWED_ORIGINS`,确认你的 GitHub Pages 域名(`https://sndp-design.github.io`)已在列表中。如果你指向了自定义域名,也请在此添加。编辑后重新部署:`npx wrangler deploy`。
### 4. GitHub Pages(约5分钟)
```
git add -A && git commit -m "Wire prod Firebase + Worker URLs" && git push
```
然后在 GitHub 上:**Settings → Pages → Source: `main` branch / `/` root → Save**。
约1分钟后,你的应用将上线:
- 首页:`https://sndp-design.github.io/ZeeApply/`
- 应用:`https://sndp-design.github.io/ZeeApply/app/`
**(可选)自定义域名:** 在仓库根目录放置一个 `CNAME` 文件,写入你的域名(例如 `zeeapply.uno`),并将 DNS 配置指向 `sndp-design.github.io`。然后将相同域名添加到 Firebase 的授权域名和 Worker 的 `ALLOWED_ORIGINS` 中。
## 文件布局
```
ZeeApply/
├── index.html ← landing page (GitHub Pages serves this at /)
├── app/index.html ← the actual webapp (auth + UI + Firestore + API calls)
├── worker/
│ ├── src/index.js ← Cloudflare Worker: job sources + Gemini proxy
│ ├── wrangler.toml ← Cloudflare config
│ └── package.json
├── assets/ ← logos / images (optional)
├── .nojekyll ← tells GitHub Pages "don't run Jekyll"
└── README.md
```
就是这样。无需构建步骤。编辑、推送、刷新即可。
## Gemini 后备链
`worker/src/index.js` 按以下顺序尝试模型:
```
gemini-3-flash-preview → gemini-2.5-flash → gemini-2.5-flash-lite → gemini-2.0-flash
```
如果模型返回 429(速率限制)、503(服务器过载)、404(可能因为 `gemini-3-flash-preview` 尚未发布)或 `RESOURCE_EXHAUSTED`,将自动尝试下一个模型。认证错误和格式错误的请求会立即报错。这意味着即使某个模型达到每日配额,评分功能仍可继续工作。
标签:AI评分系统, AI驱动, Firebase, GitHub Pages, 云函数, 人工智能, 免费工具, 后端开发, 工作聚合, 工作跟踪, 工作过滤, 数据可视化, 求职, 求职信生成, 求职平台, 用户模式Hook绕过, 程序员工具, 简历评分, 职业发展, 自动排除, 设计师, 设计师招聘, 远程工作, 静态网站