AI-powered job search assistant that finds roles matching your background.
Upload your resume, get personalized job matches, and generate custom cover letters.
| Feature | Description |
|---|---|
| Resume Analysis | AI-powered parsing extracts skills, experience, tech stack, and job history |
| Smart Matching | Transparent, evidence-based fit scores (0-100) with detailed rationale |
| Cover Letters | Customized drafts for each role using your personal template |
| Privacy First | Your resume stays on your device. We never store your personal data. |
| Markdown Export | Download results as markdown for easy reference and application tracking |
- Upload Resume - Drop in your resume (PDF, TXT, or MD). AI parses your skills and experience.
- Configure Search - Set target roles, locations, work preferences, and salary range.
- Get Scored Matches - Each job receives a transparent fit score with matched/missing skills analysis.
- Download & Apply - Get custom cover letters for top matches. Export everything as markdown.
- Node.js 18+
- pnpm 10+
# Clone the repository
git clone https://github.com/agenisea/scouter.git
cd scouter
# Install dependencies
pnpm install
# Copy environment template
cp .env.local.example .env.local
# Add your API keys to .env.local
# Then start the development server
pnpm devOpen http://localhost:3000.
Create a .env.local file with:
# Required: OpenAI API key for resume parsing, fit analysis, and cover letter generation
OPENAI_API_KEY=sk-...
# Required: RapidAPI key for JSearch job aggregation
RAPIDAPI_KEY=...
# Optional: Comma-separated list of job sites to ignore
IGNORED_JOB_SITES=| Command | Description |
|---|---|
pnpm dev |
Start development server |
pnpm build |
Build for production |
pnpm start |
Start production server |
pnpm lint |
Run ESLint |
You can place default files in the project root to skip wizard steps:
Place your resume as RESUME.pdf in the project root. The app will automatically detect and use it.
Place your cover letter template as COVER_LETTER_TEMPLATE.md in the project root for generating personalized cover letters.
scouter/
├── RESUME.pdf <-- Your resume
├── COVER_LETTER_TEMPLATE.md <-- Your template
├── package.json
└── ...
The template uses placeholders that get filled in by AI:
Dear Hiring Team,
I'm excited to apply for the {{ROLE_TITLE}} at {{COMPANY_NAME}} {{OPENING_HOOK}}
{{EXPERIENCE_HIGHLIGHT_1}}
{{EXPERIENCE_HIGHLIGHT_2}}
{{SKILLS_BRIDGE}}
{{CLOSING}}
Sincerely,
{{CANDIDATE_NAME}}| Placeholder | Description |
|---|---|
{{COMPANY_NAME}} |
Target company name |
{{ROLE_TITLE}} |
Job title being applied for |
{{OPENING_HOOK}} |
Why this role/company excites you |
{{EXPERIENCE_HIGHLIGHT_1}} |
Primary relevant experience |
{{EXPERIENCE_HIGHLIGHT_2}} |
Secondary experience or projects |
{{SKILLS_BRIDGE}} |
Your approach/philosophy |
{{CLOSING}} |
Role-specific value proposition |
{{CANDIDATE_NAME}} |
Your name |
Each job receives scores (0-100) across four dimensions:
| Dimension | What it measures |
|---|---|
| Skills Match | Required skills you have vs. missing |
| Experience Match | Relevant work history alignment |
| Tech Stack Match | Technologies/tools overlap |
| Seniority Fit | Level alignment (junior/mid/senior/staff) |
| Score | Meaning |
|---|---|
| 90-100 | Exceptional fit, exceeds requirements |
| 80-89 | Strong fit, meets all key requirements |
| 70-79 | Good fit, meets most requirements |
| 60-69 | Moderate fit, some gaps |
| Below 60 | Weak fit, significant gaps |
- No server storage - Resume and template are cached in browser localStorage only
- Transient processing - Files sent to APIs for analysis are not persisted
- No tracking - Beyond basic Vercel Analytics for page views
- Local results - Search results saved in localStorage, not on servers
- Framework: Next.js 16 (App Router)
- AI: Vercel AI SDK + OpenAI GPT-4o-mini
- Jobs API: JSearch (via RapidAPI)
- Styling: Tailwind CSS 4 + shadcn/ui
- State: React Context + localStorage
Resume Upload → Parse → Search Jobs → Analyze Fit → Generate Cover Letters → Export
| Route | Purpose |
|---|---|
/api/parse-resume |
Extract profile from resume |
/api/search-jobs |
Search JSearch API for listings |
/api/analyze-fit |
Score job fit with rationale |
/api/generate-cover-letter |
Create personalized cover letter |
/api/defaults |
Check for default files |
JSearch aggregates listings from Indeed, LinkedIn, Glassdoor, ZipRecruiter, Monster, and Wellfound.
Issues and pull requests are welcome.
This project is released under the MIT License.
Built by Agenisea™
© 2026 Patrick Peña / Agenisea™. All text and original written content is protected by copyright.