TreeMap
무료 오픈소스 디스크 사용량 시각화 도구로, 사각형 트리맵·중복 파일 탐색·디스크 가득 예측·정리 시 파일을 휴지통으로만 이동한다
LLM 기반 채용 공고 탐색 파이프라인
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를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기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.