← Back to Projects

HeadHunter

AI-powered job search assistant that helps people find better-fit roles faster, with smarter resume matching and cleaner tracking.

Overview

HeadHunter helps job seekers cut through overwhelming listings by surfacing opportunities that actually match their profile. Instead of endless manual filtering, users can upload a resume, get tailored matches, and manage promising roles in one place. What makes it stand out is the mix of speed and personalization: it feels simple to use while doing meaningful matching work behind the scenes.

Demo

No live demo available for this project. See the repo for setup and run instructions.

Description

The stack is FastAPI + Uvicorn, with the root route serving frontend/index.html and static assets. JobScraper pulls from sources defined in config.py (GitHub internship lists, Indeed, LinkedIn, Glassdoor, WayUp, etc., enabled per ENABLED_SOURCES). Internship mode prioritizes GitHub-sourced listings to avoid brittle anti-bot pages; other sites use requests, BeautifulSoup, rotating fake_useragent headers, and configurable delays. After collection, jobs are filtered and ranked by keyword overlap, then written through Database to jobs.db with fields such as title, company, location, description, source, remote flags, and extracted skills.

Search vs refresh POST /api/search queries existing rows via get_jobs_by_criteria; it does not scrape on every keystroke. A force_refresh flag schedules scraper.scrape_jobs as a FastAPI BackgroundTasks job so ingestion happens asynchronously.

Resume and matching GeminiResumeParser (see gemini_resume_parser.py) uses Gemini 1.5 Flash with a JSON-schema-style prompt to extract skills, experience years, technologies, education, certifications, and confidence. POST /api/upload-resume accepts uploads; POST /api/resume-job-match aligns that structured profile to stored jobs. Saved listings use /api/jobs/{id}/save, /api/saved-jobs, and DELETE to unsave.

Operations A cache_manager backs optional caching; /api/cache/stats, clear, and clear-expired expose maintenance. /api/stats and POST /api/refresh support monitoring and bulk refresh. Environment variables cover GEMINI_API_KEY, DB path, host/port, scrape delays, and rate limits; Docker and production Uvicorn deployment are documented in the repo.

Implementation

Entry and routing: main.py mounts CORS, instantiates Database, JobScraper, and GeminiResumeParser, and registers JSON APIs for search, job CRUD-style reads, saved jobs, resume upload and matching, target-field jobs, refresh endpoints, and cache. Static files are served for the SPA-like frontend.

Scraper internals: job_scraper.py implements per-source handlers (e.g. GitHub internship JSON/HTML), merges results, deduplicates, applies salary/remote/experience filters from Config, and ranks by relevance to supplied keywords. Selenium was removed in favor of HTTP parsing for Python 3.13 compatibility.

Testing: The tests/ suite covers app routes, resume upload, search, scraping modes, and Gemini integration (see README for pytest commands).

Tech & tools

  • Python
  • FastAPI
  • Uvicorn
  • Google Gemini
  • SQLite
  • BeautifulSoup
  • Requests
  • Docker

Highlights

  • FastAPI API-first design: DB-backed search; scrape on demand via background refresh
  • Gemini 1.5 Flash extracts structured resume fields for skill overlap scoring
  • Multi-source scraper with GitHub-first internship path and respectful rate limits
  • Saved jobs, stats, cache controls, and Docker/Uvicorn deployment path

More projects

tinyTemp

Custom tiny temperature monitor that evolved from an ATmega328P prototype into a compact ATtiny85 OLED PCB.

Award winning

WorldWide Rover

Award-winning internet-controlled rover that lets users drive and monitor a physical robot from anywhere in real time.

BareTag Tool Tracker

Smart tool tracking that helps teams instantly find equipment, prevent loss, and stay coordinated in real time.

Buffet

Automated trading system that tests strategies, learns from market behavior, and executes decisions with built-in risk controls.

Meal Planner

Personal meal planning app that turns “what should I cook?” into a clear weekly routine with pantry awareness and shopping support.

BrickVision

Turns ideas or 3D models into buildable LEGO-style instructions, making custom creations faster and more accessible.

Pong on Assembly

Classic Pong rebuilt from the ground up in hardware and low-level assembly, showing full-stack systems engineering in action.

Custom Single-Cycle 32-Bit Processor

From-scratch 32-bit processor design that brings core computer architecture concepts to life in working hardware.

ThreadLib Disk Scheduler

C++ user-level threading library paired with a concurrent disk scheduler that coordinates requester threads and SSTF service.

Multilateration 3D Positioning

3D location engine that estimates where an object is in space and validates accuracy through realistic simulation.

RISC-V Encryption

Encryption concepts implemented at the hardware-software boundary, showing security logic at instruction level detail.

PUF Tester

Hardware security testing toolkit for measuring unique device fingerprints and reliability under real test conditions.

tinyTemp

Custom tiny temperature monitor that evolved from an ATmega328P prototype into a compact ATtiny85 OLED PCB.

Award winning

WorldWide Rover

Award-winning internet-controlled rover that lets users drive and monitor a physical robot from anywhere in real time.