{"id":51187796,"url":"https://github.com/eric-esoteric/job-hunter-ai","last_synced_at":"2026-06-27T12:01:10.859Z","repository":{"id":367018741,"uuid":"1278874567","full_name":"eric-esoteric/job-hunter-ai","owner":"eric-esoteric","description":"🎯 Job Hunter AI — персональный ИИ-ассистент для автоматического отсева вакансий и генерации сопроводительных писем.","archived":false,"fork":false,"pushed_at":"2026-06-24T10:10:39.000Z","size":9,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-24T10:12:10.052Z","etag":null,"topics":["ai","automation","chrome-extension","gemini","job-search","parser","python","tkinter","webhooks"],"latest_commit_sha":null,"homepage":"","language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/eric-esoteric.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-06-24T07:08:04.000Z","updated_at":"2026-06-24T10:10:47.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/eric-esoteric/job-hunter-ai","commit_stats":null,"previous_names":["mashamashavishnya/eric-esoteric-developer"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/eric-esoteric/job-hunter-ai","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eric-esoteric%2Fjob-hunter-ai","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eric-esoteric%2Fjob-hunter-ai/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eric-esoteric%2Fjob-hunter-ai/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eric-esoteric%2Fjob-hunter-ai/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/eric-esoteric","download_url":"https://codeload.github.com/eric-esoteric/job-hunter-ai/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eric-esoteric%2Fjob-hunter-ai/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34852282,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-27T02:00:06.362Z","response_time":126,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ai","automation","chrome-extension","gemini","job-search","parser","python","tkinter","webhooks"],"created_at":"2026-06-27T12:01:07.915Z","updated_at":"2026-06-27T12:01:10.842Z","avatar_url":"https://github.com/eric-esoteric.png","language":null,"funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"right\"\u003e\n  \u003ca href=\"README.md\"\u003e🇬🇧 English\u003c/a\u003e | \u003ca href=\"README.ru.md\"\u003e🇷🇺 Русский\u003c/a\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"assets/logo.png\" width=\"140\" alt=\"Job Hunter AI Logo\"\u003e\n\u003c/p\u003e\n\n\u003ch1 align=\"center\"\u003eJob Hunter AI\u003c/h1\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cstrong\u003eYour personal AI recruiter, working for you 24/7\u003c/strong\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/Python-3.10+-3670A0?style=flat\u0026logo=python\u0026logoColor=ffdd54\" alt=\"Python\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/Release-v2.0.1-00B981?style=flat\" alt=\"Release\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/Platform-Windows-0078D4?style=flat\u0026logo=windows\" alt=\"Platform\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/License-Non--Commercial-EF4444?style=flat\" alt=\"License\"\u003e\n\u003c/p\u003e\n\n---\n\n**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.\n\n\u003cbr\u003e\n\n\u003ctable width=\"100%\"\u003e\n  \u003ctr\u003e\n    \u003ctd width=\"60%\" valign=\"top\"\u003e\n      \u003ch3\u003e⚡ Why this will change your routine\u003c/h3\u003e\n      \u003cul\u003e\n        \u003cli\u003e💰 \u003cb\u003e100% Free\u003c/b\u003e — runs on your own API keys, including the free Gemini tier\u003c/li\u003e\n        \u003cli\u003e🛡️ \u003cb\u003eHard filter — up to 60%\u003c/b\u003e — scam, MLM, 60h/week slavery, and info-business don't get through\u003c/li\u003e\n        \u003cli\u003e✍️ \u003cb\u003eCover letter in seconds\u003c/b\u003e — a personalized response matched to the exact job requirements\u003c/li\u003e\n        \u003cli\u003e🌐 \u003cb\u003eCloud or your PC\u003c/b\u003e — Gemini, GPT-5, Claude 4 \u003ci\u003eor\u003c/i\u003e locally via Ollama / LM Studio\u003c/li\u003e\n        \u003cli\u003e🔒 \u003cb\u003eFull privacy\u003c/b\u003e — with local AI, your data never leaves your machine\u003c/li\u003e\n        \u003cli\u003e🌍 \u003cb\u003eEN / RU\u003c/b\u003e — fully localized interface, language persists between sessions\u003c/li\u003e\n      \u003c/ul\u003e\n    \u003c/td\u003e\n    \u003ctd width=\"40%\" align=\"center\" valign=\"middle\"\u003e\n      \u003cimg src=\"assets/1.png\" width=\"320\" alt=\"Job Hunter AI Interface\"\u003e\n    \u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\n\u003cbr\u003e\n\u003chr\u003e\n\n## ⚙️ Quick Start\n\nInstall the desktop application and the Chrome extension. Full step-by-step guide:\n\n[![Installation Guide](https://img.shields.io/badge/⚙️_Setup-Read_the_guide-00B981?style=for-the-badge\u0026logo=readme)](docs/INSTALL.md)\n\n\u003chr\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003e✨ Full feature breakdown\u003c/b\u003e\u003c/summary\u003e\n\n\u003cbr\u003e\n\n\u003ctable width=\"100%\"\u003e\n  \u003ctr\u003e\n    \u003ctd width=\"60%\" valign=\"top\"\u003e\n      \u003cb\u003e🧠 Multi-engine AI cascade with Failover\u003c/b\u003e\u003cbr\u003e\n      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.\n      \u003cbr\u003e\u003cbr\u003e\n      \u003cb\u003e🏠 Local AI — no internet, no API keys\u003c/b\u003e\u003cbr\u003e\n      Native HTTP integration with Ollama and LM Studio. A background probe monitors server availability and reflects status in the UI (neon cyan / muted red). \u003ccode\u003eLOCAL_SAFE_PARAMS\u003c/code\u003e compensate for artifacts in quantized 4-bit models.\n    \u003c/td\u003e\n    \u003ctd width=\"40%\" align=\"center\" valign=\"middle\"\u003e\n      \u003cimg src=\"assets/2.png\" width=\"320\" alt=\"Job Analysis\"\u003e\n    \u003c/td\u003e\n  \u003c/tr\u003e\n\n  \u003ctr\u003e\n    \u003ctd width=\"60%\" valign=\"top\"\u003e\n      \u003cb\u003e🛡️ Two-stage AI analysis\u003c/b\u003e\u003cbr\u003e\n      \u003cb\u003eStage 1 — Filter:\u003c/b\u003e Detects scam, MLM, toxic work conditions (\u003e45h/week, uncompensated night shifts, info-business, mass hiring). Plus geographic compliance — filters out offers that prohibit remote work from your country.\u003cbr\u003e\n      \u003cb\u003eStage 2 — Cover letter:\u003c/b\u003e Only for approved listings. A targeted response addressing the employer's real pain points — no filler, no templates.\n      \u003cbr\u003e\u003cbr\u003e\n      \u003cb\u003e🔧 5-level JSON repair pipeline\u003c/b\u003e\u003cbr\u003e\n      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.\n    \u003c/td\u003e\n    \u003ctd width=\"40%\" align=\"center\" valign=\"middle\"\u003e\n      \u003cimg src=\"assets/3.png\" width=\"320\" alt=\"Filtering\"\u003e\n    \u003c/td\u003e\n  \u003c/tr\u003e\n\n  \u003ctr\u003e\n    \u003ctd width=\"60%\" valign=\"top\"\u003e\n      \u003cb\u003e📄 Resume history and PDF import\u003c/b\u003e\u003cbr\u003e\n      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.\n      \u003cbr\u003e\u003cbr\u003e\n      \u003cb\u003e🔔 Telegram-style toast notifications\u003c/b\u003e\u003cbr\u003e\n      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.\n    \u003c/td\u003e\n    \u003ctd width=\"40%\" align=\"center\" valign=\"middle\"\u003e\n      \u003cimg src=\"assets/4.png\" width=\"320\" alt=\"Interface\"\u003e\n    \u003c/td\u003e\n  \u003c/tr\u003e\n\n  \u003ctr\u003e\n    \u003ctd width=\"60%\" valign=\"top\"\u003e\n      \u003cb\u003e🌍 Full localization (EN / RU)\u003c/b\u003e\u003cbr\u003e\n      Language is switched in settings and saved to \u003ccode\u003econfig.json\u003c/code\u003e. The entire interface — buttons, messages, errors, counters — passes through a single \u003ccode\u003ejh_i18n.py\u003c/code\u003e module with named variable substitution.\n      \u003cbr\u003e\u003cbr\u003e\n      \u003cb\u003e⚡ Flicker-free smart UI\u003c/b\u003e\u003cbr\u003e\n      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.\n    \u003c/td\u003e\n    \u003ctd width=\"40%\" align=\"center\" valign=\"middle\"\u003e\n      \u003cimg src=\"assets/5.png\" width=\"320\" alt=\"Results\"\u003e\n    \u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\n\u003cbr\u003e\n\n\u003c/details\u003e\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003e🗺️ Architecture diagram (How it works under the hood)\u003c/summary\u003e\n\u003cbr\u003e\n\u003cpre\u003e\n ┌────────────────────────────────────────┐\n │            CHROME BROWSER              │\n │  (User clicks in the extension)        │\n └───────────────────┬────────────────────┘\n                     │ HTTP POST ( vacancy_data )\n                     ▼\n ┌────────────────────────────────────────┐\n │          LOCAL FLASK API               │  [main_app.py]\n │ (Kills zombie processes on port 5000)  │  jh_version.py → build metadata\n └───────────────────┬────────────────────┘\n                     │ Enqueues task (.put)\n                     ▼\n ┌────────────────────────────────────────┐\n │        THREAD-SAFE QUEUE               │  [queue.Queue]\n │   15s Timer | Rate Limit Guard         │  Countdown status bar\n └───────────────────┬────────────────────┘\n                     │ Background thread → task\n                     ▼\n ┌────────────────────────────────────────┐\n │        MULTI-ENGINE AI CASCADE         │  [src/jh_ai_engine.py]\n │  Gemini 3.5 ➔ GPT-5 ➔ Claude 4 ➔      │  Failover Chain\n │  DeepSeek ➔ Ollama ➔ LM Studio        │  5-level JSON repair\n │                                        │  Exception hierarchy\n └──────────┬─────────────────┬───────────┘  LOCAL_SAFE_PARAMS\n            │                 │\n    ┌───────▼───────┐  ┌──────▼──────────┐\n    │    STAGE 1    │  │    STAGE 2      │\n    │  Hard filter  │  │  Cover letter   │\n    │   (up to 60%) │  │  generation     │\n    │ Toxic cond.   │  │  (approved only)│\n    │ Geo-compliance│  └──────┬──────────┘\n    └──────┬────────┘         │\n           │ REJECTED         │ APPROVED\n           └────────┬─────────┘\n                    ▼\n ┌────────────────────────────────────────┐\n │          JH STORAGE MANAGER            │  [src/jh_storage_manager.py]\n │    AppData/Roaming/Job Hunter AI/      │  Resume history | PDF import\n └───────────────────┬────────────────────┘  Log: max 50 entries\n                     ▼\n ┌────────────────────────────────────────┐\n │          JH UI + NOTIFICATIONS         │  [src/jh_results_ui.py]\n │  Signature cache | HiDPI | Dark Win32  │  [src/jh_notifications.py]\n │  Hotkeys (RU/EN keyboard layouts)      │  Toast animations | Audio thread\n └─────────────────┬──────────────────────┘\n                   │\n        ┌──────────▼──────────┐\n        │   jh_i18n.py (EN/RU)│  Declarative localization\n        └─────────────────────┘\n\u003c/pre\u003e\n\u003c/details\u003e\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003e🛠️ Tech Stack\u003c/b\u003e\u003c/summary\u003e\n\u003cbr\u003e\n\n| Layer | Tools |\n|---|---|\n| **GUI \u0026 OS** | `customtkinter` · `Pillow` · `ctypes` Win32 API — dark title bar, `WM_SETICON`, DPI Awareness, cross-layout hotkeys |\n| **Localization** | `jh_i18n.py` — declarative EN/RU system with named variable substitution via `tr(key, **kwargs)` |\n| **Local API** | `Flask` · `flask-cors` · `threading` · `queue.Queue` — thread-safe webhook receiver from Chrome |\n| **AI Cascade** | **Gemini 3.5/3.0** · **GPT-5 / o3** · **Claude 4** · **DeepSeek** (chat / reasoner) · **Ollama** · **LM Studio** |\n| **Resilience** | Failover Chain · Exponential Backoff · 5-level JSON parser · Exception hierarchy (`AINetworkError`, `AILocalServerError`, `AITimeoutError`, `AIAuthError`, `AIRateLimitError`) |\n| **Local AI** | HTTP integration Ollama / LM Studio · `LOCAL_SAFE_PARAMS` · `MIN_TOKENS_PER_SEC` metric · Async status probe |\n| **Notifications** | `jh_notifications.py` — custom Toast with slide/fade animation, color coding, and audio in a dedicated thread |\n| **Storage** | JSON in `%APPDATA%` · Resume history · PDF import with AI text extraction · Auto-cleanup logs (50 entry limit) |\n| **Build** | `PyInstaller` · `jh_version.py` (single version source → window titles + VERSIONINFO .exe) · `Self-Healing Refactor` in `build_exe.py` |\n\n\u003c/details\u003e\n\n---\n\n## 🚀 Changelog\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003e📦 v2.0.1 — Major Update (Current)\u003c/b\u003e\u003c/summary\u003e\n\n* **[Architecture]** Global refactor with `jh_` prefix, unified `jh_version.py` module, Self-Healing build via `build_exe.py`.\n* **[i18n]** Full interface localization (EN / RU) via `jh_i18n.py` with dynamic switching.\n* **[Engine]** Custom exception hierarchy for precise UI responses to network failures, timeouts, rate limits, and parse errors.\n* **[Engine]** 5-level cascading repair for malformed LLM JSON responses.\n* **[Engine]** Native integration with Ollama and LM Studio: safe generation parameters, speed monitoring, failover between local models.\n* **[Engine]** New filters: toxic work condition detection and geographic compliance.\n* **[UI]** Resume history 📂 with direct PDF import and AI text extraction.\n* **[UI]** Expanded model pool: Gemini 3.5/3.0, GPT-5, Claude 4, DeepSeek (chat/reasoner).\n* **[UI]** Async local server status indicator.\n* **[UI]** Smooth HiDPI window centering without flickering or micro-jumps.\n* **[UI]** Dark title bar and window icon via Win32 API.\n* **[UI]** Card signature caching — only changed cards are re-rendered.\n* **[Notifications]** Custom Toast notifications: animation, audio, color coding.\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003e📦 v1.2.0\u003c/b\u003e\u003c/summary\u003e\n\n* **[Engine]** Multi-model `BaseProvider` architecture (Gemini, OpenAI, Anthropic, DeepSeek).\n* **[Engine]** Failover Chain and automatic JSON repair.\n* **[UI]** Dark CustomTkinter interface with full High-DPI support.\n* **[UI]** Removed `grab_set()`, incremental list rendering.\n* **[API]** Queue timeout manager (15s) with status bar.\n* **[API]** Zombie-process killer on port 5000.\n* **[Build]** `src/` structure, self-healing build module.\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003e📦 v1.1.0\u003c/b\u003e\u003c/summary\u003e\n\n* **[UI]** Quick-apply buttons (\"Apply\") in vacancy cards.\n* **[UI]** Fixed `Ctrl+V`, `Ctrl+C`, `Ctrl+A` hotkeys on Russian keyboard layout.\n* **[UI]** Smooth scrolling without graphical artifacts.\n* **[UI]** Auto-reset scroll position when switching filters.\n\n\u003c/details\u003e\n\n---\n\n## 🗺️ Roadmap\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003e🟢 v1.1.0 — UI \u0026 Keyboard Layout (Done)\u003c/b\u003e\u003c/summary\u003e\n\n- [x] UI optimization, scroll fix, hotkeys for Russian keyboard layout.\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003e🟢 v1.2.0 — Multi-Provider (Done)\u003c/b\u003e\u003c/summary\u003e\n\n- [x] Modular engine, Failover Chain, cascading JSON parser, AI control panel.\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003e🟢 v2.0.1 — Full Overhaul (Done)\u003c/b\u003e\u003c/summary\u003e\n\n- [x] Local AI via Ollama / LM Studio without API keys.\n- [x] Full EN/RU interface localization.\n- [x] Resume history and PDF import with AI text extraction.\n- [x] Toast notifications with animation and audio.\n- [x] HiDPI centering without flickering, dark Win32 title bar.\n- [x] Toxic condition detection and geographic filter.\n- [x] Self-Healing build, `jh_version.py`, refactor with `jh_` prefix.\n\n\u003c/details\u003e\n\n---\n\n## 🤝 Support the project\n\nThe project has reached its goals and is in a **stable state**.\n\nIf something breaks — open an Issue on GitHub, critical bugs will be fixed.\n\nIf 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.\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://github.com/eric-esoteric/job-hunter-ai\"\u003e\n    \u003cimg src=\"https://img.shields.io/badge/⭐_Star_on-GitHub-181717?style=for-the-badge\u0026logo=github\" alt=\"Star on GitHub\"\u003e\n  \u003c/a\u003e\n\u003c/p\u003e\n\n---\n\n\u003cp align=\"center\"\u003e\n  \u003csub\u003eMade for people who value their time · Non-Commercial · v2.0.1\u003c/sub\u003e\n\u003c/p\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Feric-esoteric%2Fjob-hunter-ai","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Feric-esoteric%2Fjob-hunter-ai","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Feric-esoteric%2Fjob-hunter-ai/lists"}