An open API service indexing awesome lists of open source software.

https://github.com/eric-esoteric/job-hunter-ai

🎯 Job Hunter AI β€” ΠΏΠ΅Ρ€ΡΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ ИИ-ассистСнт для автоматичСского отсСва вакансий ΠΈ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ ΡΠΎΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… писСм.
https://github.com/eric-esoteric/job-hunter-ai

ai automation chrome-extension gemini job-search parser python tkinter webhooks

Last synced: 1 day ago
JSON representation

🎯 Job Hunter AI β€” ΠΏΠ΅Ρ€ΡΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ ИИ-ассистСнт для автоматичСского отсСва вакансий ΠΈ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ ΡΠΎΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… писСм.

Awesome Lists containing this project

README

          


πŸ‡¬πŸ‡§ English | πŸ‡·πŸ‡Ί Русский


Job Hunter AI Logo

Job Hunter AI


Your personal AI recruiter, working for you 24/7


Python
Release
Platform
License

---

**Job Hunter AI** is not just a script. It's a full-featured AI assistant that analyzes job listings directly in your browser, ruthlessly filters out garbage, and writes targeted cover letters β€” while you focus on actually preparing for interviews.




⚑ Why this will change your routine



  • πŸ’° 100% Free β€” runs on your own API keys, including the free Gemini tier

  • πŸ›‘οΈ Hard filter β€” up to 60% β€” scam, MLM, 60h/week slavery, and info-business don't get through

  • ✍️ Cover letter in seconds β€” a personalized response matched to the exact job requirements

  • 🌐 Cloud or your PC β€” Gemini, GPT-5, Claude 4 or locally via Ollama / LM Studio

  • πŸ”’ Full privacy β€” with local AI, your data never leaves your machine

  • 🌍 EN / RU β€” fully localized interface, language persists between sessions




Job Hunter AI Interface




## βš™οΈ Quick Start

Install the desktop application and the Chrome extension. Full step-by-step guide:

[![Installation Guide](https://img.shields.io/badge/βš™οΈ_Setup-Read_the_guide-00B981?style=for-the-badge&logo=readme)](docs/INSTALL.md)


✨ Full feature breakdown




🧠 Multi-engine AI cascade with Failover

Automatic switching between Gemini 3.5, GPT-5, Claude 4, DeepSeek, and local models. If the primary provider is unavailable β€” the next one takes over without dropping the task.



🏠 Local AI β€” no internet, no API keys

Native HTTP integration with Ollama and LM Studio. A background probe monitors server availability and reflects status in the UI (neon cyan / muted red). LOCAL_SAFE_PARAMS compensate for artifacts in quantized 4-bit models.


Job Analysis



πŸ›‘οΈ Two-stage AI analysis

Stage 1 β€” Filter: Detects scam, MLM, toxic work conditions (>45h/week, uncompensated night shifts, info-business, mass hiring). Plus geographic compliance β€” filters out offers that prohibit remote work from your country.

Stage 2 β€” Cover letter: Only for approved listings. A targeted response addressing the employer's real pain points β€” no filler, no templates.



πŸ”§ 5-level JSON repair pipeline

The parser automatically recovers malformed LLM responses: strips Markdown wrappers, cleans trailing commas, fixes boolean literals and broken quotes. No result is ever lost due to model formatting quirks.


Filtering



πŸ“„ Resume history and PDF import

The πŸ“‚ button in the main window lets you save multiple resume versions and switch between them in one click. Direct PDF import with AI text extraction is supported.



πŸ”” Telegram-style toast notifications

No system dialogs. Animated notifications slide in from the bottom of the screen, respect the Windows taskbar height, and never block the interface. Left color bar: neon cyan for success, bright red for alerts. Audio plays in a dedicated thread.


Interface



🌍 Full localization (EN / RU)

Language is switched in settings and saved to config.json. The entire interface β€” buttons, messages, errors, counters β€” passes through a single jh_i18n.py module with named variable substitution.



⚑ Flicker-free smart UI

Child windows open at alpha=0.0, compute their coordinates for the current DPI, and appear only after the frame is fully rendered β€” no position jumps, no flickering. The vacancy list updates incrementally: only changed cards are re-rendered. Dark title bar and icon are set via Win32 API.


Results


---

πŸ—ΊοΈ Architecture diagram (How it works under the hood)



β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ CHROME BROWSER β”‚
β”‚ (User clicks in the extension) β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β”‚ HTTP POST ( vacancy_data )
β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ LOCAL FLASK API β”‚ [main_app.py]
β”‚ (Kills zombie processes on port 5000) β”‚ jh_version.py β†’ build metadata
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β”‚ Enqueues task (.put)
β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ THREAD-SAFE QUEUE β”‚ [queue.Queue]
β”‚ 15s Timer | Rate Limit Guard β”‚ Countdown status bar
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β”‚ Background thread β†’ task
β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ MULTI-ENGINE AI CASCADE β”‚ [src/jh_ai_engine.py]
β”‚ Gemini 3.5 βž” GPT-5 βž” Claude 4 βž” β”‚ Failover Chain
β”‚ DeepSeek βž” Ollama βž” LM Studio β”‚ 5-level JSON repair
β”‚ β”‚ Exception hierarchy
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ LOCAL_SAFE_PARAMS
β”‚ β”‚
β”Œβ”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ STAGE 1 β”‚ β”‚ STAGE 2 β”‚
β”‚ Hard filter β”‚ β”‚ Cover letter β”‚
β”‚ (up to 60%) β”‚ β”‚ generation β”‚
β”‚ Toxic cond. β”‚ β”‚ (approved only)β”‚
β”‚ Geo-complianceβ”‚ β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β”‚ REJECTED β”‚ APPROVED
β””β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ JH STORAGE MANAGER β”‚ [src/jh_storage_manager.py]
β”‚ AppData/Roaming/Job Hunter AI/ β”‚ Resume history | PDF import
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ Log: max 50 entries
β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ JH UI + NOTIFICATIONS β”‚ [src/jh_results_ui.py]
β”‚ Signature cache | HiDPI | Dark Win32 β”‚ [src/jh_notifications.py]
β”‚ Hotkeys (RU/EN keyboard layouts) β”‚ Toast animations | Audio thread
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β”‚
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ jh_i18n.py (EN/RU)β”‚ Declarative localization
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

---

πŸ› οΈ Tech Stack

| Layer | Tools |
|---|---|
| **GUI & OS** | `customtkinter` Β· `Pillow` Β· `ctypes` Win32 API β€” dark title bar, `WM_SETICON`, DPI Awareness, cross-layout hotkeys |
| **Localization** | `jh_i18n.py` β€” declarative EN/RU system with named variable substitution via `tr(key, **kwargs)` |
| **Local API** | `Flask` Β· `flask-cors` Β· `threading` Β· `queue.Queue` β€” thread-safe webhook receiver from Chrome |
| **AI Cascade** | **Gemini 3.5/3.0** Β· **GPT-5 / o3** Β· **Claude 4** Β· **DeepSeek** (chat / reasoner) Β· **Ollama** Β· **LM Studio** |
| **Resilience** | Failover Chain Β· Exponential Backoff Β· 5-level JSON parser Β· Exception hierarchy (`AINetworkError`, `AILocalServerError`, `AITimeoutError`, `AIAuthError`, `AIRateLimitError`) |
| **Local AI** | HTTP integration Ollama / LM Studio Β· `LOCAL_SAFE_PARAMS` Β· `MIN_TOKENS_PER_SEC` metric Β· Async status probe |
| **Notifications** | `jh_notifications.py` β€” custom Toast with slide/fade animation, color coding, and audio in a dedicated thread |
| **Storage** | JSON in `%APPDATA%` Β· Resume history Β· PDF import with AI text extraction Β· Auto-cleanup logs (50 entry limit) |
| **Build** | `PyInstaller` Β· `jh_version.py` (single version source β†’ window titles + VERSIONINFO .exe) Β· `Self-Healing Refactor` in `build_exe.py` |

---

## πŸš€ Changelog

πŸ“¦ v2.0.1 β€” Major Update (Current)

* **[Architecture]** Global refactor with `jh_` prefix, unified `jh_version.py` module, Self-Healing build via `build_exe.py`.
* **[i18n]** Full interface localization (EN / RU) via `jh_i18n.py` with dynamic switching.
* **[Engine]** Custom exception hierarchy for precise UI responses to network failures, timeouts, rate limits, and parse errors.
* **[Engine]** 5-level cascading repair for malformed LLM JSON responses.
* **[Engine]** Native integration with Ollama and LM Studio: safe generation parameters, speed monitoring, failover between local models.
* **[Engine]** New filters: toxic work condition detection and geographic compliance.
* **[UI]** Resume history πŸ“‚ with direct PDF import and AI text extraction.
* **[UI]** Expanded model pool: Gemini 3.5/3.0, GPT-5, Claude 4, DeepSeek (chat/reasoner).
* **[UI]** Async local server status indicator.
* **[UI]** Smooth HiDPI window centering without flickering or micro-jumps.
* **[UI]** Dark title bar and window icon via Win32 API.
* **[UI]** Card signature caching β€” only changed cards are re-rendered.
* **[Notifications]** Custom Toast notifications: animation, audio, color coding.

πŸ“¦ v1.2.0

* **[Engine]** Multi-model `BaseProvider` architecture (Gemini, OpenAI, Anthropic, DeepSeek).
* **[Engine]** Failover Chain and automatic JSON repair.
* **[UI]** Dark CustomTkinter interface with full High-DPI support.
* **[UI]** Removed `grab_set()`, incremental list rendering.
* **[API]** Queue timeout manager (15s) with status bar.
* **[API]** Zombie-process killer on port 5000.
* **[Build]** `src/` structure, self-healing build module.

πŸ“¦ v1.1.0

* **[UI]** Quick-apply buttons ("Apply") in vacancy cards.
* **[UI]** Fixed `Ctrl+V`, `Ctrl+C`, `Ctrl+A` hotkeys on Russian keyboard layout.
* **[UI]** Smooth scrolling without graphical artifacts.
* **[UI]** Auto-reset scroll position when switching filters.

---

## πŸ—ΊοΈ Roadmap

🟒 v1.1.0 β€” UI & Keyboard Layout (Done)

- [x] UI optimization, scroll fix, hotkeys for Russian keyboard layout.

🟒 v1.2.0 β€” Multi-Provider (Done)

- [x] Modular engine, Failover Chain, cascading JSON parser, AI control panel.

🟒 v2.0.1 β€” Full Overhaul (Done)

- [x] Local AI via Ollama / LM Studio without API keys.
- [x] Full EN/RU interface localization.
- [x] Resume history and PDF import with AI text extraction.
- [x] Toast notifications with animation and audio.
- [x] HiDPI centering without flickering, dark Win32 title bar.
- [x] Toxic condition detection and geographic filter.
- [x] Self-Healing build, `jh_version.py`, refactor with `jh_` prefix.

---

## 🀝 Support the project

The project has reached its goals and is in a **stable state**.

If something breaks β€” open an Issue on GitHub, critical bugs will be fixed.

If the app helped you land a job β€” leave a star. It's free, and that's how good tools find the people who need them.



Star on GitHub

---


Made for people who value their time Β· Non-Commercial Β· v2.0.1