GitHub Trending Repositories

MadsLorentzen/ai-job-search

Author: MadsLorentzen

Stars: 3,860 stars today

Description: The job search that runs on your machine. AI job application framework built on Claude Code: evaluate postings, tailor CVs, write cover letters, prep interviews. Fork it and own it.

README

Pip, the courier bird

AI Job Search

The job search that runs on your machine.

MadsLorentzen%2Fai-job-search | Trendshift

CI

An AI-powered job application framework built on Claude Code. Fork it, fill in your profile, and let Claude evaluate job postings, tailor your CV, write cover letters, and prepare you for interviews.

Note: This is an independent open-source project and is not affiliated with, endorsed by, sponsored by, or maintained by Anthropic. Anthropic and Claude Code are referenced only to describe the toolchain this workflow uses.

This project has no affiliated cryptocurrency, token, or paid sponsorship program. Anything claiming otherwise is unauthorized and should be treated as a scam. The only ways to support the project are the Ko-fi link below and contributing on GitHub.

Does it actually work?

I'm a geophysicist by training. When my position was cut in late 2025, I built this framework to run my own job search - the same /scrape, /apply, and /interview workflow in this repo, used weekly, on my own career. I was upfront about it with every employer I spoke to, and instead of counting against me, it usually sparked a genuine technical conversation.

Sixty-nine tailored applications, twenty first interviews, and one signed contract later, I started as an AI engineer in June 2026. People kept asking whether this actually works. It got me hired. Now it's yours.

The longer version, including the full application funnel, is on LinkedIn.

Did this save you a Sunday of cover-letter writing? Consider a coffee.
Did it land you the job? Maybe two.
☕

Buy me a coffee at ko-fi.com

What this is

A structured workflow that turns Claude Code into a full-stack job application assistant. The core workflow (self-profiling, fit evaluation, and the drafter-reviewer application pipeline) is language- and country-agnostic. The job portal search skills are built for the Danish market (Jobindex, Jobnet, Akademikernes Jobbank, etc.), but the pattern is designed to be swapped for your local job boards.

/setup /scrape /apply <url> | | | v v v Fill in Search job Evaluate fit your profile portals Score & recommend | | | v v v Profile Present matches Draft CV + Cover Letter files ready with fit ratings (LaTeX, tailored) | | v v Pick a match Reviewer agent critiques -> /apply -> Revise -> Final output

The framework encodes career guidance best practices, including structured evaluation criteria, forward-looking cover letter framing, and optional salary benchmarking.

Prerequisites

Quick start

🎥 Prefer to see it in action first? The Next New Thing did a hands-on walkthrough of how the workflow is actually used, from setup to a finished application (recorded August 2026 - commands may have evolved since).

1. Fork and clone

bash gh repo fork MadsLorentzen/ai-job-search --clone cd ai-job-search

[!IMPORTANT] A fork of this repo is always public — GitHub does not allow private forks of public repositories — and /setup (step 3 below) writes your personal data (name, contact details, employment history, salary expectations) into tracked files. If this copy is for your own job search rather than for contributing changes back, use a private repository with this repo as upstream instead — the two-minute recipe is in SETUP.md section 8, and every update workflow works identically. Fork only to contribute.

2. Install job search tools

bash python3 tools/install_portal_clis.py # Windows: python tools\install_portal_clis.py

It runs bun install in every portal CLI under .agents/skills/*/cli/ - discovered, not listed, so a portal you add with /add-portal or copy from another fork is included on a fresh clone. A CLI whose package.json declares an install-time lifecycle script is skipped and reported rather than run. --dry-run shows what it would install.

For linkedin-search and freehire-search the install is optional: both have zero runtime dependencies and run with plain bun; bun install only pulls TypeScript dev types.

3. Set up your profile

```bash claude

Then inside Claude Code:

/setup ```

/setup offers three paths: read your documents/ folder if you have one populated (CV PDF, LinkedIn export, diplomas, reference letters, past applications), import a single CV pasted in chat, or walk through an interview. It auto-detects what you have and asks. Documents-folder mode is idempotent and safe to re-run as you add more material; see documents/README.md for the layout.

4. Search for jobs

bash /scrape

This searches multiple job portals for positions matching your profile, deduplicates results, and presents them sorted by fit. Pick a match to run /apply on it directly — or, when a scrape returns more jobs than you want to eyeball, run /rank to batch-score them all against the fit framework and get a ranked shortlist first.

5. Apply to a job

bash /apply https://jobindex.dk/job/1234567

If the URL can't be fetched (some job portals block automated access), you can paste the job description directly instead:

bash /apply <paste the full job description here>

This runs the full workflow: evaluate fit, draft CV + cover letter, review with a second agent, revise, and present the final output. The posting passes a deterministic integrity gate first (hidden text, invisible characters, instruction-shaped lines, hidden links), and its one-line verdict opens the evaluation; the agents that fetch and review read-only.

Postings are treated as untrusted input (the workflow follows no instructions embedded in them and fetches no links from their body), but agentic defenses are instruction-level, not a sandbox - on an unfamiliar job board, skim what was fetched and written before you hit send. Details in SECURITY.md.

Other commands

/setup, /scrape, and /apply form the core workflow. Ten more commands extend it once your profile is in place:

/reset is also available, see Starting over below.

File structure

ai-job-search/ ├── CLAUDE.md # Main candidate profile + workflow rules ├── .claude/ │ ├── commands/ │ │ ├── apply.md # /apply workflow (drafter-reviewer) │ │ ├── setup.md # /setup onboarding (documents folder, CV import, or interview) │ │ ├── expand.md # /expand competency enrichment from documents and online presence │ │ ├── add-template.md # /add-template register custom templates (LaTeX, Typst, ...) │ │ ├── add-portal.md # /add-portal generate a job-portal search skill for your market │ │ ├── rank.md # /rank triage scraped jobs into a ranked shortlist │ │ ├── outcome.md # /outcome record application results, archive materials │ │ ├── gmail-sync.md # /gmail-sync auto-detect application status from Gmail │ │ ├── interview.md # /interview stage-specific prep pack + mock interview │ │ ├── html-report.md # /html-report generate application tracker dashboard │ │ ├── notion-sync.md # /notion-sync one-way pipeline view in a Notion database │ │ └── reset.md # /reset wipe profile data or documents folder │ ├── skills/ │ │ ├── job-application-assistant/ # Core application skill │ │ │ ├── SKILL.md # Skill definition │ │ │ ├── 01-candidate-profile.md # Your education, experience, skills │ │ │ ├── 02-behavioral-profile.md# PI/DISC/personality assessment │ │ │ ├── 03-writing-style.md # Tone, structure, do's and don'ts │ │ │ ├── 04-job-evaluation.md # Scoring framework for job fit │ │ │ ├── 05-cv-templates.md # LaTeX CV structure + tailoring rules │ │ │ ├── 06-cover-letter-templates.md # LaTeX cover letter templates │ │ │ └── 07-interview-prep.md # STAR examples + interview framework │ │ ├── job-scraper/ # Job search orchestration │ │ └── upskill/ # /upskill skill gap analysis and learning plan │ └── settings.json # Claude Code permissions (shared, scoped) ├── .agents/skills/ # Job portal CLI tools │ ├── jobbank-search/ # Akademikernes Jobbank (Denmark) │ ├── jobdanmark-search/ # Jobdanmark.dk (Denmark) │ ├── jobindex-search/ # Jobindex.dk (Denmark) │ ├── jobnet-search/ # Jobnet.dk (Denmark, government portal) │ ├── linkedin-search/ # LinkedIn public job listings (country-agnostic) │ └── freehire-search/ # freehire.me tech job aggregator (multi-market, REST API) ├── cv/ │ └── main_example.tex # moderncv LaTeX template ├── cover_letters/ │ ├── cover.cls # Custom cover letter LaTeX class │ ├── cover_example.tex # Example cover letter (structural reference + CI smoke test) │ └── OpenFonts/ # Lato + Raleway fonts ├── templates/ # Custom templates registered via /add-template │ └── README.md # Folder layout instructions ├── documents/ # Career source materials for /setup Path A and /expand │ ├── README.md # Folder layout instructions │ ├── cv/ # Master CV (PDF or .tex) │ ├── linkedin/ # LinkedIn profile export (PDF) │ ├── diplomas/ # Degree certificates and transcripts │ ├── references/ # Reference letters │ └── applications/ # Past application records (<company>_<role>/) ├── .github/workflows/ci.yml # CI: LaTeX smoke compiles, skill lint, CLI typechecks ├── salary_lookup.py # Salary benchmarking tool (BYO data) ├── tools/ │ ├── check_framework_version.py # CI check: framework_version bumped when skill files change │ ├── check_upstream_updates.py # Preview which personalized files an upstream update touches │ ├── convert_salary_excel.py # Convert salary Excel to JSON │ ├── fetch_page.py # GET-only browser-header retry for 403s (robots.txt enforced) │ ├── install_portal_clis.py # Install every discovered portal CLI (bun install) │ ├── lint_skills.py # CI lint for skills, commands, settings.json │ ├── posting_guard.py # Integrity gate: strip hidden text, flag injection-shaped lines │ ├── robots_check.py # Gate the browser-header retry against robots.txt │ ├── security_guards.py # CI guards: permission allow/ask/deny, skill grants, gitignore, manifests │ ├── upstream_triage.py # Sort upstream commits into worth-reviewing vs probably-skip │ ├── verify_layout.py # Measure a compiled PDF's page layout (holes, orphans, footer collisions) │ ├── verify_pdf.py # Verify a compiled PDF's page count and extractable text │ └── README_SALARY_TOOL.md # Salary tool setup instructions ├── job_scraper/ # Scraper state (seen jobs, results) ├── gmail_sync/ # /gmail-sync state (processed message IDs, last sync date) ├── upskill/ # /upskill report output (markdown reports per run) ├── job_search_tracker.csv # Application tracking spreadsheet └── SETUP.md # Detailed setup guide

How /apply works

The /apply command runs a drafter-reviewer workflow with mandatory PDF compilation:

  1. Parse the job posting (URL or text)
  2. Evaluate fit against your profile (skills, experience, culture, location, career alignment)
  3. Draft a tailored CV and cover letter in LaTeX
  4. Spawn a reviewer agent that researches the company and critiques the drafts
  5. Revise based on the reviewer's feedback
  6. Compile and inspect both PDFs: lualatex for the CV, xelatex for the cover letter. Claude reads the rendered pages and iterates on the LaTeX until the CV is exactly 2 pages with no orphaned entry titles, and the cover letter is exactly 1 page with the signature visible and fonts consistent.
  7. ATS-check the CV: extract the PDF's text layer (pdftotext, optional dependency) and verify it the way an ATS parser sees it — contact details present as literal text, no garbled glyphs, sane reading order — then score the posting's keyword coverage against the extraction. Keywords the profile genuinely supports get added; genuine gaps stay visible, never stuffed.
  8. Present the final output with a verification checklist

All claims in the CV and cover letter are verified against your actual profile. The system never fabricates skills or experience.

What makes this workflow different

Customization

Which files to edit manually

If you prefer editing files directly instead of using /setup:

| File | What to change | |------|---------------| | CLAUDE.md | Your full profile (name, education, experience, skills, goals) | | 01-candidate-profile.md | Structured version of your CV data | | 02-behavioral-profile.md | Your behavioral assessment or self-assessment | | 04-job-evaluation.md | Skill match areas, career goals, motivation filters | | 05-cv-templates.md | Profile statement templates for different role types | | 07-interview-prep.md | Your STAR examples from actual experience | | search-queries.md | Job search queries for your skills and location |

Updating your search queries

As your priorities evolve, you can reconfigure just the job search without re-running the full profile setup:

/setup --section search

This re-runs the search configuration interview: which roles to target, which skills to search for, which locations, and which portals. It also suggests role types you may not have considered based on your profile.

Custom templates

The CV uses moderncv (banking style). The cover letter uses a custom cover.cls with Lato/Raleway fonts. Both are LaTeX — the reference engine this repo ships and maintains.

To use your own template instead — LaTeX, Typst, or any other toolchain that compiles to PDF from the command line — run:

/add-template

Point it at your source file (a .tex file plus any .cls/.sty files or bundled fonts; a .typ file plus any local packages; or an equivalent for another toolchain). The command interviews you for the template's instructions — source extension, compile command, fonts and where they live, style rules to preserve, hard page limit — stores everything under templates/, runs a mandatory test compile, and activates the template so /apply drafts and compiles from it. Templates are stored with [PLACEHOLDER] tokens instead of personal data, so they're safe to commit and share.

If you prefer doing it by hand, the manual route still works: update the guidance in 05-cv-templates.md and 06-cover-letter-templates.md.

Job search tools

The four Danish CLI tools in .agents/skills/ (Jobbank, Jobdanmark, Jobindex, Jobnet) demonstrate the pattern for building a job-portal integration for a specific market. If you're in a different country, run:

/add-portal

Give it your local job board's URL. The command investigates the portal (search-URL pattern, result-page structure, robots.txt/access rules), scaffolds a CLI skill with the same structure, commands, and output contract as the shipped ones, and test-runs a live query before registering anything. Auth-walled portals are declined, and portals with restrictive terms get a prominent personal-use-only warning in the generated skill. The generated skill is market-specific and lives in your fork; the generator itself is the universal part.

Maintaining a fork adapted to your market or language? Add it to the Community forks & adaptations thread so others can find it.

For country-agnostic starting points outside Denmark, the repo ships two portal skills alongside the Danish demos:

Extending the framework: portals, templates, criteria - and borrowing from other forks

Everything above adds up to an extension model, so here it is stated plainly. The framework has three extension points, and none of them require touching upstream:

  1. Portal skills - the module system for job boards. Every *-search skill is a self-contained folder under .agents/skills/ with the same contract (a search/detail CLI, --format json|table|plain output, an enabled: flag in its SKILL.md, its own tests). /scrape auto-discovers any installed skill that follows the contract - nothing to register, nothing to wire up. /add-portal generates new ones; the community portal index catalogs the ones other forks have built.
  2. Document templates - /add-template registers any CV or cover-letter toolchain that compiles to PDF from the command line, LaTeX or otherwise.
  3. Evaluation criteria - deal-breakers and preferences in your profile are free-form, and the evaluation rubric scores against whatever you put there. "Strong parental-leave terms", "minimum salary X per my union's scale", "no on-call" - each is one profile line, no code, and it carries real weight in /rank and /apply fit evaluations. Language is the one deal-breaker type with dedicated, structured handling: /setup captures every language you work in and your level (asked directly, or inferred from your CV/LinkedIn export) into a Languages table, and the Language Gate (04-job-evaluation.md) hard-rejects a posting that requires a language you haven't declared at all, while flagging - not auto-rejecting - one that asks for a higher level than you declared in a language you do work in, so a borderline case (a strict "fluent" bar against your own B1/B2, say) gets your judgment instead of a silent drop.

Borrowing a portal skill from another fork is the intended way to get a board that upstream doesn't ship: find it in the portal index, open that fork, and copy the one folder into your own .agents/skills/. Before you run it:

The copy step is manual on purpose. Your settings already allow installed portal skills to run without asking each time - so an installer that fetched them from third-party repos for you would skip the one check that matters: you, reading the code first. There isn't one, and that's a security decision rather than a missing feature.

Market-specific data sources (a national salary database, local award-rate tables) follow the same pattern as portals: they belong in a market fork, shared via #78, not upstream.

Salary benchmarking

The salary tool works with any salary data you provide (union statistics, Glassdoor exports, personal research, etc.). See tools/README_SALARY_TOOL.md for the expected format and setup. If you don't have salary data, the salary step is simply skipped.

Starting over

To wipe your profile data and start fresh:

/reset profile # clears skill files, preserves framework rules /reset documents # deletes files from documents/ folder /reset all # both

/reset shows exactly what will be deleted and requires you to type RESET to confirm. Nothing is deleted until you do.

Staying up to date

Upstream moves fast. Rather than pulling raw master and hoping, update your fork to a tagged release - a vetted checkpoint described in CHANGELOG.md. python3 tools/check_upstream_updates.py previews exactly which of your personalized files an update touches before you merge, and python3 tools/upstream_triage.py sorts the commits you're behind into "worth reviewing" vs "probably skip" (a weekly workflow can post this to a rolling issue). Full walkthrough in SETUP.md, section 8.

Tips for better results

Profile depth matters

The single biggest factor in output quality is how much detail you put into your profile. A thin profile produces generic applications; a detailed one enables genuinely tailored results.

Career path discovery

The framework supports two distinct modes of job searching:

To get the most from this, invest time during /setup in describing not just your experience, but what energized you, what drained you, and what you'd want more of. This context directly shapes how the system evaluates fit and which roles it surfaces during /scrape.

Contributing

Thinking about a PR? Read CONTRIBUTING.md first - it explains what gets merged, what lives in forks, and why.

Acknowledgements

License

MIT

File Structure

📁 .agents
📁 .agents/skills
📁 .agents/skills/freehire-search
📄 .agents/skills/freehire-search/SKILL.md
📁 .agents/skills/freehire-search/cli
📄 .agents/skills/freehire-search/cli/README.md
📄 .agents/skills/freehire-search/cli/package.json
📁 .agents/skills/freehire-search/cli/src
📄 .agents/skills/freehire-search/cli/src/cli.ts
📁 .agents/skills/freehire-search/cli/src/commands
📄 .agents/skills/freehire-search/cli/src/commands/detail.ts
📄 .agents/skills/freehire-search/cli/src/commands/search.ts
📄 .agents/skills/freehire-search/cli/src/helpers.ts
📁 .agents/skills/freehire-search/cli/tests
📄 .agents/skills/freehire-search/cli/tests/cli-flag-validation.test.ts
📄 .agents/skills/freehire-search/cli/tests/commands.test.ts
📄 .agents/skills/freehire-search/cli/tests/helpers.ts
📄 .agents/skills/freehire-search/cli/tests/parsing.test.ts
📄 .agents/skills/freehire-search/cli/tests/request-timeout.test.ts
📄 .agents/skills/freehire-search/cli/tests/required-search-values.test.ts
📄 .agents/skills/freehire-search/cli/tests/retry-backoff.test.ts
📄 .agents/skills/freehire-search/cli/tsconfig.json
📄 .agents/skills/freehire-search/url-reference.md
📁 .agents/skills/jobbank-search
📄 .agents/skills/jobbank-search/SKILL.md
📁 .agents/skills/jobbank-search/cli
📄 .agents/skills/jobbank-search/cli/README.md
📄 .agents/skills/jobbank-search/cli/package.json
📁 .agents/skills/jobbank-search/cli/src
📄 .agents/skills/jobbank-search/cli/src/cli.ts
📁 .agents/skills/jobbank-search/cli/src/commands
📄 .agents/skills/jobbank-search/cli/src/commands/detail.ts
📄 .agents/skills/jobbank-search/cli/src/commands/search.ts
📄 .agents/skills/jobbank-search/cli/src/helpers.ts
📁 .agents/skills/jobbank-search/cli/tests
📄 .agents/skills/jobbank-search/cli/tests/cli-contract.test.ts
📄 .agents/skills/jobbank-search/cli/tests/cli-flag-validation.test.ts
📄 .agents/skills/jobbank-search/cli/tests/detail-jsonld.test.ts
📄 .agents/skills/jobbank-search/cli/tests/detail-url-normalization.test.ts
📄 .agents/skills/jobbank-search/cli/tests/helpers.ts
📄 .agents/skills/jobbank-search/cli/tests/missing-option-values.test.ts
📄 .agents/skills/jobbank-search/cli/tests/repeated-filter-cli.test.ts
📄 .agents/skills/jobbank-search/cli/tests/request-timeout.test.ts
📄 .agents/skills/jobbank-search/cli/tests/retry-backoff.test.ts
📄 .agents/skills/jobbank-search/cli/tests/rss-fetch.test.ts
📄 .agents/skills/jobbank-search/cli/tests/rss-parsing.test.ts
📄 .agents/skills/jobbank-search/cli/tests/search-normalization.test.ts
📄 .agents/skills/jobbank-search/cli/tsconfig.json
📄 .agents/skills/jobbank-search/url-reference.md
📁 .agents/skills/jobdanmark-search
📄 .agents/skills/jobdanmark-search/SKILL.md
📁 .agents/skills/jobdanmark-search/cli
📄 .agents/skills/jobdanmark-search/cli/README.md
📄 .agents/skills/jobdanmark-search/cli/package.json
📁 .agents/skills/jobdanmark-search/cli/src
📄 .agents/skills/jobdanmark-search/cli/src/cli.ts
📁 .agents/skills/jobdanmark-search/cli/src/commands
📄 .agents/skills/jobdanmark-search/cli/src/commands/autocomplete.ts
📄 .agents/skills/jobdanmark-search/cli/src/commands/categories.ts
📄 .agents/skills/jobdanmark-search/cli/src/commands/detail.ts
📄 .agents/skills/jobdanmark-search/cli/src/commands/locations.ts
📄 .agents/skills/jobdanmark-search/cli/src/commands/search.ts
📄 .agents/skills/jobdanmark-search/cli/src/helpers.ts
📁 .agents/skills/jobdanmark-search/cli/tests
📄 .agents/skills/jobdanmark-search/cli/tests/autocomplete-filtering.test.ts
📄 .agents/skills/jobdanmark-search/cli/tests/cli-contract.test.ts
📄 .agents/skills/jobdanmark-search/cli/tests/cli-flag-validation.test.ts
📄 .agents/skills/jobdanmark-search/cli/tests/detail-backoff.test.ts
📄 .agents/skills/jobdanmark-search/cli/tests/detail-jsonld.test.ts
📄 .agents/skills/jobdanmark-search/cli/tests/detail-parsing.test.ts
📄 .agents/skills/jobdanmark-search/cli/tests/detail-url-normalization.test.ts
📄 .agents/skills/jobdanmark-search/cli/tests/helpers.ts
📄 .agents/skills/jobdanmark-search/cli/tests/missing-option-values.test.ts
📄 .agents/skills/jobdanmark-search/cli/tests/request-timeout.test.ts
📄 .agents/skills/jobdanmark-search/cli/tests/retry-backoff.test.ts
📄 .agents/skills/jobdanmark-search/cli/tests/search-normalization.test.ts
📄 .agents/skills/jobdanmark-search/cli/tests/user-agent.test.ts
📄 .agents/skills/jobdanmark-search/cli/tsconfig.json
📁 .agents/skills/jobindex-search
📄 .agents/skills/jobindex-search/SKILL.md
📁 .agents/skills/jobindex-search/cli
📄 .agents/skills/jobindex-search/cli/README.md
📄 .agents/skills/jobindex-search/cli/package.json
📁 .agents/skills/jobindex-search/cli/src
📄 .agents/skills/jobindex-search/cli/src/cli.ts
📁 .agents/skills/jobindex-search/cli/src/commands
📄 .agents/skills/jobindex-search/cli/src/commands/detail.ts
📄 .agents/skills/jobindex-search/cli/src/commands/search.ts
📄 .agents/skills/jobindex-search/cli/src/helpers.ts
📁 .agents/skills/jobindex-search/cli/tests
📄 .agents/skills/jobindex-search/cli/tests/cli-contract.test.ts
📄 .agents/skills/jobindex-search/cli/tests/cli-flag-validation.test.ts
📄 .agents/skills/jobindex-search/cli/tests/detail-input.test.ts
📄 .agents/skills/jobindex-search/cli/tests/detail-parsing.test.ts
📄 .agents/skills/jobindex-search/cli/tests/documented-search.test.ts
📄 .agents/skills/jobindex-search/cli/tests/helpers.ts
📄 .agents/skills/jobindex-search/cli/tests/missing-option-values.test.ts
📄 .agents/skills/jobindex-search/cli/tests/parsing.test.ts
📄 .agents/skills/jobindex-search/cli/tests/request-timeout.test.ts
📄 .agents/skills/jobindex-search/cli/tests/retry-backoff.test.ts
📄 .agents/skills/jobindex-search/cli/tests/search-page.test.ts
📄 .agents/skills/jobindex-search/cli/tsconfig.json
📄 .agents/skills/jobindex-search/url-reference.md
📁 .agents/skills/jobnet-search
📄 .agents/skills/jobnet-search/SKILL.md
📁 .agents/skills/jobnet-search/cli
📄 .agents/skills/jobnet-search/cli/README.md
📄 .agents/skills/jobnet-search/cli/package.json
📁 .agents/skills/jobnet-search/cli/src
📄 .agents/skills/jobnet-search/cli/src/cli.ts
📁 .agents/skills/jobnet-search/cli/src/commands
📄 .agents/skills/jobnet-search/cli/src/commands/detail.ts
📄 .agents/skills/jobnet-search/cli/src/commands/occupations.ts
📄 .agents/skills/jobnet-search/cli/src/commands/search.ts
📄 .agents/skills/jobnet-search/cli/src/commands/suggestions.ts
📄 .agents/skills/jobnet-search/cli/src/helpers.ts
📁 .agents/skills/jobnet-search/cli/tests
📄 .agents/skills/jobnet-search/cli/tests/cli-contract.test.ts
📄 .agents/skills/jobnet-search/cli/tests/cli-flag-validation.test.ts
📄 .agents/skills/jobnet-search/cli/tests/detail-fallback.test.ts
📄 .agents/skills/jobnet-search/cli/tests/detail-formatting.test.ts
📄 .agents/skills/jobnet-search/cli/tests/detail-url-normalization.test.ts
📄 .agents/skills/jobnet-search/cli/tests/helpers.ts
📄 .agents/skills/jobnet-search/cli/tests/missing-option-values.test.ts
📄 .agents/skills/jobnet-search/cli/tests/occupation-table-cli.test.ts
📄 .agents/skills/jobnet-search/cli/tests/request-timeout.test.ts
📄 .agents/skills/jobnet-search/cli/tests/retry-backoff.test.ts
📄 .agents/skills/jobnet-search/cli/tests/search-normalization.test.ts
📄 .agents/skills/jobnet-search/cli/tests/user-agent.test.ts
📄 .agents/skills/jobnet-search/cli/tsconfig.json
📁 .agents/skills/linkedin-search
📄 .agents/skills/linkedin-search/SKILL.md
📁 .agents/skills/linkedin-search/cli
📄 .agents/skills/linkedin-search/cli/README.md
📄 .agents/skills/linkedin-search/cli/package.json
📁 .agents/skills/linkedin-search/cli/src
📄 .agents/skills/linkedin-search/cli/src/cli.ts
📁 .agents/skills/linkedin-search/cli/src/commands
📄 .agents/skills/linkedin-search/cli/src/commands/detail.ts
📄 .agents/skills/linkedin-search/cli/src/commands/search.ts
📄 .agents/skills/linkedin-search/cli/src/helpers.ts
📁 .agents/skills/linkedin-search/cli/tests
📄 .agents/skills/linkedin-search/cli/tests/cli-flag-validation.test.ts
📄 .agents/skills/linkedin-search/cli/tests/detail-description-cli.test.ts
📄 .agents/skills/linkedin-search/cli/tests/detail-input.test.ts
📁 .agents/skills/linkedin-search/cli/tests/fixtures
📄 .agents/skills/linkedin-search/cli/tests/fixtures/README.md
📄 .agents/skills/linkedin-search/cli/tests/fixtures/detail-orbis-excerpt.html
📄 .agents/skills/linkedin-search/cli/tests/fixtures/search-cards.json
📄 .agents/skills/linkedin-search/cli/tests/fixtures/search-cards.provenance.md
📄 .agents/skills/linkedin-search/cli/tests/helpers.ts
📄 .agents/skills/linkedin-search/cli/tests/parsing.test.ts
📄 .agents/skills/linkedin-search/cli/tests/request-timeout.test.ts
📄 .agents/skills/linkedin-search/cli/tests/retry-backoff.test.ts
📄 .agents/skills/linkedin-search/cli/tests/search.test.ts
📄 .agents/skills/linkedin-search/cli/tsconfig.json
📄 .agents/skills/linkedin-search/url-reference.md
📁 .claude
📁 .claude/agents
📄 .claude/agents/application-reviewer.md
📄 .claude/agents/posting-fetcher.md
📄 .claude/agents/posting-scorer.md
📁 .claude/commands
📄 .claude/commands/add-portal.md
📄 .claude/commands/add-template.md
📄 .claude/commands/apply.md
📄 .claude/commands/expand.md
📄 .claude/commands/gmail-sync.md
📄 .claude/commands/html-report.md
📄 .claude/commands/interview.md
📄 .claude/commands/notion-sync.md
📄 .claude/commands/outcome.md
📄 .claude/commands/rank.md
📄 .claude/commands/reset.md
📄 .claude/commands/setup.md
📄 .claude/settings.json
📁 .claude/skills
📁 .claude/skills/job-application-assistant
📄 .claude/skills/job-application-assistant/01-candidate-profile.md
📄 .claude/skills/job-application-assistant/02-behavioral-profile.md
📄 .claude/skills/job-application-assistant/03-writing-style.md
📄 .claude/skills/job-application-assistant/04-job-evaluation.md
📄 .claude/skills/job-application-assistant/05-cv-templates.md
📄 .claude/skills/job-application-assistant/06-cover-letter-templates.md
📄 .claude/skills/job-application-assistant/07-interview-prep.md
📄 .claude/skills/job-application-assistant/08-application-forms.md
📄 .claude/skills/job-application-assistant/09-web-research.md
📄 .claude/skills/job-application-assistant/SKILL.md
📁 .claude/skills/job-scraper
📄 .claude/skills/job-scraper/SKILL.md
📄 .claude/skills/job-scraper/search-queries.md
📁 .claude/skills/upskill
📄 .claude/skills/upskill/SKILL.md
📁 .github
📄 .github/FUNDING.yml
📁 .github/ISSUE_TEMPLATE
📄 .github/ISSUE_TEMPLATE/bug-report.md
📄 .github/ISSUE_TEMPLATE/config.yml
📄 .github/PULL_REQUEST_TEMPLATE.md
📄 .github/upstream-wontport.txt
📁 .github/workflows
📄 .github/workflows/ci.yml
📄 .github/workflows/upstream-watch.yml
📄 .gitignore
📄 AGENTS.md
📄 CHANGELOG.md
📄 CLAUDE.md
📄 CONTRIBUTING.md
📄 LICENSE
📄 README.md
📄 SECURITY.md
📄 SETUP.md
📁 assets
📁 assets/mascot
📄 assets/mascot/pip_flight_loop.gif
📁 company_research
📄 company_research/.gitkeep
📁 cover_letters
📁 cover_letters/OpenFonts
📁 cover_letters/OpenFonts/fonts
📁 cover_letters/OpenFonts/fonts/lato
📄 cover_letters/OpenFonts/fonts/lato/Lato-Bla.ttf
📄 cover_letters/OpenFonts/fonts/lato/Lato-BlaIta.ttf
📄 cover_letters/OpenFonts/fonts/lato/Lato-Bol.ttf
📄 cover_letters/OpenFonts/fonts/lato/Lato-BolIta.ttf
📄 cover_letters/OpenFonts/fonts/lato/Lato-Hai.ttf
📄 cover_letters/OpenFonts/fonts/lato/Lato-HaiIta.ttf
📄 cover_letters/OpenFonts/fonts/lato/Lato-Lig.ttf
📄 cover_letters/OpenFonts/fonts/lato/Lato-LigIta.ttf
📄 cover_letters/OpenFonts/fonts/lato/Lato-Reg.ttf
📄 cover_letters/OpenFonts/fonts/lato/Lato-RegIta.ttf
📁 cover_letters/OpenFonts/fonts/raleway
📄 cover_letters/OpenFonts/fonts/raleway/Raleway-Bold.otf
📄 cover_letters/OpenFonts/fonts/raleway/Raleway-ExtraBold.otf
📄 cover_letters/OpenFonts/fonts/raleway/Raleway-ExtraLight.otf
📄 cover_letters/OpenFonts/fonts/raleway/Raleway-Heavy.otf
📄 cover_letters/OpenFonts/fonts/raleway/Raleway-Light.otf
📄 cover_letters/OpenFonts/fonts/raleway/Raleway-Medium.otf
📄 cover_letters/OpenFonts/fonts/raleway/Raleway-Regular.otf
📄 cover_letters/OpenFonts/fonts/raleway/Raleway-SemiBold.otf
📄 cover_letters/OpenFonts/fonts/raleway/Raleway-Thin.otf
📄 cover_letters/cover.cls
📄 cover_letters/cover_example.tex
📁 cv
📄 cv/main_example.tex
📁 documents
📄 documents/README.md
📁 documents/applications
📄 documents/applications/.gitkeep
📁 documents/cv
📄 documents/cv/.gitkeep
📁 documents/diplomas
📄 documents/diplomas/.gitkeep
📁 documents/linkedin
📄 documents/linkedin/.gitkeep
📁 documents/postings
📄 documents/postings/.gitkeep
📁 documents/projects
📄 documents/projects/.gitkeep
📁 documents/references
📄 documents/references/.gitkeep
📁 job_scraper
📄 job_scraper/.gitkeep
📄 salary_lookup.py
📁 templates
📄 templates/README.md
📁 tests
📄 tests/__init__.py
📄 tests/_upstream.py
📄 tests/test_add_portal_command.py
📄 tests/test_add_template_build_dir.py
📄 tests/test_apply_host_check.py
📄 tests/test_apply_page_count.py
📄 tests/test_apply_records_application.py
📄 tests/test_changelog_structure.py
📄 tests/test_check_framework_version.py
📄 tests/test_check_upstream_updates.py
📄 tests/test_company_research_cache.py
📄 tests/test_convert_salary_excel.py
📄 tests/test_convert_salary_excel_integration.py
📄 tests/test_expand_command.py
📄 tests/test_fetch_page.py
📄 tests/test_gmail_sync_command.py
📄 tests/test_html_report_command.py
📄 tests/test_install_portal_clis.py
📄 tests/test_job_key.py
📄 tests/test_latex_guidance.py
📄 tests/test_lint_skills.py
📄 tests/test_notion_sync_command.py
📄 tests/test_onboarding_privacy.py
📄 tests/test_outcome_followup.py
📄 tests/test_outcome_stale.py
📄 tests/test_placeholder_integrity.py
📄 tests/test_posting_gate_wiring.py
📄 tests/test_posting_guard.py
📄 tests/test_rank_command.py
📄 tests/test_rank_state.py
📄 tests/test_readme_assets.py
📄 tests/test_reset_command.py
📄 tests/test_reset_documents.py
📄 tests/test_robots_check.py
📄 tests/test_salary_chartsheet_cli.py
📄 tests/test_salary_company_header_cli.py
📄 tests/test_salary_count_only_cli.py
📄 tests/test_salary_empty_company_cli.py
📄 tests/test_salary_grouping_cli.py
📄 tests/test_salary_lookup.py
📄 tests/test_salary_metadata_cli.py
📄 tests/test_salary_nonfinite_cli.py
📄 tests/test_salary_unicode_cli.py
📄 tests/test_scrape_contract.py
📄 tests/test_scrape_provenance.py
📄 tests/test_scrape_seen_jobs_path.py
📄 tests/test_security_guards.py
📄 tests/test_setup_command.py
📄 tests/test_tools_utf8_output.py
📄 tests/test_tracker_notes_csv_safe.py
📄 tests/test_tracker_status_vocab.py
📄 tests/test_upskill_skill.py
📄 tests/test_upstream_checkout.py
📄 tests/test_upstream_crossrefs.py
📄 tests/test_upstream_triage.py
📄 tests/test_verify_layout.py
📄 tests/test_verify_pdf.py
📁 tools
📄 tools/README_SALARY_TOOL.md
📄 tools/check_framework_version.py
📄 tools/check_upstream_updates.py
📄 tools/convert_salary_excel.py
📄 tools/fetch_page.py
📄 tools/install_portal_clis.py
📄 tools/job_key.py
📄 tools/lint_skills.py
📄 tools/posting_guard.py
📄 tools/rank_state.py
📄 tools/robots_check.py
📄 tools/security_guards.py
📄 tools/upstream_triage.py
📄 tools/verify_layout.py
📄 tools/verify_pdf.py
📁 upskill
📄 upskill/.gitkeep
Back to Trending