TreeMap
A free, open-source disk-space visualizer. Squarified treemap, duplicate hunting, disk-full forecasting, and cleanup that only ever moves files to the Trash.
翻译准备中
LLM 驱动的职位搜索管线:从 ATS/招聘平台抓取数据,筛选,使用 Claude 打分,在 Vercel+Supabase 仪表板进行分流。使用模板化提示,8 个 Claude 代码斜线指令。
AI 翻译
LLM-driven job search pipeline: fetch from ATS/boards, filter, score with Claude, triage in a Vercel+Supabase dashboard. Templated prompts, 8 Claude Code slash commands.
效率工具Python · JavaScriptGitHub @ncalavera在线运营者未确认
试用过了吗? 点一下就好,无需登录。
尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证正在加载完整 README。 以下为已保存的摘录。
Your own AI-powered job search: fetches vacancies from company career pages,
scores each one against your profile with Claude, and gives you a dashboard,
a terminal triage CLI and a daily Telegram digest. Self-hosted, MIT-licensed,
works for any field — engineering, design, ops, research, nonprofits.查看完整 README ↗Your own AI-powered job search: fetches vacancies from company career pages, scores each one against your profile with Claude, and gives you a dashboard, a terminal triage CLI and a daily Telegram digest. Self-hosted, MIT-licensed, works for any field — engineering, design, ops, research, nonprofits.
The core idea is company-first. There are far fewer companies than vacancies, and they are more stable: pick the organisations you actually want to work for, monitor everything they post, and score every posting against your profile — instead of doom-scrolling job boards. The pipeline automates exactly that loop for 50+ companies without you reading a single irrelevant posting.
/jobs-new discovers your
first companies from your profile and /jobs-new is your one daily command.
No Supabase, no server to host, ~5 minutes. Runbook: INSTALL-EASY.md.Fetching, filtering, company review and scoring quality are identical in
both — the same gates, the same auto-discovered-company rule, the same
scores. The only real differences: full mode adds a hosted dashboard you can
open from any device, a daily Telegram digest, and multi-device sync; simple
mode keeps everything on your machine. Simple mode upgrades to full at any
time: set SUPABASE_DB_URL and the same scripts switch to Postgres, no code
changes.
Easiest entry either way: fill in the onboarding questionnaire (5 minutes, EN/RU) — it generates your candidate profile and one setup prompt for your coding agent — Claude Code, Codex, or similar — which installs everything and asks you only for the things it can't do itself.
docs/fetch-engines.md. Optional Firecrawl
enrichment for JS-heavy career pages. A set of opt-in job boards, all free
APIs/feeds — impact, remote-first, European-tech, startup and general
boards, plus LinkedIn's guest API (queries derived from your profile). All
off by default; enable the ones that fit you and they persist across runs.
Full list, per-board audience and how to enable:
docs/job-boards-catalogue.md. Know a board
worth adding? Suggest one
(URL · who it serves · what feeds it).scripts/quality.py) that strips cookie banners, navigation junk and
non-vacancy pages before they reach your database./jobs-eval builds a golden set — a few dozen of
your own vacancies labelled fits / doesn't-fit — and reports one number: how
often the scorer agrees with you, plus the disagreements to fix. It seeds
itself from your existing like/pass verdicts, so there's no upfront labelling
wall. The set is personal and stays on your machine (gitignored evals/)./jobs-review terminal CLI, or a daily Telegram
digest with 👍/👎 buttons that write statuses straight back to the database.flowchart LR
A[ATS & job boards] -->|fetch| B[(Database)]
A2[Company pages] -->|enrich| B
B -->|filter + quality gate| C[Clean vacancies]
C -->|score, Claude| D[Scores 0-100]
D -->|archive low, optional| E[Archive]
D --> F[Dashboard / vac CLI / Telegram]
F -->|triage| G{liked / passed /<br/>to_apply / applied}
G -->|status| B
style B fill:#1E40AF,color:#fff
style D fill:#065F46,color:#fff
style F fill:#7C2D12,color:#fff
Details: docs/ARCHITECTURE.md.
There is no per-token bill, but scoring is not free either — it draws on your coding-agent plan. The real driver is one formula: plan tier × scoring model × number of vacancies scored. The model tier is the dial you set to match your plan.
screen_model,
default Haiku) gives every new vacancy a fast first score, and the strong model
(scoring_model) re-scores only the finalists that clear escalate_threshold.
A budget plan (## VOLUME section of your profile. A quiet day scores 20-30
vacancies; a spike day is capped (max_per_run, default 150) so it can't
silently drain your plan — the overflow is offered on the next run. Because the
cheap screen escalates only the finalists, a typical Sonnet-tier day runs
roughly a third cheaper than scoring everything with the strong model (more on
an Opus tier) — the exact saving depends on how many roles clear the floor, and
the strong-model tier stays the main cost dial.VACANCY_FETCH_ENGINE=firecrawl opts
vacancy collection back into it.So the infrastructure is free; the variable cost is the plan usage your chosen model spends on the vacancies you score each day.
/jobs-new cycle).Simple mode needs none of this — see INSTALL-EASY.md. Full mode requirements: Python 3.11+, Node.js 18+ (dashboard only), a Supabase account, a coding-agent subscription (Claude Code recommended).
git clone https://github.com/ncalavera/llm-job-pipeline.git
cd llm-job-pipeline
pip install -r requirements.txt
cd api && npm install && cd ..
sql/schema.sql, run..envcp .env.example .env
Set SUPABASE_URL, SUPABASE_SERVICE_ROLE_KEY, SUPABASE_DB_URL
(Settings → Database → Session Pooler — not the direct connection, which is
IPv6-only). No Anthropic API key needed.
cp config/user_profile.example.md config/user_profile.md
Fill in your experience, target roles, domains and exclusions — or generate
this file from the onboarding questionnaire.
The file feeds the scoring prompts via placeholders ({{USER_PROFILE}},
{{TARGET_ROLES}}, {{EXCLUDE_PATTERNS}}) — the prompt templates live in
scripts/prompts/ (see docs/ARCHITECTURE.md).
In your agent: /jobs-add CompanyName (non-Claude agents: follow .claude/commands/jobs-add.md) — auto-detects the ATS, adds the
company, runs a test fetch. Or bulk-import examples/companies.example.csv
via the Supabase SQL Editor.
Make sure you have filled in config/user_profile.md (step 4) before scoring
— scoring against the example placeholder produces meaningless results.
python3 scripts/fetch_vacancies.py # fetch (TTL-aware)
python3 scripts/filter_vacancies.py # junk filter + dedup
python3 scripts/score_vacancies.py --local --limit 20 # score via your agent
python3 scripts/fetch_vacancies.py --report-only # regenerate dashboard data
npm install --omit=dev
DATABASE_URL=postgres://user:pass@localhost/jobs npm start
server.js serves public/ and every /api/* endpoint from one process. It
binds to 127.0.0.1:3000 by default (HOST/PORT override), so put a reverse
proxy in front of it for TLS and a password — the dashboard is your private job
search, keep a login on it. DASHBOARD.md has the systemd unit
and a Caddy site block that does both.
Daily top-5 unseen vacancies with 👍/👎 buttons. See INSTALL.md.
You only need three:
| Command | When | What it does |
|---|---|---|
/jobs-new | once (first run) | Discovers starter companies from your profile, fetches, scores, opens the dashboard |
/jobs-new | daily | Fetch → filter → score → top new matches in chat, like/pass verdicts saved |
/jobs-review | weekly | Deep review of liked vacancies — decide what to actually apply to |
/jobs-new calls one Python driver (scripts/run_daily.py) that owns the whole
machinery — stage order, checkpoints, the live progress card, and the publish
gate. You never think about the stages, and the agent cannot run them out of
order: it only supplies judgment (scoring, verdicts) at the points the driver
pauses on, then resumes it. To add a company, just ask the agent ("add
Stripe") — it uses /jobs-add itself.
| Command | What it does |
|---|---|
/jobs-add | Add a company: ATS auto-detection, test fetch |
/jobs-review | Deep review of liked vacancies, archive low scores, terminal triage |
/jobs-eval | Scoring-quality check: label a golden set of your own vacancies, measure how well the scorer agrees with you |
/jobs-profile | Update scoring rules and candidate profile |
/jobs-digest | Send/poll the Telegram digest (full mode) |
/jobs-update | Pull latest code, refresh deps, apply DB migrations |
Runbooks live in .claude/commands/ — slash commands in Claude Code, plain
markdown runbooks for any other agent (see AGENTS.md). "Works with
any agent" is real because the deterministic core is Python: any agent that can
run shell drives the daily loop with python3 scripts/run_daily.py and only
does the LLM scoring + user verdicts at the gates it prints. Full command
reference: AGENTS.md.
The many single-stage commands collapsed into the six above:
| Old command(s) | Now |
|---|---|
jobs, jobs-fetch, jobs-filter, jobs-score, jobs-start, jobs-finish | /jobs-new |
jobs-apply, jobs-archive, jobs-vac | /jobs-review |
jobs-rules | /jobs-profile |
jobs-add, jobs-digest, jobs-update | unchanged |
To update an existing install, run /jobs-update in your agent. It pulls the
latest code, refreshes Python dependencies if needed, and applies pending DB
migrations with an automatic backup.
Manually:
git pull --ff-only
pip install -r requirements.txt
python3 scripts/migrate.py
migrate.py backs up before touching anything (SQLite file copy, Postgres
pg_dump) and is safe to re-run — already-applied migrations are skipped. If
there is nothing pending, it prints "Up to date" and exits.
MIT — see LICENSE.