README.md
Keywords: lm studio plugin, job search ai, application tracker, resume matcher, cover letter generator, local ai job tracker, no cloud, private job search, work permit checker
A comprehensive job search assistant plugin that runs directly inside LM Studio. Search listings, track applications, analyse job descriptions, verify companies, generate cover letters, and navigate international work permits β all from a single chat session.
For live development (auto-recompile on save):
Open Settings β Plugins β job-search in LM Studio to configure:
README.md
Keywords: lm studio plugin, job search ai, application tracker, resume matcher, cover letter generator, local ai job tracker, no cloud, private job search, work permit checker
A comprehensive job search assistant plugin that runs directly inside LM Studio. Search listings, track applications, analyse job descriptions, verify companies, generate cover letters, and navigate international work permits β all from a single chat session.
For live development (auto-recompile on save):
Open Settings β Plugins β job-search in LM Studio to configure:
| Setting | Default | Description |
|---|
| Data Path | ~/job-search-data | Directory where applications.json is stored |
| Resume File Path | (blank) | Path to your resume (plain text or Markdown). Used by match_resume_to_job and generate_cover_letter |
| Max Search Results | 8 | Results returned per search query (3β20) |
| Preferred Job Location | India | Default location for searches when none is specified |
| Home Country | India | Used to detect international roles automatically |
| Citizenship | Indian | Used by check_work_permit to determine visa eligibility |
| Open to International Roles | false | Global toggle β when off, international searches are blocked to keep results focused |
search_jobsSearch for job listings across 7 channels via the channel parameter.
channel | What it searches |
|---|---|
boards (default) | Indian job boards: Naukri, Foundit, Instahyre, IIMJobs, LinkedIn India, Wellfound, Shine. International when location is overseas |
company | Company culture, reviews, recent news, funding, team size, and tech stack |
hidden | Unadvertised opportunities: LinkedIn/Twitter hiring posts, direct career pages, HN Who's Hiring, referral signals |
remote | Remote-friendly boards: Remotive, Remote OK, and global boards |
funded | Recently funded startups (seed β Series C) that are actively hiring |
government | Government and public-sector listings |
academic | Universities, research labs, national labs, and academic institutions |
Parameters: query β Role, skills, or keywords channel β boards | company | hidden | remote | funded | government | academic (default: boards) location β e.g. "Bangalore", "Remote India", "USA" (blank = use setting) includeInternationalβ Override international toggle for this search jobType β any | full_time | part_time | contract | internship | remote max β Max results (overrides plugin setting) strategy β all | hiring_posts | career_pages | referral_network | hn_whoishiring | wellfound | yc_startups | reddit | product_hunt | regional | tech_contract | dev_community source β all | remotive | remoteok | boards (for remote channel) stage β seed | series_a | series_b | series_c | any (for funded channel) sector β Industry/sector filter (e.g. "AI research", "fintech") country β india | usa | uk | australia | eu | canada | all region β global | india | usa | uk | europe | us | eu | remote field β Subject area filter (for academic channel)
fetch_job_pageFetch and parse a job posting page from a URL. Strips HTML and returns clean text. Use after search_jobs to get the full job description before saving it.
scan_portalsSearch ATS-hosted job listings and AI-company portals.
Parameters: mode β single | all single: search one specific portal all: scan across Greenhouse, Ashby, Lever, Workable, and curated AI company boards portal β Portal name or URL (for mode: single) query β Role or keyword filter
All applications are stored in a local applications.json file in your configured data directory.
manage_applicationCreate, update, retrieve, delete applications, and log interview rounds β all in one tool.
Parameters: action β add | update | get | delete | add_interview applicationId β Required for update | get | delete | add_interview For add / update: company, role, url, location, status, jobDescription, notes, salary, nextStep postedDate, followUpDate, totalComp, workPermitStatus, workPermitNotes For add_interview: round β Round name (e.g. "Phone Screen", "Technical Round 1") date β YYYY-MM-DD, defaults to today interviewerName β Name of the interviewer interviewerRole β Title of the interviewer questions β Key questions asked feedback β Your notes on how it went outcome β passed | failed | pending | unknown
list_applicationsList all tracked applications with pipeline stats. Supports filtering by:
status β saved / applied / interview / offer / rejected / withdrawn / allsearch β keyword in company or role nameinternationalOnly β show only cross-border applicationsworkPermitStatus β filter by visa/permit statusapplication_insightsTiming, follow-up, and analytics in one tool.
Parameters: mode β urgency | followups | stale | stats | rejections urgency: Calculate apply urgency from posting date. Accepts natural language ("3 days ago") or YYYY-MM-DD. postedDate β When the job was posted applicationId β Optionally save postedDate + followUpDate back to the record followups: Show applications with a follow-up action due within N days. daysAhead β Days to look ahead (default: 7) stale: Find applications with no activity in N days. staleDays β Days before flagging (default: 14) includeStatuses β Which statuses to check (default: applied, interview) stats: Full pipeline dashboard β counts per status, conversion rates, average days per stage. rejections: Analyse patterns across rejected applications (requires β₯3 rejections).
Urgency reference:
| Days since posted | Urgency | Callback rate |
|---|---|---|
| 0β2 days | CRITICAL | 2β3Γ higher |
| 3β7 days | HIGH | 1.5β2Γ |
| 8β14 days | MEDIUM | ~1Γ |
| 15β30 days | LOW | 0.3β0.6Γ |
| 30+ days | STALE | ~0Γ |
salaryTotal compensation calculator and market rate lookup in one tool.
Parameters: mode β calc | market calc: Calculate true total comp beyond base salary. baseSalary β Annual base bonus β Annual bonus % of base equityValue β Total equity/RSU value vestingYears β Vest period (default: 4) signingBonus β One-time signing bonus benefitsValue β Annual benefits value remoteStipend β Annual remote work stipend currentComp β Current TC to compare against market: Look up current market salary data. role β Job title (e.g. "Senior Software Engineer") location β Market to look up (e.g. "Bangalore", "San Francisco") yearsOfExperience β 0 to skip currency β e.g. INR, USD β blank to infer from location
export_applicationsExport your pipeline to disk.
Parameters: format β report | csv report: Full Markdown pipeline report with stats and per-application details csv: All fields including status, salary, total comp, contacts, interview rounds, work permit status, legitimacy score outputPath β Custom file path (optional β defaults to data directory)
analyze_job_descriptionAnalyse a raw job description and extract:
match_resume_to_jobCompare your resume against a job description. Returns:
Reads your resume from the configured Resume File Path or accepts inline text.
verify_company_legitimacyScore a company's legitimacy (0β100) before applying. Checks:
Returns a LIKELY LEGITIMATE / UNCERTAIN / SUSPICIOUS / HIGH RISK verdict with red flags, green flags, and a verification checklist.
read_resumeRead and parse a resume file (PDF, TXT, or Markdown). If no path is provided, reads from the configured Resume File Path in plugin settings. Use this first when the user shares a resume path before searching or analysing fit.
generate_cover_letterGenerate a tailored cover letter (under 350 words) with a hook opening, specific company interest, 2β3 achievements with numbers, and a confident close. Reads resume from configured path or inline text.
generate_resume_bulletsGenerate achievement-oriented resume bullet points using the "Accomplished X by doing Y, resulting in Z" format. Accepts rough notes and tailors bullets to a target role.
prepare_interview_questionsGenerate role-specific interview questions with answer frameworks for: phone screen, technical, behavioural, system design, or final rounds.
Track professional contacts independent of specific applications β for building referral pipelines, warming up connections, and managing follow-ups.
manage_networkFull network contact management in one tool.
Parameters: action β add | update | list | log | delete | referrers add / update: id β Required for update name, company, role, email, linkedIn relationship β cold | warm | strong | referrer source β How you met (e.g. "LinkedIn", "conference") targetCompanies β Companies they could refer you to tags β e.g. ["engineering", "hiring-manager"] list: relationship β Filter by strength company β Filter by company tag β Filter by tag search β Keyword search overdueOnly β Show only contacts with overdue follow-ups log: Log an interaction with a contact. id β Contact ID summary β What happened, next steps upgradeRelationship β Bump relationship level (default: false) followUpInDays β Set reminder N days from now linkApplicationId β Link to an application delete: id β Contact ID referrers: Find contacts who could refer you to a company. company β Company name to search for
manage_saved_searchSave, run, list, and delete job search queries.
Parameters: action β save | run | list | delete save: name β Label (e.g. "Backend Engineer Bangalore") query β Role, skills, or keywords location β Location filter jobType β any | full_time | part_time | contract | internship | remote includeInternationalβ Whether to include international boards run: id β Search ID to run (blank = run all) delete: id β Search ID to delete
manage_contactsAdd, remove, or list contacts tied to a specific tracked application (recruiters, hiring managers, referrals). For standalone network contacts not tied to an application, use manage_network.
Parameters: applicationId β Application ID action β add | remove | list name, role, email, linkedIn, notes
job_settingsPlugin configuration helpers.
Parameters: action β location | toggle_intl enable β For toggle_intl: true=enable, false=disable (optional β omit to show current) location: Detect current location via IP-based geolocation (no API key required). Returns city, region, country, coordinates, and suggested search location. Note: uses public IP β VPNs affect accuracy. toggle_intl: Show current international search settings and how to change them. To change globally: set "Open to International Roles" in plugin settings. To override per-search: pass includeInternational: true/false on search_jobs.
check_work_permitFull work permit and visa guide for Indian citizens (or your configured citizenship) for 9 major destination countries.
| Country | Difficulty | Primary Visa | Sponsorship |
|---|---|---|---|
| USA | Very Hard | H-1B (annual lottery) | Required |
| UK | Moderate | Skilled Worker Visa | Required |
| Canada | Moderate | Express Entry / Global Talent Stream | Optional |
| Australia | Moderate | TSS 482 / Skilled Independent 189 | Depends |
| Germany | Moderate | EU Blue Card / Chancenkarte | Required |
| Singapore | Easy | Employment Pass (EP) | Required |
| UAE | Easy | Employment Visa / Green Visa | Required |
| Netherlands | Easy | Highly Skilled Migrant (HSM) | Required |
| Japan | Hard | Engineer Visa / HSP | Required |
Returns visa types, salary thresholds, processing times, eligibility conditions, restrictions, and an action plan. Also runs a live web search for recent policy changes. Optionally saves permit status back to an application record.
daily_briefingMorning check-in: runs follow-ups, stale detection, saved searches, and pipeline stats in one call. Returns a combined briefing with action items.
Parameters: staleDays β Days before flagging an application stale (default: 14) followUpDays β Show follow-ups due within N days (default: 7)
compare_jobsSide-by-side comparison of 2β5 tracked applications. Compares salary, location, status, fit indicators, legitimacy score, contacts, and interview progress.
Parameters: applicationIds β Array of 2β5 application IDs
batch_update_applicationsBulk-update multiple applications at once. Useful for withdrawing stale applications, marking multiple as rejected, or appending notes to a group.
Parameters: applicationIds β Array of application IDs status β New status for all (optional) rejectionReason β Reason to set on all (optional) notes β Notes to append on all (optional)
All data is stored locally in a single JSON file:
~/job-search-data/ applications.json β all tracked applications report-YYYY-MM-DD.md β exported reports (optional)
Each application stores: company, role, location, country, isInternational, status, dates, job description, contacts, salary, total comp, work permit status, and follow-up date.
# 1. Find roles in Bangalore search_jobs(query="Senior Backend Engineer", location="Bangalore") # 2. Find remote-friendly roles search_jobs(query="Senior Backend Engineer", channel="remote") # 3. Find recently funded startups hiring in AI search_jobs(query="ML Engineer", channel="funded", sector="AI research") # 4. Read the full JD fetch_job_page("https://...") # 5. Analyse it analyze_job_description("<paste JD>") # 6. Check your fit match_resume_to_job("<JD>", resumeText="<your resume>") # 7. Save it manage_application(action="add", company="Razorpay", role="Senior SDE-2", location="Bangalore") # 8. Check urgency (posted 2 days ago) application_insights(mode="urgency", postedDate="2 days ago", applicationId="...") # 9. Write cover letter generate_cover_letter(company="Razorpay", role="Senior SDE-2", jobDescription="...") # 10. For a USA role β check visa situation check_work_permit(destinationCountry="USA", role="Senior Backend Engineer") # 11. See everything due for follow-up application_insights(mode="followups", daysAhead=7) # 12. Morning briefing daily_briefing() # 13. Export pipeline report export_applications(format="report")
MIT
This plugin is free and open source. If you find it useful, consider supporting development:
| Tier | Amount | Perks |
|---|---|---|
| β Coffee | $3 | Name in credits |
| π Lunch | $10 | + Priority support |
| π Pizza | $25 | + Name in README |
| π Founding | $50 | + Lifetime support, consultation |
Every coffee helps keep this project alive! β
cd job-search-plugin
npm install
npm run build # compile TypeScript β JS
lms push # push to LM Studio
npm run dev
| Setting | Default | Description |
|---|
| Data Path | ~/job-search-data | Directory where applications.json is stored |
| Resume File Path | (blank) | Path to your resume (plain text or Markdown). Used by match_resume_to_job and generate_cover_letter |
| Max Search Results | 8 | Results returned per search query (3β20) |
| Preferred Job Location | India | Default location for searches when none is specified |
| Home Country | India | Used to detect international roles automatically |
| Citizenship | Indian | Used by check_work_permit to determine visa eligibility |
| Open to International Roles | false | Global toggle β when off, international searches are blocked to keep results focused |
search_jobsSearch for job listings across 7 channels via the channel parameter.
channel | What it searches |
|---|---|
boards (default) | Indian job boards: Naukri, Foundit, Instahyre, IIMJobs, LinkedIn India, Wellfound, Shine. International when location is overseas |
company | Company culture, reviews, recent news, funding, team size, and tech stack |
hidden | Unadvertised opportunities: LinkedIn/Twitter hiring posts, direct career pages, HN Who's Hiring, referral signals |
remote | Remote-friendly boards: Remotive, Remote OK, and global boards |
funded | Recently funded startups (seed β Series C) that are actively hiring |
government | Government and public-sector listings |
academic | Universities, research labs, national labs, and academic institutions |
Parameters: query β Role, skills, or keywords channel β boards | company | hidden | remote | funded | government | academic (default: boards) location β e.g. "Bangalore", "Remote India", "USA" (blank = use setting) includeInternationalβ Override international toggle for this search jobType β any | full_time | part_time | contract | internship | remote max β Max results (overrides plugin setting) strategy β all | hiring_posts | career_pages | referral_network | hn_whoishiring | wellfound | yc_startups | reddit | product_hunt | regional | tech_contract | dev_community source β all | remotive | remoteok | boards (for remote channel) stage β seed | series_a | series_b | series_c | any (for funded channel) sector β Industry/sector filter (e.g. "AI research", "fintech") country β india | usa | uk | australia | eu | canada | all region β global | india | usa | uk | europe | us | eu | remote field β Subject area filter (for academic channel)
fetch_job_pageFetch and parse a job posting page from a URL. Strips HTML and returns clean text. Use after search_jobs to get the full job description before saving it.
scan_portalsSearch ATS-hosted job listings and AI-company portals.
Parameters: mode β single | all single: search one specific portal all: scan across Greenhouse, Ashby, Lever, Workable, and curated AI company boards portal β Portal name or URL (for mode: single) query β Role or keyword filter
All applications are stored in a local applications.json file in your configured data directory.
manage_applicationCreate, update, retrieve, delete applications, and log interview rounds β all in one tool.
Parameters: action β add | update | get | delete | add_interview applicationId β Required for update | get | delete | add_interview For add / update: company, role, url, location, status, jobDescription, notes, salary, nextStep postedDate, followUpDate, totalComp, workPermitStatus, workPermitNotes For add_interview: round β Round name (e.g. "Phone Screen", "Technical Round 1") date β YYYY-MM-DD, defaults to today interviewerName β Name of the interviewer interviewerRole β Title of the interviewer questions β Key questions asked feedback β Your notes on how it went outcome β passed | failed | pending | unknown
list_applicationsList all tracked applications with pipeline stats. Supports filtering by:
status β saved / applied / interview / offer / rejected / withdrawn / allsearch β keyword in company or role nameinternationalOnly β show only cross-border applicationsworkPermitStatus β filter by visa/permit statusapplication_insightsTiming, follow-up, and analytics in one tool.
Parameters: mode β urgency | followups | stale | stats | rejections urgency: Calculate apply urgency from posting date. Accepts natural language ("3 days ago") or YYYY-MM-DD. postedDate β When the job was posted applicationId β Optionally save postedDate + followUpDate back to the record followups: Show applications with a follow-up action due within N days. daysAhead β Days to look ahead (default: 7) stale: Find applications with no activity in N days. staleDays β Days before flagging (default: 14) includeStatuses β Which statuses to check (default: applied, interview) stats: Full pipeline dashboard β counts per status, conversion rates, average days per stage. rejections: Analyse patterns across rejected applications (requires β₯3 rejections).
Urgency reference:
| Days since posted | Urgency | Callback rate |
|---|---|---|
| 0β2 days | CRITICAL | 2β3Γ higher |
| 3β7 days | HIGH | 1.5β2Γ |
| 8β14 days | MEDIUM | ~1Γ |
| 15β30 days | LOW | 0.3β0.6Γ |
| 30+ days | STALE | ~0Γ |
salaryTotal compensation calculator and market rate lookup in one tool.
Parameters: mode β calc | market calc: Calculate true total comp beyond base salary. baseSalary β Annual base bonus β Annual bonus % of base equityValue β Total equity/RSU value vestingYears β Vest period (default: 4) signingBonus β One-time signing bonus benefitsValue β Annual benefits value remoteStipend β Annual remote work stipend currentComp β Current TC to compare against market: Look up current market salary data. role β Job title (e.g. "Senior Software Engineer") location β Market to look up (e.g. "Bangalore", "San Francisco") yearsOfExperience β 0 to skip currency β e.g. INR, USD β blank to infer from location
export_applicationsExport your pipeline to disk.
Parameters: format β report | csv report: Full Markdown pipeline report with stats and per-application details csv: All fields including status, salary, total comp, contacts, interview rounds, work permit status, legitimacy score outputPath β Custom file path (optional β defaults to data directory)
analyze_job_descriptionAnalyse a raw job description and extract:
match_resume_to_jobCompare your resume against a job description. Returns:
Reads your resume from the configured Resume File Path or accepts inline text.
verify_company_legitimacyScore a company's legitimacy (0β100) before applying. Checks:
Returns a LIKELY LEGITIMATE / UNCERTAIN / SUSPICIOUS / HIGH RISK verdict with red flags, green flags, and a verification checklist.
read_resumeRead and parse a resume file (PDF, TXT, or Markdown). If no path is provided, reads from the configured Resume File Path in plugin settings. Use this first when the user shares a resume path before searching or analysing fit.
generate_cover_letterGenerate a tailored cover letter (under 350 words) with a hook opening, specific company interest, 2β3 achievements with numbers, and a confident close. Reads resume from configured path or inline text.
generate_resume_bulletsGenerate achievement-oriented resume bullet points using the "Accomplished X by doing Y, resulting in Z" format. Accepts rough notes and tailors bullets to a target role.
prepare_interview_questionsGenerate role-specific interview questions with answer frameworks for: phone screen, technical, behavioural, system design, or final rounds.
Track professional contacts independent of specific applications β for building referral pipelines, warming up connections, and managing follow-ups.
manage_networkFull network contact management in one tool.
Parameters: action β add | update | list | log | delete | referrers add / update: id β Required for update name, company, role, email, linkedIn relationship β cold | warm | strong | referrer source β How you met (e.g. "LinkedIn", "conference") targetCompanies β Companies they could refer you to tags β e.g. ["engineering", "hiring-manager"] list: relationship β Filter by strength company β Filter by company tag β Filter by tag search β Keyword search overdueOnly β Show only contacts with overdue follow-ups log: Log an interaction with a contact. id β Contact ID summary β What happened, next steps upgradeRelationship β Bump relationship level (default: false) followUpInDays β Set reminder N days from now linkApplicationId β Link to an application delete: id β Contact ID referrers: Find contacts who could refer you to a company. company β Company name to search for
manage_saved_searchSave, run, list, and delete job search queries.
Parameters: action β save | run | list | delete save: name β Label (e.g. "Backend Engineer Bangalore") query β Role, skills, or keywords location β Location filter jobType β any | full_time | part_time | contract | internship | remote includeInternationalβ Whether to include international boards run: id β Search ID to run (blank = run all) delete: id β Search ID to delete
manage_contactsAdd, remove, or list contacts tied to a specific tracked application (recruiters, hiring managers, referrals). For standalone network contacts not tied to an application, use manage_network.
Parameters: applicationId β Application ID action β add | remove | list name, role, email, linkedIn, notes
job_settingsPlugin configuration helpers.
Parameters: action β location | toggle_intl enable β For toggle_intl: true=enable, false=disable (optional β omit to show current) location: Detect current location via IP-based geolocation (no API key required). Returns city, region, country, coordinates, and suggested search location. Note: uses public IP β VPNs affect accuracy. toggle_intl: Show current international search settings and how to change them. To change globally: set "Open to International Roles" in plugin settings. To override per-search: pass includeInternational: true/false on search_jobs.
check_work_permitFull work permit and visa guide for Indian citizens (or your configured citizenship) for 9 major destination countries.
| Country | Difficulty | Primary Visa | Sponsorship |
|---|---|---|---|
| USA | Very Hard | H-1B (annual lottery) | Required |
| UK | Moderate | Skilled Worker Visa | Required |
| Canada | Moderate | Express Entry / Global Talent Stream | Optional |
| Australia | Moderate | TSS 482 / Skilled Independent 189 | Depends |
| Germany | Moderate | EU Blue Card / Chancenkarte | Required |
| Singapore | Easy | Employment Pass (EP) | Required |
| UAE | Easy | Employment Visa / Green Visa | Required |
| Netherlands | Easy | Highly Skilled Migrant (HSM) | Required |
| Japan | Hard | Engineer Visa / HSP | Required |
Returns visa types, salary thresholds, processing times, eligibility conditions, restrictions, and an action plan. Also runs a live web search for recent policy changes. Optionally saves permit status back to an application record.
daily_briefingMorning check-in: runs follow-ups, stale detection, saved searches, and pipeline stats in one call. Returns a combined briefing with action items.
Parameters: staleDays β Days before flagging an application stale (default: 14) followUpDays β Show follow-ups due within N days (default: 7)
compare_jobsSide-by-side comparison of 2β5 tracked applications. Compares salary, location, status, fit indicators, legitimacy score, contacts, and interview progress.
Parameters: applicationIds β Array of 2β5 application IDs
batch_update_applicationsBulk-update multiple applications at once. Useful for withdrawing stale applications, marking multiple as rejected, or appending notes to a group.
Parameters: applicationIds β Array of application IDs status β New status for all (optional) rejectionReason β Reason to set on all (optional) notes β Notes to append on all (optional)
All data is stored locally in a single JSON file:
~/job-search-data/ applications.json β all tracked applications report-YYYY-MM-DD.md β exported reports (optional)
Each application stores: company, role, location, country, isInternational, status, dates, job description, contacts, salary, total comp, work permit status, and follow-up date.
# 1. Find roles in Bangalore search_jobs(query="Senior Backend Engineer", location="Bangalore") # 2. Find remote-friendly roles search_jobs(query="Senior Backend Engineer", channel="remote") # 3. Find recently funded startups hiring in AI search_jobs(query="ML Engineer", channel="funded", sector="AI research") # 4. Read the full JD fetch_job_page("https://...") # 5. Analyse it analyze_job_description("<paste JD>") # 6. Check your fit match_resume_to_job("<JD>", resumeText="<your resume>") # 7. Save it manage_application(action="add", company="Razorpay", role="Senior SDE-2", location="Bangalore") # 8. Check urgency (posted 2 days ago) application_insights(mode="urgency", postedDate="2 days ago", applicationId="...") # 9. Write cover letter generate_cover_letter(company="Razorpay", role="Senior SDE-2", jobDescription="...") # 10. For a USA role β check visa situation check_work_permit(destinationCountry="USA", role="Senior Backend Engineer") # 11. See everything due for follow-up application_insights(mode="followups", daysAhead=7) # 12. Morning briefing daily_briefing() # 13. Export pipeline report export_applications(format="report")
MIT
This plugin is free and open source. If you find it useful, consider supporting development:
| Tier | Amount | Perks |
|---|---|---|
| β Coffee | $3 | Name in credits |
| π Lunch | $10 | + Priority support |
| π Pizza | $25 | + Name in README |
| π Founding | $50 | + Lifetime support, consultation |
Every coffee helps keep this project alive! β
cd job-search-plugin
npm install
npm run build # compile TypeScript β JS
lms push # push to LM Studio
npm run dev