Skip to content

vesaias/JobNavigator

Repository files navigation

JobNavigator

Self-hosted job search automation — scrape any career portal or use job aggregator, AI scoring against your profile, resume tailoring with custom themes, Telegram notifications and tracking in one system.

JobNavigator Demo

How It Works

┌─────────────────────────────────────────────────────────────────────────────┐
│                              JOB DISCOVERY                                  │
│                                                                             │
│   Career Pages        │  Aggregators            │  Chrome Extension         │
│                       │                         │                           │
│   Any site via        │  JobSpy: LinkedIn,      │  Passive LinkedIn         │
│   Playwright          │  Indeed, ZipRecruiter,  │  capture while            │
│                       │  Google Jobs            │  browsing                 │
│   11 ATS endpoints:   │                         │                           │
│   Workday, Greenhouse │  LinkedIn Personal      │  Save any job from        │
│   Lever, Ashby,       │  collections            │  any page                 │
│   Oracle, Phenom,     │                         │                           │
│   TalentBrew, Rippling│  Levels.fyi             │                           │
│   SmartRecruiters,    │                         │                           │
│   + custom            │                         │                           │
│                       │                         │                           │
└───────────────────────┴────────────┬────────────┴───────────────────────────┘
                                     │
                                     ▼
┌─────────────────────────────────────────────────────────────────────────────┐
│                                PROCESSING                                   │
│                                                                             │
│   Dedup ────── URL-hash dedup, tracking params stripped                     │
│   Filters ──── Title / company include & exclude, body exclusion phrases    │
│   H-1B ─────── Company LCA data from MyVisaJobs (cached)                    │
│   Salary ───── Extracted from posting, H-1B data, description               │
│                                                                             │
└────────────────────────────────────┬────────────────────────────────────────┘
                                     │
                                     ▼
┌─────────────────────────────────────────────────────────────────────────────┐
│                                 JOB FEED                                    │
│                                                                             │
│   Review ───── Dynamic filters, sorting, detail panel                       │
│   Decide ───── Save promising jobs, skip the rest, score with AI            │
│                                                                             │
└────────────────────────────────────┬────────────────────────────────────────┘
                                     │
                                     ▼
┌─────────────────────────────────────────────────────────────────────────────┐
│                             AI RESUME SCORING                               │
│                                                                             │
│   Providers ── Claude API, Claude CLI, OpenAI, Ollama, OpenAI-compatible    │
│   Depths ───── Light (scores only) or Full (report + keyword analysis)      │
│   Multi ────── Score against multiple resumes, compare fit per role         │
│                                                                             │
└────────────────────────────────────┬────────────────────────────────────────┘
                                     │
                                     ▼
┌─────────────────────────────────────────────────────────────────────────────┐
│                          RESUME + COVER LETTER                              │
│                                                                             │
│   Templates ── 8 resume + 8 cover-letter, auto-discovered (add your own)    │
│   AI Tailor ── Rewrites resume bullets/keywords from the scoring report     │
│   AI Letter ── Job-specific cover letters from resume + JD, voice presets   │
│   Export ───── PDF via Playwright, page count indicator                     │
│                                                                             │
└────────────────────────────────────┬────────────────────────────────────────┘
                                     │
                                     ▼
┌─────────────────────────────────────────────────────────────────────────────┐
│                                  TRACK                                      │
│                                                                             │
│   Tracer ───── Unique links per resume/letter, tracks who opened them       │
│   Gmail ────── Auto-detects responses, updates application status           │
│   Telegram ─── Job alerts, daily digest, scrape health notifications        │
│                                                                             │
└─────────────────────────────────────────────────────────────────────────────┘

Features

Feature Description
Multi-Source Discovery 6 scraping tiers: career pages (Playwright + 11 ATS), JobSpy (4 boards), LinkedIn Personal, Levels.fyi, Jobright.ai, Chrome Extension
AI Resume Scoring Multi-provider (Claude, OpenAI, Ollama), light/full depth, per-resume comparison, keyword analysis, requirement mapping, ATS tips. Prompt caching on Anthropic cuts repeat-scoring cost ~50%.
Resume Builder 8 templates (auto-discovered - add yours), AI tailoring per job, PDF export, tracer links to track opens (cover letters too)
Cover Letters AI-generated per job, grounded in the paired resume + persona; editable voice presets, 8 templates, PDF export, prompt-cached generation
Smart Dedup URL-hash dedup with configurable tracking-param stripping; content hash stored per job for cross-source matching
Job Feed Filters, sorting, keyboard shortcuts (j/k/s/x/e), scoring reports, bulk operations, in-app job preview
Application Board Kanban pipeline with drag-and-drop, status transition history
Chrome Extension Passive LinkedIn capture + save any job from any page
Gmail Monitor OAuth2 polling, auto-classifies responses, updates application status
Telegram Alerts New job alerts, daily digest, scrape health, inline action buttons
H-1B Data Company LCA lookups from MyVisaJobs, JD exclusion scanning
Scheduling Cron-based: scraping, email checks, backups, cleanup, auto-reject
Dark Mode Full Tailwind dark mode across all pages

Note on the Job Feed preview pane: the detail panel renders the live job posting in an iframe. Many career sites block being framed (via X-Frame-Options / CSP frame-ancestors, or cross-origin scripts that fail when embedded), so the in-app preview works best with a browser extension that strips frame-blocking headers (e.g. an "ignore X-Frame-Options" extension). Without one, some postings show blank — use the "Open" button to view them in a new tab. Applied jobs fall back to a cached snapshot that always renders.

Quick Start

git clone https://github.com/vesaias/JobNavigator.git
cd JobNavigator
cp .env.example .env
# Edit .env if needed (optional — API keys can be set from dashboard)

docker compose up --build -d

Open http://localhost. On first run, click "Sign In" with a blank API key to proceed. Set a real key from Settings > General once you've accessed the dashboard.

First steps:

  1. Settings > AI tab — configure your LLM provider and API key
  2. Companies — activate a few seed companies or add your own
  3. Searches — configure a keyword search or activate LinkedIn Personal
  4. Resumes — create your resume (or import an existing PDF); it powers AI scoring

Chrome Extension ("The Navigator")

  1. chrome://extensions/ → Developer mode → Load unpacked → select extension/
  2. Toggle LinkedIn capture on, browse job collections
  3. Click "Send to JobNavigator" to import

Optional Integrations

Telegram — Create bot via @BotFather, set token in .env, enter chat ID in Settings.

Gmail — Run python backend/gmail_oauth_setup.py, set OAuth credentials in .env.

Tech Stack

Layer Technology
Backend Python 3.12, FastAPI, SQLAlchemy, APScheduler, Playwright
Frontend React 18, Tailwind CSS, Vite, Recharts
Database PostgreSQL 16
Infrastructure Docker Compose, Caddy, nginx
AI Anthropic SDK, OpenAI SDK, Ollama, Claude Code CLI
Extension Chrome Manifest V3

Contributing

PRs welcome — see CONTRIBUTING.md. Easy wins: new ATS scrapers, new resume templates, UI polish.

Security

Found a vulnerability? See SECURITY.md. Please don't open public issues for security bugs.

Privacy

JobNavigator is self-hosted — NOT a hosted service. Your resume, job data, and credentials stay on your machine. Data is sent only to the AI provider you configure. We do not collect, store, or have access to any of your data.

Disclaimer

Personal and educational use only. Not affiliated with LinkedIn, Indeed, Jobright.ai, or any job platform. Some scraping features are disabled by default and require explicit opt-in. You are responsible for complying with the Terms of Service of any platform you interact with. See LEGAL_DISCLAIMER.md.

License

MIT

Releases

No releases published

Packages

 
 
 

Contributors