Skip to content

Add web UI and multi-platform job application automation#1156

Open
emirsaffar-collab wants to merge 17 commits intofeder-cr:mainfrom
emirsaffar-collab:claude/consolidate-tools-web-ui-l5jCO
Open

Add web UI and multi-platform job application automation#1156
emirsaffar-collab wants to merge 17 commits intofeder-cr:mainfrom
emirsaffar-collab:claude/consolidate-tools-web-ui-l5jCO

Conversation

@emirsaffar-collab
Copy link
Copy Markdown

Summary

This PR introduces a complete web-based interface and multi-platform job application automation system to AIHawk Resume Builder. The changes add a FastAPI web server with an embedded single-page application (SPA), Playwright-based browser automation for multiple job platforms, and a background bot manager for autonomous job applications.

Key Changes

Web Interface (src/web/)

  • ui.py: Embedded single-page HTML/CSS/JavaScript UI with 1681 lines of markup and styling

    • Tabs for Resume Generation, Resume Management, Settings, Auto Apply, and Application History
    • Real-time progress tracking with WebSocket support
    • Resume/cover letter generation with LLM provider selection (Claude, OpenAI, Gemini, Ollama)
    • Job application settings and preferences management
    • Application history and statistics dashboard
  • app.py: FastAPI web server (987 lines) providing:

    • REST endpoints for document generation, resume updates, settings management
    • WebSocket support for real-time progress updates during generation
    • YAML-based configuration persistence for work preferences and credentials
    • Job status tracking and download endpoints
    • Health check and platform availability endpoints
    • Validation of work preferences (experience levels, job types, date filters, blacklists)

Job Application Automation (src/automation/)

  • bot_manager.py: Global bot lifecycle manager

    • Start/stop/pause/resume control for the automation bot
    • Session-based tracking with statistics (applied, skipped, failed counts)
    • Async task-based execution with progress callbacks
    • Configuration snapshot passing to bot runs
  • application_tracker.py: SQLite-backed application history

    • Tracks all discovered and applied jobs with status, score, and timestamps
    • Prevents duplicate applications via URL uniqueness constraint
    • Thread-safe connection pooling with WAL mode for concurrent access
  • job_ranker.py: LLM-based job fit scoring

    • Evaluates resume-to-job-description match on 1-10 scale
    • Considers technical skills, experience level, and role alignment
    • Provides scoring rationale for user review
  • browser.py: Playwright browser lifecycle manager

    • Persistent Chromium browser context with cookie storage
    • Per-platform cookie persistence for maintaining login sessions
    • Headless/headed mode support

Platform Handlers (src/automation/platforms/)

  • base.py: Abstract base class defining platform interface

    • JobListing and ApplyResult dataclasses
    • Common methods for login, job search, and application
  • linkedin.py: LinkedIn Easy Apply automation (524 lines)

    • Login with 2FA/security challenge handling
    • Job search with filters (experience level, job type, date, location)
    • Easy Apply form filling and submission
    • Blacklist support for companies and job titles
  • indeed.py: Indeed Quick Apply automation

    • Multi-step login flow
    • Job search and quick apply handling
  • glassdoor.py: Glassdoor Easy Apply automation

    • Login and job search
    • Easy Apply form submission
  • ziprecruiter.py: ZipRecruiter 1-click Apply automation

    • Login and job search
    • 1-click apply processing
  • dice.py: Dice.com job application automation

    • Login and job search
    • Application submission
  • universal.py: AI-driven universal form filling

    • Applies to any career page URL
    • LLM-guided form detection and filling
    • Fallback for platforms without dedicated handlers
  • init.py: Platform registry mapping names to handler classes

Configuration & Deployment

  • main.py: Updated entry point to support python main.py web for launching the web server
  • config.py: Enhanced with environment variable support for log level
  • Dockerfile: Container image for deployment with Python 3.11, Chrome, and Playwright
  • railway.json: Railway.app deployment configuration
  • Procfile: Heroku deployment configuration
  • data_folder_example/credentials.yaml: Template for platform credentials

Dependencies

  • Added FastAPI, Uvicorn, and Pydantic for web server
  • Added Playwright for cross-browser automation

https://claude.ai/code/session_01Hj2PkVwtfbP7TX9W7foeQs

railway-app bot and others added 17 commits April 3, 2026 17:10
Fix Python 3.13 compatibility: upgrade Levenshtein
…ss, and Railway deployment

Agent-Logs-Url: https://github.com/emirsaffar-collab/Jobs_Applier_AI_Agent_AIHawk/sessions/fb01ed93-4579-4ff1-9531-a9dc19bca942

Co-authored-by: emirsaffar-collab <79217569+emirsaffar-collab@users.noreply.github.com>
…ghtweight startup

Agent-Logs-Url: https://github.com/emirsaffar-collab/Jobs_Applier_AI_Agent_AIHawk/sessions/fb01ed93-4579-4ff1-9531-a9dc19bca942

Co-authored-by: emirsaffar-collab <79217569+emirsaffar-collab@users.noreply.github.com>
…-and-async-doc-gen

Add web UI with async document generation and Railway deployment
…ition-from-dockerfile

fix: add git to Dockerfile for pip git+ dependency
Add GET/PUT /api/preferences for managing work_preferences.yaml
Add GET/PUT /api/resume for managing plain_text_resume.yaml
Add WorkPreferences Pydantic models with YAML round-trip support
Add validation matching ConfigValidator rules from main.py
Ensure data_folder exists when generating documents

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

Co-authored-by: emirsaffar-collab <79217569+emirsaffar-collab@users.noreply.github.com>
Rewrite the web UI to use a 3-tab interface:
- Generate tab: existing LLM config, action selection, progress tracking
- Resume tab: YAML editor with load/save to server via /api/resume
- Settings tab: work preferences form with all fields from
  work_preferences.yaml, including checkboxes, radio buttons,
  tag-style list inputs, and load/save via /api/preferences

The resume textarea moves from the Generate tab to the Resume tab.
The Generate tab shows a preview snippet and a hint to edit in the
Resume tab.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

Co-authored-by: emirsaffar-collab <79217569+emirsaffar-collab@users.noreply.github.com>
- Add GET/PUT /api/preferences endpoints for work_preferences.yaml
- Add GET/PUT /api/resume endpoints for plain_text_resume.yaml
- Add Pydantic models for work preferences with validation
- Rewrite web UI with 3-tab interface: Generate, Resume, Settings
- Settings tab has all work_preferences fields (experience levels, job types, date filters, positions, locations, distance, blacklists)
- Resume tab has YAML editor with load/save to server
- Tag-style inputs for list fields (positions, locations, blacklists)

Agent-Logs-Url: https://github.com/emirsaffar-collab/Jobs_Applier_AI_Agent_AIHawk/sessions/8bc96b32-5cbc-4ced-b5ee-0dc6af3a4a1e

Co-authored-by: emirsaffar-collab <79217569+emirsaffar-collab@users.noreply.github.com>
- Allow missing keys in preferences validation (don't fail on absent fields)
- Restore original plain_text_resume.yaml and work_preferences.yaml
- Change example load message to clarify it's not saved to server
- Add info CSS class for status messages

Agent-Logs-Url: https://github.com/emirsaffar-collab/Jobs_Applier_AI_Agent_AIHawk/sessions/8bc96b32-5cbc-4ced-b5ee-0dc6af3a4a1e

Co-authored-by: emirsaffar-collab <79217569+emirsaffar-collab@users.noreply.github.com>
…ctionality

Merge all CLI config functionality into the web UI
Merges capabilities from 5+ open-source job application repos into one
web UI, adding automated job search and Easy Apply across LinkedIn,
Indeed, Glassdoor, ZipRecruiter, Dice, and universal career pages.

Key additions:
- src/automation/: new Playwright-based automation module
  - browser.py: Chromium lifecycle + per-platform cookie persistence
  - bot_manager.py: singleton start/stop/pause bot controller
  - job_ranker.py: LLM-based job fit scoring (1-10, reuses llm_manager)
  - application_tracker.py: SQLite history (discovered/scored/applied/skipped/failed)
  - platforms/: LinkedIn, Indeed, Glassdoor, ZipRecruiter, Dice, Universal handlers
- src/web/app.py: new /api/bot/* and /api/applications/* endpoints + /ws/bot
- src/web/ui.py: two new tabs — "Auto Apply" (bot control + live log) and
  "Applications" (full history table with filters + CSV export)
- data_folder_example/credentials.yaml: per-platform credential template
- .gitignore: exclude credentials.yaml, applications.db, cookies/
- requirements.txt: add playwright + aiosqlite

Setup: pip install -r requirements.txt && playwright install chromium

Reference repos studied: Pickle-Pixel/ApplyPilot, GodsScion/Auto_job_applier_linkedIn,
wodsuz/EasyApplyJobsBot, NathanDuma/LinkedIn-Easy-Apply-Bot

https://claude.ai/code/session_01Hj2PkVwtfbP7TX9W7foeQs
@emirsaffar-collab emirsaffar-collab marked this pull request as draft April 3, 2026 19:23
@emirsaffar-collab emirsaffar-collab marked this pull request as ready for review April 3, 2026 19:23
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants