JobTracker is a React/Vite application for managing job applications, comparing role requirements with an editable candidate skill profile, and turning job-description details into visible preparation priorities.
The hosted demo demonstrates application tracking and skill visualization. AI-assisted job extraction runs locally and is not enabled in the public demo.
- Searchable application tracker with stage filters, selected-role details, referral status, notes, and application links.
- Durable browser persistence for roles added, imported, or enriched through the interface.
- Editable candidate skill profile stored locally in the browser.
- Transparent heuristic fit score with required/preferred weighting, common skill aliases, and a requirement-by-requirement explanation.
- Explicit insufficient-information state when a job description has no usable skill requirements.
- CSV sample-data fallback plus JSON import/export for portable, privacy-conscious use.
- Optional local extraction server that renders job postings with Playwright and structures job-description signals through a local Ollama model.
The fit score is intentionally a transparent heuristic, not an AI assessment of a candidate. Each matched required skill contributes 2 points and each matched preferred skill contributes 1 point. The score is the matched weight divided by the available weight, with no artificial minimum or maximum.
Matching is case-insensitive and recognizes a documented set of aliases such as PyTorch / torch, Kubernetes / k8s, and Graph Neural Networks / GNN. The role view shows how every requirement contributed to the result. When no required or preferred skills are available, JobTracker displays Insufficient JD information instead of inventing a score.
- React 18 and Vite
- Express and Cheerio
- Playwright
- Ollama local model endpoint
- Node test runner
- GitHub Actions and GitHub Pages
Install dependencies and start the frontend:
npm install
npm run devRun the automated checks:
npm test
npm run buildThe frontend runs independently as a static application. For optional local job-description extraction, create a local environment file and start the API:
cp .env.example .env
npm run serverThe default configuration expects Ollama at http://localhost:11434 with the qwen3:8b model. Adjust .env for a different local endpoint, model, origin, or network limit.
JobTracker first restores roles and candidate skills from browser localStorage. If no saved roles exist, it looks for private application data at public/myapplications.csv, then falls back to the synthetic dataset at public/myapplications.example.csv.
Recommended CSV shape:
date,company,title,application_link,jobID,stage,username,referral_contact,referral_status,my_notes,resume_file,coverletter_file,working_subjects,strengths,weaknesses,required_skills,preferred_skillsUse Reset sample in the interface to replace browser data with the sanitized example roles.
src/App.jsx: application tracker, browser persistence, candidate profile, score explanation, skill map, and import/export workflow.src/jobUtils.js: CSV parsing, stage normalization, skill aliases, weighted fit scoring, and extraction mapping.server.js: optional local extraction API with URL validation, SSRF controls, CORS restrictions, timeouts, and payload limits.test/jobUtils.test.js: parsing, normalization, aliases, scoring, and extraction-mapping tests.test/server.test.js: malformed URL, page failure, model-output failure, and save-failure API tests..github/workflows/: continuous integration and static-demo deployment.
Real job-search data can contain emails, referral names, private notes, resume filenames, and strategy details. Keep that information out of the public repository. See SECURITY.md for the local-data boundary and backend deployment guidance.
- Add direct editing for existing role fields and application stages.
- Expand configurable skill aliases and scoring weights.
- Add an IndexedDB adapter if browser data grows beyond lightweight use.