{"slug": "show-hn-job-finder-india-an-honest-job-fit-tool-that-runs-in-your-ai-cli", "title": "Show HN: Job Finder India – an honest job-fit tool that runs in your AI CLI", "summary": "Job Finder India, an open-source command-line tool by developer Harsh Garg, scores jobs 0–5 against a user's résumé and tells candidates when not to apply, treating seniority or function gaps as disqualifiers. The tool runs entirely on the user's machine, holds no AI API key, and uses the AI CLI's own model for scoring, with no auto-apply, no stealth scraping, and no credential handling.", "body_md": "**The job-search tool that tells you the truth about fit — it says \"don't apply\" when it's a no.**\n\nMost AI matchers are optimists: a 70%-there role becomes \"4.7/5, great match, here's how to frame\nyour gaps.\" That wastes your time and the recruiter's. Job Finder India scores each job **0–5**\nagainst your résumé, treats a gap in seniority or function as a **disqualifier**, and cites the exact\nrésumé line ↔ job requirement behind every verdict. Fewer, better applications.\n\nRuns entirely on your machine. Your résumé never leaves it, and **the app holds no AI API key** —\nscoring runs inside the AI CLI you already use.\n\n### 👉 New here? Start with [GETTING_STARTED.md](/harshgarg95/job-finder-india/blob/main/GETTING_STARTED.md) — the step-by-step guide.\n\n[GETTING_STARTED.md](/harshgarg95/job-finder-india/blob/main/GETTING_STARTED.md)\n\nScoring happens **in-session with your CLI's model**, so the model *is* the scorer. That makes this\nchoice matter more than anything else in setup.\n\n| CLI | Status | Notes |\n|---|---|---|\nClaude Code |\n✅ Recommended |\nFull flow verified end-to-end. Best verdict quality and multi-step reliability. |\nGitHub Copilot |\nVerified in-session. On Free/Student the model is \"Auto\"-only, which may route to a small model: expect weaker verdicts and occasional partial runs. On paid plans pick GPT-5 or Claude Sonnet/Opus. |\n|\nCodex |\nIts sandbox blocks network by default, so discovery fails (the tool says so loudly rather than reporting \"0 jobs\"). Enable network access, and prefer a stronger model. |\n|\n| opencode · qwen | ▫️ Runs once authed | CLI-agnostic (Bash + files); not as thoroughly exercised. |\n| Antigravity | ▫️ Desktop app | Legacy Gemini CLI → Antigravity. |\n\nA small/default model is a *quality* limit, not a blocker — the tool proceeds either way and warns\nonce. It also refuses to present a partial run as complete: if scoring stops early you get a\n**\"Scored N of M — incomplete\"** banner, never a silently short list.\n\n```\ngit clone https://github.com/harshgarg95/job-finder-india && cd job-finder-india\npip install -r requirements.txt\npython -m jobfinder onboard      # one-time setup — asks for your résumé, writes your profile\n# then open this folder in your AI CLI and say:  find me jobs\n```\n\nThat's the whole interface. Full detail, troubleshooting, and optional API keys are in\n** GETTING_STARTED.md**.\n\nReview results in the browser at any time:\n\n```\npython -m jobfinder dashboard    # local page at http://127.0.0.1:8755 (Ctrl-C to stop)\n```\n\n**No auto-apply, ever.** It recommends; you decide and click Submit. It never applies for you.**No stealth scraping and no bot-block evasion.** Discovery and JD fetch use free public ATS JSON endpoints — documented APIs for Greenhouse/Lever/Ashby/Workable/SmartRecruiters; for Workday, the same public keyless endpoints its own careers pages use — plus official APIs (Adzuna). If a site blocks automation, it is**detected and skipped**— never worked around.** No credential handling.**It never asks for, stores, or uses your job-board logins. Optional discovery keys live in your own`.env`\n\nand are sent only to that provider's API.**No invented experience.** A high score must be earned by evidence already in your résumé.**No spray-and-pray.** It is a filter, not a firehose.\n\nThe app holds **no scoring API key** — scoring cost is whatever your own AI CLI plan already charges\n(often zero on an existing subscription; genuinely $0 if you point a local-capable CLI at Ollama).\n\nDiscovery is free by default: the **public ATS scan needs no key**. Optional channels (Adzuna,\nJSearch) use *your* free tiers, with a per-run request cap and a persisted monthly counter — when a\ntier is exhausted or a `429`\n\nlands, that channel pauses and discovery degrades to the free floor.\nApify deep-mode is **off by default** and bills to your own account if you enable it.\n\nVolume is bounded by design: a deterministic prescreen cuts candidates to a few dozen\n(`config/run.yml`\n\n→ `prescreen.max_llm_jobs`\n\n, default 40) and only the top\n`scoring.full_score_top_n`\n\n(default 15) are fully scored. **A run cannot balloon into thousands of\ncalls.** Every run prints the funnel (`candidates → prescreened → scored`\n\n) and the free-tier left.\n\n**Your AI login is never touched.** Scoring runs inside the AI CLI you already use, under that assistant's own login — this tool never sees, stores, or transmits your model credentials, and holds no AI API key of its own.**Job data comes from APIs, not scraping.** Free public APIs — documented ATS APIs, the official Adzuna API; for Workday, the public keyless endpoints its own careers pages use — plus optional third-party APIs you enable with your own keys (JSearch, SerpAPI, Apify) that do their own collection under their own terms. Sites that block bots are**detected and skipped**— never scraped around.** Your résumé, profile, and results stay on your machine.**`resume.md`\n\n,`config/profile.yml`\n\n,`config/preferences.yml`\n\n,`.env`\n\n, and everything under`data/`\n\nare**gitignored**— never committed, never uploaded. The only content that leaves your computer is the job text your own AI CLI reads in order to score, under that CLI's terms.**Adzuna job links include your Adzuna app id** as a URL parameter — Adzuna requires it for the link to resolve. If you share raw results (`top.md`\n\n,`scored.jsonl`\n\n, screenshots) publicly, that id is visible. It is the non-secret half of Adzuna's credential pair; your app key is never written to any file or URL.\n\nFull statement: [NOTICE](/harshgarg95/job-finder-india/blob/main/NOTICE) · [DATA_CONTRACT.md](/harshgarg95/job-finder-india/blob/main/DATA_CONTRACT.md).\n\n```\nrésumé + profile ─▶ DISCOVERY ─▶ dedup + India/keyword filter ─▶ deterministic PRESCREEN\n                                                                  (title · seniority · function ·\n                                                                   location — the volume cap)\n                                          ─▶ HONEST SCORING in your CLI (prompts/_rubric.md is the law)\n                                          ─▶ data/results/top.md  +  data/tracker.md\n```\n\nYour CLI reads [ AGENTS.md](/harshgarg95/job-finder-india/blob/main/AGENTS.md) +\n\n[and calls small deterministic Python tools (](/harshgarg95/job-finder-india/blob/main/modes)\n\n`modes/`\n\n`doctor`\n\n, `discover`\n\n, `prescreen`\n\n, `enrich`\n\n, `tracker`\n\n, `live`\n\n) for the plumbing — then does\nthe judging itself. Nothing is scored that the tool could not actually read: unreadable postings go\nto a **\"Couldn't verify\"** bucket instead of being guessed at.\n\n**It learns from your corrections.** Mark a role **Applied / Interested / Not suitable (+reason)** in\nthe dashboard (or `python -m jobfinder feedback --job <id> --action wrong_location`\n\n). Corrections\npersist to `data/feedback.jsonl`\n\n, are derived into a preference layer, and replay into the next run's\nprescreen — already-decided jobs drop out and repeat-rejected patterns are down-ranked (never\nhidden). The rubric itself never changes.\n\nThe primary mode is the prompt-pack above. A separate batch path exists for automation:\n\n```\npython -m jobfinder doctor                            # setup check\npython -m jobfinder --resume resume.md --cli claude   # headless ranked top-N\n```\n\nBuilt openly on good prior art, reimplemented from scratch (no copied files):\n\n(MIT) — the CLI-agnostic markdown-prompt scoring model, rubric-with-citations, and the User-Layer/System-Layer data contract are inspired by it. Job Finder India deliberately[career-ops](https://github.com/santifer/career-ops)*inverts*its optimistic scoring: where career-ops coaches you to apply, this is built to tell you the honest \"no.\"— the optional BYO-token deep-discovery layer.[Apify](https://apify.com)\n\nIndependent projects; Job Finder India is not affiliated with or endorsed by them.\n\n[MIT](/harshgarg95/job-finder-india/blob/main/LICENSE) © 2026 Harsh Garg.", "url": "https://wpnews.pro/news/show-hn-job-finder-india-an-honest-job-fit-tool-that-runs-in-your-ai-cli", "canonical_source": "https://github.com/harshgarg95/job-finder-india", "published_at": "2026-07-29 13:11:07+00:00", "updated_at": "2026-07-29 13:22:37.912064+00:00", "lang": "en", "topics": ["ai-tools", "developer-tools", "artificial-intelligence"], "entities": ["Harsh Garg", "Job Finder India", "Claude Code", "GitHub Copilot", "Codex", "Greenhouse", "Lever", "Workday"], "alternates": {"html": "https://wpnews.pro/news/show-hn-job-finder-india-an-honest-job-fit-tool-that-runs-in-your-ai-cli", "markdown": "https://wpnews.pro/news/show-hn-job-finder-india-an-honest-job-fit-tool-that-runs-in-your-ai-cli.md", "text": "https://wpnews.pro/news/show-hn-job-finder-india-an-honest-job-fit-tool-that-runs-in-your-ai-cli.txt", "jsonld": "https://wpnews.pro/news/show-hn-job-finder-india-an-honest-job-fit-tool-that-runs-in-your-ai-cli.jsonld"}}