Inspiration

Job hunting is a grind. I was receiving 30–40 job-related emails every day — each one asking for the same details: skills, experience, salary expectation, relocation preference. Typing the same answers into different systems (email replies, Naukri chatbots, company portals) was
eating hours of my week. I wanted an agent that could read the emails, decide what to do, and execute — with me just reviewing and approving.

What it does

Job Application Agent connects to your Gmail or Yahoo inbox, fetches unread job emails, and uses Claude AI to classify each one into four
categories: send an email reply, drive a Naukri chatbot automatically, hand off a company portal link for manual completion, or flag as low confidence for review. You see all emails on a dashboard, review the AI-generated reply or chatbot answers, and hit Approve. The agent
executes immediately — replies go via SMTP, Naukri chatbots are driven by Playwright in a visible browser so you can watch and intervene, and everything is logged to SQLite.

How we built it

  • Python + Flask for the web app and routing
    • Claude API (Sonnet 4.6) for email classification, reply generation, and dynamic Q&A mapping for Naukri chatbots
    • imaplib / smtplib (Python built-ins) for email fetch and send
    • Playwright for visible browser automation of Naukri chatbots
    • pdfplumber + python-docx for resume parsing
    • SQLite for persistent application logging
    • python-dotenv for credential management
    • Deployed on Railway with GitHub integration
      ## Challenges we ran into
    • Naukri chatbot variability — every employer's chatbot has a slightly different DOM. We solved this with broad fallback selectors and a
      visible browser so the user can catch unexpected layouts.
    • Railway SMTP restriction — Railway blocks outbound SMTP on the free tier. Email reply sending works locally; the deployed demo shows
      classification, review workflow, and logging.
    • Claude response parsing — getting Claude to return clean JSON consistently required defensive parsing (stripping markdown fences, handling edge cases).
    • Session state management — job cards are held in Flask session; a server restart clears them. Acceptable for local use — the user just hits Refresh again.
      ## Accomplishments that we're proud of
  • The routing intelligence works well — Claude correctly distinguishes reply vs. Naukri vs. portal vs. low confidence across real job emails
    • The full review loop (Approve / Edit / Skip) feels smooth — edit regenerates content inline without leaving the dashboard
    • Resume upload → Claude extraction → profile.json → used in every reply and chatbot answer is a clean end-to-end flow
    • The app is plug-and-play: pip install -r requirements.txt + playwright install chromium + python run.py — works on Mac and Windows
      ## What we learned
    • Claude is surprisingly good at mapping resume fields to chatbot questions dynamically — no hardcoded question matching needed
    • Playwright's visible browser mode is the right call for automation you want to monitor and debug
    • Building spec-first (scope → PRD → spec → checklist → build) made the implementation straightforward — almost no rework
    • The hardest part of agentic automation isn't the AI — it's handling the variability of real-world web pages

-New learning for me

What's next for Job Application Agent

  • Naukri bot hardening — test against more real chatbot layouts and refine selectors based on actual usage
  • SendGrid integration — replace SMTP with SendGrid HTTP API so email replies work on the deployed version
  • Outlook support — the code is structured to add new providers; OAuth flow is the remaining piece
  • Fit scoring — rate job relevance before presenting it for review, so the most relevant emails surface first
  • Follow-up reminders — track reply cadence after applications are sent
  • Company portal automation — Workday and Greenhouse each need custom handling; viable as a next sprint

Built With

Share this project:

Updates