goodnight000/warm-apply/job-hunt
Claude Code and agent skill by goodnight000/warm-apply
- community
Checking that the SKILL.md file is still in the repository.
Research-first job hunting through Monid: learns the user's resume once, then finds fresh postings that fit (LinkedIn, Google Jobs, startups' own job boards, Hacker News, hiring posts on X, opt-in), researches each company, finds the recruiter and people inside who can refer them, reads the real application form, and prepares everything (tailored resume PDF, form answers, referral ask, outreach email) in an inbox page so the user reviews and clicks submit. Use when the user wants to find jobs,…
Install
npx vskill@latest install goodnight000/warm-apply/job-huntSKILL.md
Job hunt
A daily shortlist of the few jobs most worth the user's time, each packet-ready: tailored resume PDF, every form field answered or flagged, a referral ask and an outreach email, all in one inbox page. The user reviews and clicks submit; this skill never presses it.
JH below means python3 SKILL_DIR/scripts/jobhunt.py (SKILL_DIR is this skill's folder); write it out in full or define a shell function, since zsh won't split a variable holding it. Every command prints JSON and exits 1 with an error and a hint; JH COMMAND --help lists flags. State lives in one folder, JH_HOME: $JOB_HUNT_HOME, else ./job-hunt if the current directory has one, else ~/job-search/job-hunt.
No shell (Claude.ai, ChatGPT chat)? Follow references/chat-mode.md instead.
Set up (first session)
The goal of the first session is a real inbox with real jobs in it, not a configured tool. Keep questions to one message.
- Install check.
JH initif there's noJH_HOME, thenJH check; itsnext_stepslist what's missing. For a missing Monid key, send the user to https://monid.ai?fpr=charles to sign up (new accounts get $1 free credit, enough for the first day), then to https://app.monid.ai/access/api-keys for a key. Have them runmonid keys add -k KEY -l mainthemselves, or paste the key to you, and never echo it back. Scheduled runs may passMONID_API_KEYinstead. - One message to the user. Ask for: resume (file or paste), project links, GitHub and LinkedIn URLs, what they want next (roles, cities or remote, salary floor, company stage, industries to avoid), and anything they're proud of that the resume leaves out. For LinkedIn and GitHub links you can't open, use Monid (
anyapi /linkedin.profile,anyapi /github.user_repositories, about $0.005 together). - Write the three files in
JH_HOME:
profile.md, the facts inventory: experience with the numbers the user confirmed, projects with links, skills, education, short true stories (used in referral asks, notes and form answers). The only source of claims for every draft.answers.json: the answers forms ask for, used to fill fields automatically: name, contact, location, country, links, current company and title,years_experience,work_authorized,needs_sponsorship,security_clearance(""if none),willing_to_relocate,in_office_ok,us_citizen(true/false; drops US-citizens-only jobs when false),earliest_start,salary_expectation(""leaves it to the user), pronouns, andself_id(voluntary demographic questions; defaultdecline).customgrows as the user answers recurring questions.config.json:roles(2–4 titles as postings phrase them; they also filter titles),skills(10–25 the user actually has perprofile.md, named the way postings name them; they drive fit scoring and the resume keyword check, so a skill they lack here would push a false claim),level(entry,mid,senior,staff,principal, or a list like["mid", "senior"]for a range),locations+workplace(a job passes if it's remote andworkplaceincludesremote, or it's in one oflocationswith an arrangement inworkplace),salary_min,exclude_title_keywords,exclude_companies,dealbreaker_keywords,warm_paths(schools and past employers, most distinctive first;{"school": …}or{"company": …}when a name is ambiguous),job_function(ContactOut's functional area for the user: Engineering, Product Management, Design, Marketing, Sales, Operations…; it keeps referral paths and the hiring manager in the user's own function),contact_titles(hiring-manager titles for their field first),daily_shortlist(default 5, max 10),sources(see below),budget.
- Target companies.
JH companies --industry X --location Yfinds recently funded companies and their job boards (about $0.06 per funding round returned). Propose 10–20 targets with the user (these, plus peers of past employers) and add them totarget_companieswith their ATS slugs (references/sources.md); their boards are scanned free every run. Big companies on Workday go in as{"name", "ats": "workday", "url": "<careers site URL>"}. - Confirm a five-line summary (roles, level, places, salary floor, sources) with the user.
JH checkmust showready: true. - Run the first daily run now (below), so the session ends with an inbox, and
JH openit. - Offer the automation. "Want this every weekday morning?" If yes, ask the time and run
JH schedule --at HH:MM(add--agent codexunder Codex), then offer to test it now with therun_nowcommand it prints (about $0.35: today's jobs are already seen, so it mostly searches). Other setups (desktop apps, GitHub Actions, chat apps): references/scheduling.md. If they'd rather run it by hand, they say "run my job hunt" any day.
Daily run
Five steps. A scheduled run does all five and leaves the inbox for the user.
- Find.
JH run. It checks Monid, searches every enabled source in parallel, dedupes against every job ever seen, removes knockouts (no sponsorship when needed, clearance, citizenship, years far beyond the user's), agencies, and wrong titles, places and pay, scores the rest on fit, and returnsto_judge: the top new and saved jobs with scoring reasons and an excerpt of each posting's requirements. After the first run it searches only the last day's postings. Mention anything innotesormonid.failed. - Judge. Fit is your call; the score is a pre-rank. For each job in
to_judge, read the excerpt againstprofile.md(JH show IDfor the full posting when it's close): hard requirements, years, seniority, domain, dealbreakers, red flags (possible scam, no salary where required, vague duties, months-old posting).JH set ID shortlisted --note "one-line why"for up todaily_shortlist;saved --notefor good fits that missed today's cut;skipped --notefor misses. Done when every job into_judgehas a status and a note.to_judgeholds the top 15;JH list --status new --top 40shows the rest, worth a look on the first run or when few fit. Between close calls, prefer fewer applicants, posted in the last day, and founders' posts (Hacker News, X), where the poster is often the hiring manager. - Prepare.
JH prepare ID...for the shortlist: research (funding, news, the recruiter, the likely hiring manager when a manager's title matches the role or team, and warm paths: current employees who share the user's school or past employer, found through ContactOut's people search, same job function first; emails kept only on the company's domain) and the real application form prefilled fromanswers.json, all jobs in parallel. Each result listswrite_these(form fields for you),for_user(only the user can answer or agree: legal, AI-use policy, preferences), warnings, the contact and warm paths. - Draft, per job, following references/drafting.md:
resume.md: the user's resume reordered and reworded for this posting.- each
write_thesefield:JH answer ID FIELD "text". When the profile can't support an honest answer:JH answer ID FIELD --to-user "what to ask them". Facts from the user oranswers.jsontake--user(JH answer ID FIELD "Yes" --user); leave it off only for answers you drafted, so the inbox marks those for review. When a prefilled answer is wrong, correct it with--userand fixanswers.json. note.mdif the form has a cover letter field;referral.mdif there's a warm path (sent first: referrals reach interviews far more often than cold applications);email.mdif there's a contact and no "Careers page only" notice.
Every claim is traceable to profile.md; requirements the user lacks go under "Gaps" in job.md.
- Packet and inbox.
JH packet IDrenders the PDFs, attaches them, scores keyword match (how many of the posting's skills that the user has appear in the tailored resume; shown on the inbox card) and lints (untraceable numbers, length limits, filler, placeholders, posting skills the resume omits, empty required fields); fix everything inblockingand rerun untilready: true, which marks the job drafted. A job whose form can't be read (Workday, LinkedIn-only, a plain link) is ready by hand (by_hand: true): the user applies on the posting with the PDFs and drafts.readymeans your part is done;required_for_userlists required fields the user still has to answer at submit time (often a LinkedIn URL: add it toanswers.jsonif they have one). ThenJH digestwrites the inbox andJH openopens it (a scheduled run skips opening). Report in three lines: how many are ready, the best one and why, today's Monid cost.
Inbox and applying
The inbox (JH_HOME/inbox.html) has a card per job: why it fits, what's left for the user, the referral note with a copy button and the person's profile, an Open application button with the PDFs, every form field with its answer and a copy button, and the outreach email as an Open in mail button. When the user wants help applying ("apply to 2"), follow references/applying.md: referral first, then the form (filled in their browser up to the submit button when you can drive it), then the email; record it with JH set ID applied --via referral,email,form. Follow-ups and outcomes are in the same file.
Sources
config.sources turns each on or off. On by default: linkedin, google_jobs, ats_boards (target companies' own boards, free), ats_web (Google restricted to Greenhouse, Lever and Ashby pages: startups that never post to LinkedIn, each one a form the skill can read), hackernews (this month's "Who is hiring?", free; strongest for engineers and designers at startups), and Workday targets. Off by default: x (hiring posts on X; noisy for most roles in testing) and glassdoor (about $0.05 a search; adds salary estimates and company ratings). Watch stats.by_source and turn sources off that never produce a shortlisted job. Costs and behavior: references/sources.md.
Weekly review
After about ten applications, JH stats: interview rate by channel, and by_source (found → passed filters → shortlisted → applied → interviews). Tell the user what's working ("referrals: 2 of 3 led to interviews; cold forms: 0 of 7"; "Hacker News gave 4 of your 6 shortlisted jobs") and propose config changes: sources to drop or add, roles, level, skills, places, targets. Change config only after they agree.
Spend and failures
This is the start of the file. Read the full SKILL.md on GitHub.
Security
- Security scanPassed, 90 of 100Pattern checks on the skill's files.
- Model reviewPassed
Quality evaluation
- Task evaluationNot runNo evaluation yet. Run one in Skill Studio.
Source
- SKILL.md in the repositoryCheckingskills/job-hunt/SKILL.md
Popularity
- Repository stars
- 1
- Repository forks
- 1
- 7-day trend score
- 0
Stars and forks are for the whole GitHub repository, not this skill alone. Not refreshed yet.
Works with
Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.
- Claude Code
- Cursor
- GitHub Copilot
- Windsurf
- Codex
- Gemini CLI
- Cline
- Amp
- Roo Code
- Goose
- Continue
- Kilo Code
- Junie
- Trae
- OpenHands
- Qwen Code
- AI Agent
- Tabnine Chat
- Sourcegraph Cody
- Amazon Q
- Firebase Genkit
- Sweep
- Devin
- Phind
- Mentat
- Claude Desktop
- Aider
- GPT Pilot
- Plandex
- bolt.new
- v0
- Replit Agent
- Anse
- TypingMind
- BetterChatGPT
- LibreChat
- Warp AI
- Pieces
- Fig AI
Embed badge
[](https://verified-skill.com/skills/goodnight000/warm-apply/job-hunt)