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.