agentleFS
xiding-codexiding-code/job-application-skills/job-search/SKILL.md

job-search

Skill4 starsChanged 7 months agoMITView on GitHub

Automatically browse and search for job postings on Handshake and LinkedIn. Use this skill whenever the user asks to find new jobs, search for positions, browse job boards, or says things like "search Handshake", "search LinkedIn", "find internships", or any request to discover new job opportunities. Also trigger when the user finishes a batch of applications and wants to find more positions. This skill handles the full search→screen→rank pipeline.

We split this skill into the rules it gives an agent

19 rules. 0 are common, 14 are distinctive, and 5 are very specific to this project.

  • 0

    Common

    Most of the 25 edited versions we read keep these.

  • 14

    Distinctive

    This author's own choices. Worth a look.

  • 5

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Distinctive:

    Run the self-check skill first: Read the user's config, profile, resume, and working folder to ensure you have up-to-date information about …

    line 13
  2. Very specific:

    Read config.search.platforms to determine which platforms are enabled.

    line 17
  3. Distinctive:

    Use filters to narrow results

    line 26
  4. Very specific:

    Search Queries: Use config.search.target_roles — rotate through them.

    line 28
  5. Distinctive:

    Check for "Next" button or page numbers

    line 48
  6. Distinctive:

    Stop after 3-5 pages unless the user asks for more

    line 50
  7. Distinctive:

    Add filter: Date Posted → Past Week

    line 57
  8. Very specific:

    Add filter: Experience Level → config.search.job_type

    line 58
  9. Very specific:

    Add filter: Location → config.location.preferred_cities

    line 59
  10. Distinctive:

    When either limit is reached, report the count and stop:

    line 74
  11. Distinctive:

    Collect: all scored results into a ranked list

    line 92
  12. Distinctive:

    After searching, present results as a ranked table:

    line 96
  13. Distinctive:

    When the user approves the APPLY list:

    line 124
  14. Distinctive:

    If any application hits a blocker (file upload, CAPTCHA, unusual form), flag it and move to the next

    line 128
  15. Very specific:

    Default to config.search.freshness_days (typically 7 days or fewer)

    line 132
  16. Distinctive:

    If user says "find more", run a new search with different keywords or expanded location

    line 133
  17. Distinctive:

    Keep track of which companies/positions have already been searched to avoid showing duplicates

    line 134
  18. Distinctive:

    Before presenting a job to the user, check:

    line 138
  19. Distinctive:

    If duplicate, silently skip it.

    line 143

“Common” is measured: kept by at least 6 in 10 of the 25 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

Job Search

Automatically browse job boards to find postings that match the user's profile. This skill handles navigation, search queries, result extraction, and feeds each result into the job-screener for evaluation.

Before Starting Any Search

Run the self-check skill first. Read the user's config, profile, resume, and working folder to ensure you have up-to-date information about skills, projects, and application history. This prevents duplicate applications and ensures search queries reflect the current profile.

Search Platforms

Read config.search.platforms to determine which platforms are enabled.

Handshake (if config.search.platforms.handshake: true)

Navigate to app.joinhandshake.com. User should already be logged in via their university.

Navigation:

  1. Open Handshake in a Chrome tab (use tabs_create_mcp + navigate)
  2. Go to Job Search: https://app.joinhandshake.com/explore
  3. Use filters to narrow results

Search Queries: Use config.search.target_roles — rotate through them.

Filters to Apply:

  • Job Type: config.search.job_type (default: Internship)
  • Posted: Last config.search.freshness_days days
  • Location: config.location.preferred_cities
  • Work Authorization: Based on config.visa.work_permit_type

Extracting Job Details: For each result, use get_page_text or read_page to extract:

  • Company name
  • Position title
  • Location + remote/hybrid/onsite
  • Pay rate (if listed)
  • Posted date
  • Key requirements from JD
  • Visa/authorization requirements

Pagination:

  • Handshake shows ~25 results per page
  • Check for "Next" button or page numbers
  • Process all results on current page before moving to next
  • Stop after 3-5 pages unless the user asks for more

LinkedIn (if config.search.platforms.linkedin: true)

LinkedIn job search at linkedin.com/jobs/.

Search Queries: Same config.search.target_roles list.

  • Add filter: Date Posted → Past Week
  • Add filter: Experience Level → config.search.job_type
  • Add filter: Location → config.location.preferred_cities

Rate Limiting Warning: LinkedIn has aggressive bot detection. Take screenshots between actions and don't rapid-fire clicks. If you encounter a CAPTCHA or "unusual activity" warning, stop immediately and tell the user. Never attempt to bypass these systems.

Indeed / Glassdoor (if enabled in config)

These platforms can also be searched using similar patterns. Navigate to their job search pages, apply the same filters, and extract JDs. Note that Indeed and Glassdoor may have different page structures — take screenshots to verify form elements before interacting.

Run Limits (Token Usage Control)

Read config.search.max_jobs_per_run and config.search.max_apply_per_run before starting.

  • max_jobs_per_run (default 10): Stop searching and scoring after this many jobs have been fully evaluated. Quick-filtered jobs (obviously irrelevant) do NOT count toward this limit.
  • max_apply_per_run (default 3): In batch application mode, stop after submitting this many applications. The full cover-letter debate + form-filling pipeline is token-intensive — this prevents runaway usage.

When either limit is reached, report the count and stop:

Reached search limit: [N] jobs scored this run.
Remaining results can be searched in the next session.

The user can override by saying "keep going" or "find more".

Search→Screen Pipeline

For each job found:

  1. Extract the JD text (use get_page_text)
  2. Quick-filter — immediately skip if:
    • Title contains: "Graphic Design", "Mechanical", "Civil", "Chemical", "Nursing", "Accounting" (obviously irrelevant)
    • Requires: "US Citizen only", "Security Clearance", "Permanent Resident only"
    • School-specific: "Only open to [specific school] students" (unless it's BU)
  3. Score using the job-screener rubric (inline, don't need to invoke separate skill)
  4. Collect all scored results into a ranked list

Output Format

After searching, present results as a ranked table:

## Handshake Search Results — [Date]

| # | Company | Position | Score | Decision | Notes |
|---|---------|----------|-------|----------|-------|
| 1 | [name]  | [title]  | 9.1   | APPLY    | Strong match, CPT ok |
| 2 | [name]  | [title]  | 8.7   | APPLY    | Good fit, NYC onsite |
| 3 | [name]  | [title]  | 7.8   | ASK      | Borderline — [reason] |
| 4 | [name]  | [title]  | 6.2   | SKIP     | [reason] |
...

### Ready to Apply (≥8.5):
1. [Company] — [Position] (Score: X.X)
2. [Company] — [Position] (Score: X.X)

### Borderline (7.5-8.4) — Need the user's Decision:
1. [Company] — [Position] (Score: X.X) — [why borderline]

### Skipped (<7.5):
[count] positions skipped. Top reason: [most common skip reason]

Batch Application Mode

Respect config.search.max_apply_per_run (default 3). Each full application (CL debate + form fill) is token-heavy. Stop after hitting the limit and report remaining positions for the next session.

When the user approves the APPLY list:

  1. Process each position sequentially (up to max_apply_per_run)
  2. For each: check cover letter requirement → write CL if needed → fill application
  3. Track progress and report after each submission
  4. If any application hits a blocker (file upload, CAPTCHA, unusual form), flag it and move to the next

Search Frequency

  • Default to config.search.freshness_days (typically 7 days or fewer)
  • If user says "find more", run a new search with different keywords or expanded location
  • Keep track of which companies/positions have already been searched to avoid showing duplicates

Duplicate Detection

Before presenting a job to the user, check:

  1. Has this exact position been scored before in this session?
  2. Does the company + title match anything in the Job Tracker spreadsheet in config.files.tracker_dir?
  3. Has the user already applied (check cover letter PDFs in config.files.cover_letter_dir)?

If duplicate, silently skip it.

Download now (ZIP)

  • Other versions28 projects use a version of this.

    Word for word · 0

    None found.

    Edited · 0

    None found.

    Wrote their own version · 28

    1. proficientlyjobs/proficiently-claude-skills★ 389same name
    2. neonwatty/job-apply-plugin★ 132same name
    3. thesun4sky/jobstack★ 50same name
    4. squerne/open-career-skills★ 26same name
    5. muggl3mind/career-manager★ 24same name
    6. ua-job-search/job-search-skill★ 9same name
    7. Gianni03/gianni-skills★ 7same name
    8. gagangulyani/job-search-skill★ 4same name
    9. theYahia/hh-mcp★ 4same name
    10. vortex178/trawlnet★ 4same name

    18 more not listed

    How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.

  • Used alongsideProjects with it also use interview-prep, company-research and 1 more.

    Other files people use alongside this one.

    Files found in the same public projects as a version of this one, more often than they turn up anywhere else. Each project counts once, large collections count for less, and this file's own repository is left out.
    • AnthropicSkill

      interview-prep

      Create structured interview plans with competency-based questions and scorecards. Trigger with "interview plan for", "interview questions for", "how should we interview", "scorecard for", or when the user is preparing to interview candidates.

      Also in 8 projects that use this

    • claude-office-skillsSkill

      company-research

      Conduct comprehensive company research and due diligence. Analyze business model, competitive landscape, management, and market position.

      Also in 3 projects that use this

    • claude-office-skillsSkill

      resume-tailor

      >

      Also in 3 projects that use this

  • In this repository5 other files it gives its agents.

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.