Lalabase
Tickets, Doku, Zeiterfassung und Kundengespräche an einem Ort, durchsuchbar per KI. Für Softwarefirmen mit Kundenprojekten. Open Source: auf deinem eigenen Server oder in unserer Cloud in Deutschland.
翻译准备中
尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证正在加载完整 README。 以下为已保存的摘录。
公开企业官网岗位雷达看板。自 2026-06-20 起为正式版(此前为内测)。 关于仓库里的数字:docs/、supabase/migrations/ 等处出现的注册用户数、岗位数、公司数,都是文档撰写当天的快照,不随产品更新(仓库没有数据同步机制)。岗位库与官方源的实时数字以线上 /jobs 页为准;用户规模截至 2026-09 为 100 名以上。 目标:每天自动监控一批企业招聘官网,把公开岗位整理进共享岗位库,每个用户按自己的偏好看到不同排序,点击直达官网原始岗位页。 技术栈:Next.js 15 App Router + React 18 + TypeScript + Tailwind;Supabase(Auth / sources / crawl_runs / 用户小表);独立 PostgreSQL 岗位热表;Python crawler(httpx + selectolax,少量 Playwright);GitHub Actions 定时任务;Vercel 部署。 这个产品的第一原则:jd_url 准确性 > 一切。拿不到稳定、可点开、内容对得上的逐岗链接,宁可不收录。 规模从来不是成功指标——详见 CLAUDE.md 的「核心产品原则」。查看完整 README ↗
公开企业官网岗位雷达看板。自 2026-06-20 起为正式版(此前为内测)。
关于仓库里的数字:docs/、supabase/migrations/ 等处出现的注册用户数、岗位数、公司数,都是文档撰写当天的快照,不随产品更新(仓库没有数据同步机制)。岗位库与官方源的实时数字以线上 /jobs 页为准;用户规模截至 2026-09 为 100 名以上。
目标:每天自动监控一批企业招聘官网,把公开岗位整理进共享岗位库,每个用户按自己的偏好看到不同排序,点击直达官网原始岗位页。
技术栈:Next.js 15 App Router + React 18 + TypeScript + Tailwind;Supabase(Auth / sources / crawl_runs / 用户小表);独立 PostgreSQL 岗位热表;Python crawler(httpx + selectolax,少量 Playwright);GitHub Actions 定时任务;Vercel 部署。
这个产品的第一原则:jd_url 准确性 > 一切。拿不到稳定、可点开、内容对得上的逐岗链接,宁可不收录。
规模从来不是成功指标——详见 CLAUDE.md 的「核心产品原则」。
公开企业招聘官网
↓
GitHub Actions 定时 / 手动触发
↓
Python Crawler(httpx + selectolax)
↓
sources / crawl_runs 等 → Supabase Postgres
jobs 岗位热表 → PostgreSQL(JOBS_DATABASE_URL)
↑
Next.js API(岗位搜索 + 公司库刷新 + 官方源发现)
↓
Next.js 看板(Vercel 部署)
↓
用户登录 → 查看岗位 / 收藏 / 忽略 / 标记已投递 / 跳转官网
job-radar-private-beta/
app/ # Next.js App Router 页面与 API
components/ # React 组件
lib/
jobs-store/ # 独立 PostgreSQL 岗位库读写边界
source-adapters.ts # adapter 白名单与录入校验
crawler/
adapters/ # Python 源适配器;以目录实际内容为准
run.py # crawler 主入口
db.py # Supabase 元数据写入
jobs_db.py # jobs PostgreSQL 读写
supabase/migrations/ # Supabase 迁移;明细以目录实际内容为准
jobs-db/schema.sql # 独立 jobs 库 schema
.github/workflows/
migrate.yml # Supabase 迁移自动 apply
jobs-db-migrate.yml # jobs 库 schema apply
daily-crawl.yml # 每日抓取 + 手动触发
Supabase 完整 schema 以 supabase/migrations/ 为准,独立岗位库 schema 以 jobs-db/schema.sql 为准。
| 表 | 用途 | 权限 |
|---|---|---|
| profiles | 用户扩展信息 | 自己读写 |
| sources | 企业招聘源(含 regions 抓取地区,默认 {CN}) | 所有人读,crawler 写 |
| source_candidates | 官方源发现候选 | admin 读,service role 写 |
| jobs | 共享岗位库(独立 PostgreSQL,含 country_code / job_scope) | app / crawler 经 jobs-store 边界读写 |
| user_preferences | 用户偏好(含 job_scope / target_regions 求职范围) | 自己读写 |
| candidate_profiles | 简历档案(含英文侧 en_* 字段) | 自己读写 |
| job_actions | 用户操作(收藏/忽略/投递) | 自己读写 |
| crawl_runs | 抓取日志 | admin 读,crawler 写 |
| discovery_runs | 官方源发现日志 | admin 读,service role 写 |
| ops_runs | 后台任务每日台账(运营看板的每日战报来源) | service role 读写 |
| must_apply_gap_attempts | 必投清单缺口漏斗台账:每家走到哪一步、失败原因、复查日期 | service role 写,admin 读 |
| search_usage / llm_usage | 搜索与 LLM 的每日用量台账(额度硬闸依赖它) | service role 读写 |
| company_profiles / insight_* | 职业洞察层(公司画像、洞察条目、溯源、申诉) | 读有展示门,admin/service 写 |
| events | 自建行为埋点(零分析 SDK);/admin/health 的用户行为漏斗与留存由它派生 | 登录用户只能写自己的,仅 admin 可读 |
adapter 实现覆盖以 crawler/adapters/ 为准,允许录入的 adapter 与抓取方式以 lib/source-adapters.ts 为准;两者必须与 crawler/run.py 的 ADAPTERS 保持一致。当前主力源、质量门和维护优先级见 CLAUDE.md,不要从 README 中维护一份容易漂移的缩略源表。
jobs 搜索、/api/refresh 刷新公司库、保留的旧同步 /api/search 已知源刷新、/api/discovery 官方源发现;四层不可混为一谈。/api/refresh:按用户筛选与偏好选取相关公司源,异步触发 crawler 并轮询进度;/api/search 仅保留为窄范围旧同步 API。/api/discovery,主 provider 是百度千帆 Web Search;默认只调用 1 个 generated query,用户点击“继续发现更多”才调用第 2 个 query。cache_hit。jobs 写入质量门不变:只有 parser 验证过的官方岗位详情页,且 company/title/jd_url 非空、HTTP 200、页面包含标题或核心片段,才写入 jobs。count(status='active')——后者含大量无正文薄卡与未探活的假 active,会把数字虚高好几倍。domestic / overseas / all,默认国内;岗位库和今日机会列表按 job_scope + target_regions 过滤,首页岗位库计数保持国内+海外合并总数。.txt / .md / PDF / Word(.docx) / 图片 上传,都可以生成 candidate profile;英文简历可选写入 en_* 档案,用户确认后可同步 user_preferences,用于 Jobs 排序和海外匹配。除了「抓岗位 → 排序 → 看板」这条主链,下面几块也在线上跑;细节以代码与 CLAUDE.md 为准。
| 模块 | 做什么 | 入口 |
|---|---|---|
| 今日机会 | 按用户画像分层召回 + 打分,每天给一小撮值得看的岗 | /today(/ 是未登录落地页) |
| 岗位库 | 服务端筛选 + 中文 bigram 全文检索;可按公司刷新 | /jobs |
| 校招专区 | 锁定用户行业的目标公司校招岗、届别标签与筛选;配套高频「开闸检测」车道,秋招一开就捞 | /campus |
| 洞察库 | 公司维度的事实/经验洞察(三层供给:自有岗位库派生 / 官方源 / 多源检索经验),带分级、时效与去标识门 | /insights(一级导航)+ 岗位卡片上的公司抽屉 |
| 公告制招聘 | 央企 / 银行这类只发招聘公告、不挂单个岗位的公司,投递入口单独收拢(2026-09-07 由「项目制投递」改名——实际 16 行里 14 行是公告制、项目制 0 行,原名不符事实) | /programs |
| 值得投 / 已投递 | 收藏、忽略、投递进展跟踪,多岗并排对比 | /saved、/applied |
| 个人主页 | 简历画像与求职目标:文本 / .txt / .md / PDF / Word / 图片 → 结构化档案 → 用户确认后同步偏好 | /me(/preferences 保留重定向) |
| 管理员看板 | 五个 tab:总览 / 岗位库 / 必投供给 / 用户行为(自建埋点算出的主漏斗、留存、活跃分布)/ 系统运行 | /admin/health(仅管理员) |
供给侧(用户看不到但决定产品价值):
这个系统会花两类外部额度:搜索(找洞察素材/官方入口)与 LLM(简历结构化、职业洞察)。
两边都有硬闸,改动前先读 CLAUDE.md 的「LLM 成本纪律」与「搜索额度是全局共享的」两节。
检索走 crawler/search_router.py:博查 / Tavily / Serper / 百度千帆,配了哪个 key 就用哪个,没配的自动跳过,
各源日顶记在 search_usage 表(可用 repo Variables 的 *_DAILY_CAP 调整)。默认值按各家免费额度保守设,
绝不一次性用完(Serper 是一次性总额度,烧掉不再回来)。
⚠️ 额度是全局共用一个池子。贪心的消费方必须给别的链留一份,否则会把排在后面的 cron 饿死——
这正是 2026-08 踩过的坑:洞察链一路吃到 0,校招时间线链连续 7 天一家都没处理,却因为不抛异常天天报 success。
现在由 SEARCH_RESERVE_CAMPUS(默认 25)预留,新增吃搜索额度的链请先想清楚自己是「贪心方」还是「被预留方」。
百度千帆免费「百度搜索」是每日 50 次。额度耗尽或未开通付费时设 BAIDU_QIANFAN_SEARCH_DISABLED=true,
系统会直接返回 provider_rate_limited 诊断而不是崩掉;此时不要反复点「发现官方招聘源」,也不要跑多 query live 验证。
Pro/ 前缀(Pro/ 只能扣充值余额,非 Pro 还能吃赠费余额)。max_tokens 撑爆导致 JSON 截断。
换模型前必须 live 验一次输出 token 数。crawler/llm_budget.py(env LLM_DAILY_CAP)。它是成本闸不是安全闸:记账读写失败一律放行,
因为把整条链停摆的代价比多花一轮更大。[llm-usage] model=… tag=… in=… out=…,cron 收尾写进 ops_runs 台账。
别再让花费不可观测——账户欠费过一次都没人察觉,根因就是当时代码从不记录 API 返回的用量。^18.18.0 || ^19.8.0 || >=20.0.0JOBS_DATABASE_URL 连接)Supabase 迁移由 CI 自动 apply:push 到 main 且改动 supabase/migrations/** 时,.github/workflows/migrate.yml 会执行前缀校验并应用尚未执行的迁移,不要再按 README 逐条手动运行 SQL。
迁移数量与明细一律以 supabase/migrations/ 目录为准,不在 README 里维护数字(会漂)。计数命令:
ls supabase/migrations/*.sql | wc -l
独立岗位库 schema 位于 jobs-db/schema.sql,由 .github/workflows/jobs-db-migrate.yml 应用。
cp .env.example .env.local
编辑 .env.local,填入 Supabase 的 URL、anon key、service role key;连接当前独立岗位库时还需配置 JOBS_DATABASE_URL。
npm install
npm run dev
cd crawler
pip install -r requirements.txt
python3 run.py
# 单源调试
python3 run.py --source apple
python3 run.py --source siemens
python3 run.py --source baidu
python3 run.py --source jd
不走百度千帆,只验证已知官方源:
set -a
source .env.local
set +a
python3 crawler/run.py --source baidu
python3 crawler/run.py --source jd
回归时检查:
duplicate_jd_urls = 0;jd_url 返回 HTTP 200;回归项:
.txt / .md / PDF / Word(.docx) / 图片 上传均可解析(服务端抽取文本后交 LLM 结构化,失败降级规则解析);.doc / .pages)返回 415 unsupported_file_type;400 empty_resume_text;resume_uploads;candidate_profiles;user_preferences;candidate_profiles.en_*,不覆盖中文简历档案;生产岗位库上线前必须完成并留存 docs/runbooks/jobs-db-production-safety.md 中的 TLS、备份、恢复与容量验收证据;未验证项不得视为已满足。
生产依赖安全门使用 high 阈值运行,保证 high/critical 为 0 时命令退出 0:
npm audit --omit=dev --audit-level=high --json
当前 raw audit 仍报告 2 个 moderate,来自 Next.js 内嵌 PostCSS 8.4.31。仓库检查未发现把不可信 CSS AST stringify 后注入 <style> 的运行时路径;该风险已评估但尚未完成正式接受,在责任人、接受日期、到期日、批准签字和证据位置登记前仍是发布阻塞。high gate 通过不等于完成 moderate 正式风险接受;每周和依赖升级时必须复查,且不得运行会错误降级依赖的 npm audit fix --force。
NEXT_PUBLIC_SUPABASE_URLNEXT_PUBLIC_SUPABASE_ANON_KEYSUPABASE_URLSUPABASE_SERVICE_ROLE_KEYJOBS_DATABASE_URL.github/workflows/ 实际引用为准):
SUPABASE_URL / SUPABASE_SERVICE_ROLE_KEYSUPABASE_DB_URL(Supabase 迁移用)JOBS_DATABASE_URL(岗位库读写);如启用严格 TLS 还需 JOBS_DATABASE_SSL_CA / JOBS_DATABASE_TLS_SERVERNAMESILICONFLOW_API_KEY(简历结构化 / 职业洞察,见下「外部额度与成本护栏」)BOCHA_API_KEY / TAVILY_API_KEY / SERPER_API_KEY / BAIDU_QIANFAN_API_KEY.github/workflows/ 目录为准npm run build 无报错jobs 表有数据入库crawler/adapters/ 中的主力 adapter,并核对其生成的 jd_urlcrawl_runs 记录 partial_success.txt/.md/PDF/Word(.docx)/图片 上传,均可解析为 candidate profile,用户确认后同步 preferencesjd_url、足够的 JD 正文,并持续通过 liveness / quality gate。jd_url 质量门写入 active jobs。CLAUDE.md 是权威工程规范:产品原则、各 adapter 的坑、数据库边界、成本纪律、公开仓库红线都在那里,
改代码前先读它。README 只做「这是什么、怎么跑起来、有哪些模块」的入口。CLAUDE.md。⚠️ 本仓库是公开的:提交内容、历史、提交者身份全世界可见且事后删不干净。
本机绝对路径、服务器 IP / 主机名、真人姓名与私人邮箱、任何密钥都不许写进任何被跟踪的文件(README 也一样)。
.githooks/pre-commit 会在提交前扫描拦截;误报请按 scripts/scan-sensitive.sh 里的说明加豁免,
不要用 --no-verify 绕过。
当前 Phase 1 不做:
LLM 已用于简历结构化和洞察辅助草稿,但不是岗位写入质量门的替代品。
当前部署同时依赖 Vercel、Supabase、GitHub Actions 与独立 PostgreSQL 主机,已不是“全免费栈”;实际费用以各部署账户和用量为准。