SKIP TO CONTENT
All projects
Automation & Applied AI PipelineAutonomous Job-Discovery, Multi-Resume Scorer & ATS Classifier

Job Agent

End-to-end internship discovery platform aggregating 8+ ATS feeds, deterministic 0–100 multi-resume scoring, 12-class Gmail OAuth sync, and guarded Playwright runners.

Timeline
Feb 2026 — Present
Stack
Next.js · React · TypeScript · Tailwind CSS · Node.js · Express.js · REST APIs · PostgreSQL · Prisma · Playwright

The problem

Hunting for software engineering internships across dozens of ATS boards and tracking hundreds of recruiter emails manually wastes hours — while naive LLM auto-appliers hallucinate skills and corrupt pipeline state.

  • Different roles (Backend, Full-Stack, AI/ML, Systems) require matching against different resume variants with transparent, reproducible scores.
  • Recruiter emails arrive out of order (e.g., an auto-ack arriving after an OA invite), which breaks naive status updaters.
  • Browser automation against live ATS forms must default to safe dry-runs with human review.

How it works

  1. 01

    8+ ATS collectors & deduplication

    Aggregated job feeds from Greenhouse, Lever, Ashby, Workday, and curated boards into a unified Prisma/PostgreSQL schema.
  2. 02

    0–100 deterministic multi-resume scorer

    Scored every role against multiple uploaded resumes using a deterministic weighted rubric (+35 skills, +20 role match, +15 domain, +10 stack, +10 location, +10 level, minus penalties) before optional LLM explanation.
  3. 03

    12-class Gmail OAuth state machine

    Synced recruiter threads via Gmail OAuth and classified emails into 12 categories with strict forward-only stage progression (SAVED → APPLIED → SCREENING → OA → INTERVIEW → OFFER).
  4. 04

    Guarded Playwright runner with SSE logs

    Built a dry-run-by-default Playwright automation engine that fills ATS forms, captures screenshots, and streams step-by-step SSE logs to a 7-tab Next.js 16 dashboard.

Architecture

From 8+ ATS feeds and Gmail OAuth threads to deterministic resume scoring and guarded Playwright runs.

8+ ATS FEEDSGreenhouse · LeverGMAIL OAUTHRecruiter ThreadsRESUME SCORER0–100 Deterministic12-CLASS NLPForward-Only StatePOSTGRESQLPrisma ModelsNEXT.JS 16 UI7-Tab WorkspacePLAYWRIGHTDry-Run + SSE
  1. 01
    Ingest ATS boards & Gmail

    Public ATS endpoints and Gmail OAuth threads sync into the Express 5 backend.

  2. 02
    Deterministic 0–100 multi-resume rubric

    Each posting is scored against every resume variant to pick the highest-fit CV.

  3. 03
    12-class email state machine

    Confirmation, OA, interview, and offer emails advance application stages monotonically.

  4. 04
    Unified PostgreSQL state

    Jobs, resume scores, email threads, and run logs persist via Prisma.

  5. 05
    7-tab Next.js 16 control center

    Review ranked jobs, inspect score breakdowns, and trigger automation runs.

  6. 06
    Guarded Playwright execution

    Browser runners prefill ATS forms in dry-run mode and stream live SSE telemetry.

System capabilities

deterministic weighted multi-resume scoring rubric
100-pt
Gmail recruiter email classification categories
12
ATS job sources aggregated automatically
8+
interactive workspace tabs in Next.js 16
7

Technical deep dive

Complete system specification, schemas, and implementation notes.

Stop losing track of internship applications across 15 browser tabs. Job Agent is a self-hosted job-discovery, deterministic resume-scoring, Gmail ATS classifier, and guarded Playwright auto-apply system built for software engineering roles.

The Problem

Applying for software engineering internships means checking dozens of company career boards (Greenhouse, Lever, Ashby, Workable), parsing noisy job-alert emails, tailoring multiple resume variants (Backend vs. Full-Stack), tracking recruiter replies in Gmail, and filling repetitive Wellfound forms. Manual tracking leads to missed OA deadlines and stale follow-ups.

The Outcome

A unified, local-first command center (Express 5 + PostgreSQL + Next.js 16) that ingests verified ATS job feeds, scores every role deterministically (0–100) against your multiple resumes, classifies incoming Gmail recruiter/ATS threads into 12 states, and generates a daily 20:00 IST briefing.

How It Works (The Mechanism)

  1. Multi-ATS Ingestion & Liveness Probing: Polls official public APIs across Greenhouse, Lever, Ashby, SmartRecruiters, Workable, Remotive, Remote OK, and Arbeitnow, plus local Gmail job-alert parsers. Automatically closes stale listings on 404/410 or consecutive missing syncs.
  2. Deterministic Multi-Resume Scoring (0–100): Evaluates every listing against all uploaded resume variants (e.g., Full-Stack vs. AI/Backend) using word-boundary skill matching, alias resolution (Java != JavaScript, intern != international), seniority penalties, graduation-year alignment, and recency decay.
  3. 12-Class Gmail OAuth State Machine: Incrementally syncs read-only Gmail threads and classifies emails into 12 categories (OA/Assessment, Interview, Offer, Rejection, Recruiter Outreach, etc.) with ATS-sender awareness—advancing pipeline stages strictly forward-only.
  4. Guarded Playwright Runner: Automates Wellfound applications through your authenticated Chrome session with a strict DRY_RUN default, daily IST rate caps, live SSE log streaming, and failure trace/screenshot capture.

Architecture & System Design


Key Engineering Decisions

  • Deterministic Word-Boundary Scoring Over Opaque LLM Ranking: LLM-based job scoring is slow, expensive, and hallucinates matches. Job Agent uses a fast, deterministic 0–100 scoring engine with regex word boundaries, synonym maps, and explicit point breakdowns (Resume Match: 45, Alumni Presence: 20, Contacts: 10, Freshness: 10, Stage: 10, Email Activity: 5).
  • Forward-Only Idempotent Pipeline Transitions: Automated email syncs and CSV imports can never accidentally move an application backward or overwrite a terminal state (Offered, Rejected, Archived). Every state mutation is recorded in an immutable audit log.
  • Safety-First Browser Automation: The Playwright Wellfound runner defaults to DRY_RUN mode and requires an explicit confirmLive: true payload plus typing APPLY in the UI before submitting real applications, capturing full HTML/screenshot diagnostics on any DOM selector failure.

The Value Stack

  • Backend: Node.js, Express 5, TypeScript, Prisma ORM, PostgreSQL, Google Gmail OAuth2 API, Google Gemini API.
  • Frontend: Next.js 16, React 19, Tailwind CSS 4, Server-Sent Events (SSE).
  • Automation & Tooling: Playwright, Docker Compose, Vitest.

The Proof

  • Built a 7-tab full-stack operations dashboard integrating 8+ public ATS APIs and real-time Gmail OAuth synchronization.
  • Engineered a 12-class ATS email classifier and multi-resume scoring engine with zero-hallucination deterministic explanations.
Next case studyGoLakeScannerTwo-phase incremental data-lake scanner in Go with a generic bounded worker pool, SHA-256 change detection, per-file context timeouts, and pgx/v5 PostgreSQL cataloging.