Local-first AI job-search agent for Amisha Negi. It parses a resume, maintains a structured profile, discovers jobs, scores matches, generates tailored application material, prepares and auto-applies to eligible jobs, drafts recruiter outreach, and tracks the funnel in a React dashboard.
- FastAPI backend with PostgreSQL-ready SQLAlchemy models.
- React + Vite dashboard for New Jobs, Applied, Interviewing, Rejected, Offers, Follow-ups, and Skipped.
- Resume PDF parser with structured JSON extraction.
- Job discovery adapters for live public job APIs, Greenhouse, Lever, generic company career pages, sample jobs, and Playwright-assisted job boards.
- Explainable 0-100 scoring engine with the default minimum score set to 80.
- Auto-apply eligibility gates for matched skills, salary bracket, experience level, and preferred locations.
- Big-company preference ranking for eligible auto-apply jobs.
- OpenAI-powered resume tailoring, cover letters, recruiter messages, and application answers.
- Local template fallback when
OPENAI_API_KEYis not configured. - SMTP/Gmail outreach adapter with dry-run enabled by default.
- Auto-apply runner that processes high-score jobs, prepares missing material, and uses Playwright for supported forms when live submission is explicitly enabled.
- Docker Compose deployment, schema docs, setup scripts, tests, and example workflows.
cd /Users/amishanegi/ai-job-search-agent
cp .env.example .env
./scripts/setup.sh
docker compose up --buildOpen the dashboard at http://localhost:5173.
The backend API runs at http://localhost:8000/api.
- Put your resume at
data/resumes/Amisha_Resume.pdfor use the one already copied from/Users/amishanegi/Amisha_Resume.pdf. - Start Docker Compose.
- Click
Import Resume. - Click
Run Discovery. - Select a high-scoring job.
- Click
Generate Material. - Click
Prepare Application. - Click
Auto Applyto process high-scoring new jobs. - Click
Draft or Send Outreach.
By default, application submission and outreach are dry-run. This is intentional. Set the environment flags only after you have reviewed the generated material and configured credentials.
Important values in .env:
OPENAI_API_KEY=
OPENAI_MODEL=gpt-5.4-mini
MIN_MATCH_SCORE=80
PREFERRED_SALARY_MIN_LPA=
PREFERRED_SALARY_MAX_LPA=
AUTO_APPLY_REQUIRE_SALARY=true
AUTO_APPLY_MIN_MATCHED_SKILLS=3
BIG_COMPANY_NAMES=airbnb,stripe,databricks,mongodb,hashicorp,postman,vercel,netlify
RUN_SCHEDULER=true
DAILY_DISCOVERY_HOUR=8
DAILY_DISCOVERY_MINUTE=0
DAILY_AUTO_APPLY_ENABLED=true
DAILY_AUTO_APPLY_LIMIT=10
GREENHOUSE_COMPANIES=
LEVER_COMPANIES=
COMPANY_CAREER_URLS=
PUBLIC_JOB_APIS_ENABLED=true
BROWSER_JOB_BOARDS_ENABLED=false
APPLICATION_DRY_RUN=true
REQUIRE_APPLICATION_APPROVAL=true
AUTO_APPLY_ENABLED=false
OUTREACH_DRY_RUN=true
SMTP_USERNAME=
SMTP_PASSWORD=
SMTP_FROM=By default, discovery uses public job APIs plus a small default set of Greenhouse/Lever company boards. Greenhouse and Lever are reliable because they expose public job APIs. Add company slugs:
GREENHOUSE_COMPANIES=stripe,airbnb
LEVER_COMPANIES=netlify,postmanGeneric career pages can be added as comma-separated URLs:
COMPANY_CAREER_URLS=https://example.com/careers,https://example.org/jobsLinkedIn, Wellfound, Instahyre, Naukri, and Indeed are supported through Playwright-assisted browser flows only when explicitly enabled or selected. These sites can require login, captchas, or have changing markup. The project keeps those adapters conservative and configurable rather than bypassing platform controls.
RUN_SCHEDULER=true starts APScheduler inside the backend and runs discovery every day at the configured hour/minute in SCHEDULER_TIMEZONE.
For system-level scheduling, run:
docker compose up -dThe backend process will keep the daily job active.
curl -X POST http://localhost:8000/api/profile/resume/import-local
curl -X POST http://localhost:8000/api/jobs/discover -H 'Content-Type: application/json' -d '{"limit": 60}'
curl http://localhost:8000/api/jobs?min_score=80
curl -X POST http://localhost:8000/api/jobs/1/generate-artifacts
curl -X POST http://localhost:8000/api/jobs/1/apply/prepare
curl -X POST http://localhost:8000/api/applications/auto-apply -H 'Content-Type: application/json' -d '{"limit": 10}'cd backend
python -m pytestFrontend build:
cd frontend
npm run build- The agent rejects jobs below 80 by setting them to
skipped. - Auto Apply requires role/location fit, minimum matched skills, experience fit, and salary fit before submission.
- Salary checks use INR LPA. If
AUTO_APPLY_REQUIRE_SALARY=true, jobs without listed salary are skipped. - Eligible jobs at larger companies are attempted first using
BIG_COMPANY_NAMESplus built-in large-company heuristics. - Outreach is dry-run unless SMTP credentials are configured and
OUTREACH_DRY_RUN=false. - Auto Apply prepares applications in safe mode by default. Real submission requires
AUTO_APPLY_ENABLED=true,APPLICATION_DRY_RUN=false, andREQUIRE_APPLICATION_APPROVAL=false. - Browser automation does not bypass captchas, paywalls, or login controls.